Hallo, ich möchte die Pegel eines Rechtecksignals mittels ADC bestimmen. Mein Problem ist jetzt, dass das Signal zwischen zwei Werten pendelt, die ich vorher nicht kenne. Als Lösung hätte ich gerne den Wert für die niedrigste Spannung und den Wert für die höchste Spannung. Wenn ich nun zwei nacheinander gemessenen Werte vergleiche und danach die Aussage treffe, welcher größer oder kleiner war, ist das Problem, dass der ADC sowieso nie zweimal den gleichen Wert misst. Ein weiteres Problem ist, wenn ich genau in der steigenden oder fallenden Flanke messe, dann kommen noch ungenauere Werte zu stande. Hat da jemand vielleicht eine Idee? Gruß Heiko
Ich würde dem zu messenden Signal erst einen Komparator vorschalten. Den auf einen ext. Interrupt geben. Somit hast du schon mal die Zeiten wo du messen kannst. Danach evtl. mehrere Messungen in dieser Phase und den Mittelwert bilden. MW
unsigned char i, x, min, max; min = 128; max = 128; for (i = 0; i < 100; i++) { x = "Wert vom ADC einlesen"; if (x > max) { max = x; } if (x < min) { min = x; } } So ungefähr würde ich es machen...
>Mein Problem ist jetzt, >dass das Signal zwischen zwei Werten pendelt Nun, das hat ein zeitlich variantes Signal so an sich. Für eine sinvolle Antwort auf deine Frage fehlen da noch ein paar Daten: Frequenz? Flankensteilheit? Rauschen? Ändert sich der low- bzw. high-Pegel im Laufe der Zeit? Falls ja: wie schnell? Wenn ich das alles als Freiheitsgrade hätte, dann würde ich das als ein sauberes 5V-Signal definieren und einen 1-Bit-AD-Wandler (Port-Pin) verwenden :-) (Ich liebe den Konjunktiv)
@ Fabian Harder besser so: : min = 255; // wenn unsigned!! max = 0; : Weil: was wäre mit "min = 128", wenn das Signal zwischen 200 und 240 schwanken würde?
> Für eine sinvolle Antwort auf deine Frage fehlen da noch ein paar Daten: Frequenz maximal 16Hz, also sehr langsam Flankensteilheit im schlechtesten Fall 200us Rauschen = ADC-Wert +-3 > Ändert sich der low- bzw. high-Pegel im Laufe der Zeit? > Falls ja: wie schnell? eigentlich sollte er sich nicht ändern, aber auch das Stecker abziehen würde eine Änderung hervorrufen.
lkmiller wrote: > @ Fabian Harder > > besser so: > : > min = 255; // wenn unsigned!! > max = 0; > : > > Weil: > was wäre mit "min = 128", > wenn das Signal zwischen 200 und 240 schwanken würde? Jo, stimmt!
Fabian Harder wrote: > lkmiller wrote: >> @ Fabian Harder >> >> besser so: >> : >> min = 255; // wenn unsigned!! >> max = 0; >> : >> >> Weil: >> was wäre mit "min = 128", >> wenn das Signal zwischen 200 und 240 schwanken würde? > > Jo, stimmt! Problem an der Sache ist nur, dass bei dieser Möglichkeit Pegel nur erkannt werden, wenn sie oberhalb oder unterhalb der Schwelle liegen. Sollten beide unterhalb 255 liegen, wird nur ein Wert erkannt. Wenn sich das Signal auch noch ändert, also erst ein max wert erkannt wird und dann wird die Schwelle unterschritten, dann bleibt der Wert trotzdem im Register stehen...
Ich verstehe nicht so ganz, was Du mir damit sagen willst... Falls sich der Wert im Laufe der Zeit ändert?! Dann setzt man zyklisch min=255; max=0; und erhält danach wieder die aktuellen Werte.
Ein Histogtramm iste ein Araay von Haeufigkeiten. Da kann man irgendwann beginnen und 10 Rechteckperioden lang sampeln. Dann muesste man 2 Maxima bekommen.
Das mit dem Histogramm ist schön, braucht aber einiges an Speicherplatz und Auswerte-SW. Und eine lange Messdauer, um sicher beide Pegel zu erfassen (<<16Hz). Wieso nicht do wie die Peak-Anzeigen in einem Mischpult: z.B. Maximum A) ein AktWert>MaxPeak setzt den MaxPeak=AktWert B) dann läuft der MaxPeak zeitlich (z.B. -1 pro 10ms) langsam gegen 0, wenn nicht zwischendurch A) eintritt MinPeak ist eben genau umgekehrt. Das ergäbe eine schöne Anpassung auch an ein sich langsam änderndes Signal. Das ergibt ein weniger hartes Verhalten als > >Dann setzt man zyklisch min=255; max=0; und >erhält danach wieder die aktuellen Werte. >
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.