Forum: Mikrocontroller und Digitale Elektronik Rechteckspannung und ADC


von Heigo R. (heigo)


Lesenswert?

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

von Michael Wilhelm (Gast)


Lesenswert?

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

von Fabian H. (hdr)


Lesenswert?

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...

von lkmiller (Gast)


Lesenswert?

>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)

von lkmiller (Gast)


Lesenswert?

@   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?

von Heigo R. (heigo)


Lesenswert?

> 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.

von Fabian H. (hdr)


Lesenswert?

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!

von Heigo R. (heigo)


Lesenswert?

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...

von 3360 (Gast)


Lesenswert?

Ein Histogramm erstellen ?

von Fabian H. (hdr)


Lesenswert?

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.

von 3360 (Gast)


Lesenswert?

Ein Histogtramm iste ein Araay von Haeufigkeiten. Da kann man irgendwann 
beginnen und 10 Rechteckperioden lang sampeln. Dann muesste man 2 Maxima 
bekommen.

von lkmiller (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.