Forum: Mikrocontroller und Digitale Elektronik Lichtschranke_in C_Dämpfung


von programmiernoob (Gast)


Lesenswert?

Hallo Team,

ich habe zwei Lichtschranken. Diese kann ich auch perfekt einlesen.
Mein "Programm in C" besteht Grundsätzlich aus if-Schleifen in der ich 
Und-Oder Befehle verarbeite.

Ich habe es so programmiert: Wenn beide Lichtschranken unter einem Wert 
X liegen, passiert etwas. Wenn mindestens eine Lichtschranke über den 
Wert X liegt, passiert etwas anderes.

Nun folgendes Problem: Den Bereich den meine Lichtschranken einlesen, 
ist nicht immer zu 100% spiegelnd (Unebenheiten). Quasi, dass zum 
Beispiel eine Lichtschranke für eine sehr kurze Zeit über dem Wert X 
ist.

Ich will es nun so Programmieren, dass die Lichtschranken mindestens 
eine Zeit T(zum Beispiel mindestens 100ms) betätigt/unbetätigt sein 
müssen, damit meine if-Schleifen erst reagieren.

Ich habe gar keine Ahnung, wo nach ich "googlen" müsste oder wie ich es 
Anstellen könnte.
(Ich hoffe ich habe es nicht zu allgemein geschrieben, dass man nichts 
mehr versteht:/)
Danke für mögliche Antworten!:D

von Jim M. (turboj)


Lesenswert?

Das problem ist derart allgemein und unkonkret formuliert das eine Hilf 
unmöglich ist. Meine Glaskugel sagt: Gugst Du Timer.

von Wolfgang (Gast)


Lesenswert?

Oder guckst du "Zustandsautomat" oder "FSM" und liest über Timer 
gesteuert regelmäßig den Zustand (was auch immer X ist, Zeit oder 
Pegel?) deiner Lichtschranken ein.

von Falk B. (falk)


Lesenswert?

@ programmiernoob (Gast)

>ich habe zwei Lichtschranken. Diese kann ich auch perfekt einlesen.

Aha.

>Mein "Programm in C" besteht Grundsätzlich aus if-Schleifen

Das wage ich zu bezweiflen.

http://www.if-schleife.de/

> in der ich
>Und-Oder Befehle verarbeite.

Nennt sich Bitmanipulation.

>Ich habe es so programmiert: Wenn beide Lichtschranken unter einem Wert
>X liegen, passiert etwas. Wenn mindestens eine Lichtschranke über den
>Wert X liegt, passiert etwas anderes.

Komisch. Lichtschranken sind im Normalfall digital, genauer, binär. Da 
gibt es nur 1 oder 0 und keine Zwischenstufen.

>Ich will es nun so Programmieren, dass die Lichtschranken mindestens
>eine Zeit T(zum Beispiel mindestens 100ms) betätigt/unbetätigt sein
>müssen, damit meine if-Schleifen erst reagieren.

Nennt sich Entprellung und ist vermutlich besser in der Hardware 
aufgehoben.

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

a)
"if" bildet keine Schleife in C, im Gegensatz zu "for", "do" oder 
"while"

b)
Der Ansatz mit zeitlichen Verzögerungen zu arbeiten ist bei diese 
Problemstellung (verrauschtes Eingangssignal) nicht unbedingt das Beste.

Besser ist es mit einer Hysterese bei den Eingangsdaten zu arbeiten.
D.h. du definierst nicht nur einen Schwellwert "X", sondern zwei, die 
einen gewissen Abstand voneinander haben ("threshold_high", 
"threshold_low").

Das ganze sieht dann exemplarisch so aus:
1
if (adc_value > threshold_high)
2
  state = 1;
3
else if (adc_value < threshold_low)
4
  state = 0;

Im Bereich zwischen "threshold_high" und "threshold_low" behält "state" 
also erstmal den vorherigen Wert, und toggelt nicht wild hin und her.

von Stefan F. (Gast)


Lesenswert?

Rechnest du eigentlich das störende Umgebungslicht heraus (oder filterst 
es analog)?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.