N'Abend!
Ich muss ein Sinussignal mit einer Frequenz von 6,25Hz mit einem AD
Wandler wandeln, welcher schon vorhanden ist.
Wie kann ich das prinzipiell durchführen?
Die Zeit einer einzigen Schwingung beträgt ja 160ms - wie stelle ich
sicher, dass ich, wenn die erste Wandlung abgeschlossen ist, wieder bei
"0" und nicht "irgendwo" in der darauffolgenden Schwingung beginne zu
wandeln?
Momentan kann ich mit meiner Funktion 10x nacheinander Wandeln und in
ein Array schreiben. Allerdings muss ich die Kurve viel öfter abtasten
(Abtasttheorem), weiß aber nicht, wie ich das genau programmieren soll.
Wenn es wirklich ein Sinus ist, kann man auch mit 10
Abtastungen leben. Kein Konflikt mit dem Abtasttheorem.
Berechnungen könnten aber mit 8, oder 16 Werten
einfacher werden.
Bei genau Null anfangen?
So häufig, wie möglich eine Probe nehmen - und ab der
ersten positiven Probe, die nach einer negativen
kommt, im Takt von 16 ms die 10 Werte ins Array schreiben.
Blaubarschbube schrieb:> Ich muss ein Sinussignal mit einer Frequenz von 6,25Hz mit einem AD> Wandler wandeln, welcher schon vorhanden ist.>> Wie kann ich das prinzipiell durchführen?
Indem du zu allererst dir eine wirklich konkrete Aufgabenstellung
formulierst - am besten auf Papier. Was ist das für ein Sinussignal? Was
für ein Ergebnis soll herauskommen? Was für einen ADC hast du? Also
beantworte dir selber all diese an sich einfachen Fragen und wenn du
dann noch ein Problem hast, dann formuliere es so, daß die Anderen hier
in diesem Forum nicht Rätselraten müssen, was du eigentlich gemeint
haben könntest.
W.S.
Wenn der Sinus symmetrisch zu 0 Volt liegt, musst du zuerst eine
Schaltung bauen, die dir dieses AC-Signal in den
Eingangsspannungsbereich des AD-Wandlers 'schiebt' und die AC-Amplitude
nach Möglichkeit den Eingangsspannungsbereich des AD-Wandlers ausnutzt.
Hier findest du einige Berechnungshilfen zu solchen Levelshiftern
(Range-Converter):
http://www.electronicdeveloper.de/LL_ADC.aspx
Hallo!
Vielen Dank schon mal für die Antworten, insbesondere an Bernie, der mir
vielleicht schon den entscheidenden Tipp gegeben hat.
Ich habe bewusst nicht zu weit ausgeholt, damit die Übersichtlichkeit
nicht verlorn geht.
Also:
Ich verwende den intergrierten 12Bit AD Wandler des STM32L152RBT6.
Das Signal stammt von einem Sensor, welcher CO und CO2-Konzentrationen
messen kann und wird danach verstärkt. Die genaue Funktionsweise davon
zu erklären (es handelt sich nicht um einen Halbleiter, sondern um ein
Ultrarot Adsorptions Spektrometer) geht zu weit, fakt ist aber, dass das
zu wandelnde Signal eine Frequenz von 6,25Hz und eine Spannung von
maximal 2,5V SS ausweist. Die Kurve wurde schon mit
Gleichspannungsoffset angehoben, damit auch die negative Halbwelle im
positiven Spannungsbereich liegt (trotzdem wichtiger Hinweis, El
Camino).
Ich will das Signal wie gesagt, jetzt möglichst genau abtasten und
danach mit einem digitalen Butterworth-Tiefpass-Filter bearbeiten, um
die störenden hohen Frequenzen heruaszufiltern.
Mein Problem war/ist, dass ich nicht weiß, wann eine Sinuswelle (also
2Pi) "abgeschlossen" ist, damit ich die gewandelten Werte aus dem Array
lesen und letztendlich zur Anzeige bringen kann. Wenn ich über die Zeit
(160ms von dem Signal und 16MHz uC Takt Prescaler 4 384Zyklen) gehe,
bekomme ich immer einen Übertrag, welcher nach logischer Überlegung
irgendwann dafür sorgt, dass "irgendwo" in der Halbwelle neu begonnen
wird.
Der Tipp mit dem "live-Auswerten" scheint sehr gut, denn ich überprüfe,
wann die Kurve sozusagen "0" erreicht und beginne dann eine neue
Wandlung. Liege ich damit richtig?
Dankt für die Hilfe.
Blaubarschbube schrieb:> fakt ist aber, dass das> zu wandelnde Signal eine Frequenz von 6,25Hz und eine Spannung von> maximal 2,5V SS ausweist.
...und wo ist jetzt der Sensorwert versteckt? in der Amplitude oder
in der Frequenz?
Fragt sich
Harald
Warum musst du dann genau bei NULL anfangen? Wenn die Frequenz konstant
ist, reicht es doch hin, die Zeit für eine Periode als Tor zu nehmen.
Ohne dir den Mut nehmen zu wollen: Mit einer Periode die Grundfrequenz
sauber rausrechnen zu wollen, ist anspruchsvoll. Wenn du 16 Punkte pro
Periode abtastest und dann 16 Perioden (also 256 Messpunkte) nimmst,
sollte eine FFT da zu besseren Ergebnissen führen.
Hallo Georg,
vielleicht habe ich einen Denkfehler in meinen Überlegungen.
Im Anhang findest du den Grund, warum ich "0" bestimmen will:
Angenommen, ich lege fest, dass 1 Halbwelle 80ms lang ist. Ich starte
die Wandlung, und bei der ersten Halbwelle funktioniert das auch. Danach
werden die Werte aus dem Array ausgelesen, von der Filter-Funktion
verarbeitet und auf dem Display ausgegeben. Danach starte ich die zweite
Wandlung, usw... Jetzt ist es doch so, dass die Verarbeitung der Daten
Zeit braucht, in der keine Wandlung erfolgen kann, bzw wo es keinen Sinn
macht zu wandeln. In dieser Zeit ist mein Signal ja weiter "gewandert"
und ich beginnt, wie schon gesagt, nicht am Anfang der Halbwelle,
sondern mitten drin und wandele auch über das Ende der Halbwelle hinaus.
... Ich glaube, ich habe es gerade verstanden!
Angenommen das Signal verändert sich nicht, dann ist der Effektivwert
(also der gewandelte Wert) gleich, wenn ich immer die gleiche Zeit lang
wandele, wenn es wird ja sozusagen nur die Fläche unter dem Graph
bestimmt, nicht?
Zum Filter: Diesen habe ich mir hier:
http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html
"zusammengebaut".
Ich schaue mit die FFT aber auch mal an, danke für den Tipp!
Einen schönen Abend wünsche ich Euch.
Hmmm ... wenn die Information nur in der Amplitude liegt, würde ich
einfach nur eine Minimum-Maximum-Suche machen. Ziehst Du beide
voneinander ab, hast Du den Spitze-Spitze-Wert. Frequenz und Offset kann
Dir dann egal sein.
Im Interrupt werden die Werte gesammelt und im Hauptprogramm einfach nur
die Werte aus den beiden Variablen ausgerechnet und ausgegeben.
Oder möchtest Du genau JEDE Welle vermessen und als Messwert ausgeben?
Gut, das ginge damit auch ...
Irgendwie scheinen noch Infos zu fehlen ...
Gruß
Jobst
Jobst M. schrieb:> einfach nur eine Minimum-Maximum-Suche machen. Ziehst Du beide> voneinander ab, hast Du den Spitze-Spitze-Wert.
Spitze-Spitze-Werte neigen zu Störungen. Ich würde die
Wechselspannung normal gleichrichten und über mehrere
Perioden integrieren.
Gruss
Harald
Also, wenn deine Info tatsächlich im rauschbereinigten
Spitze-Spitze-Wert liegt, dann wandle einfach so schnell du kannst und
appliziere an die ADC-Werte einen laufenden Mittelwert, also über die
letzten 16 oder 32 Werte den MW bilden (2er Potenz rechnet sich am
leichtesten, nur deshalb...).
Der laufende MW ist nach Theorie zwar der mit der schlechtesten
Passband-zu-Sperrband-Steilheit, aber er ist derjenige, der die
ursprünglichen Kurvenverläufe nicht verzerrt, also keinerlei
Überschwinger und Artefakte usw. macht.
Anschließend kannst du getrost dir zuerst den kleinsten Wert suchen und
wenn du den gefunden hast, suchst du nach dem nächsten größten Wert und
bildest die Differenz, die du dann weiterverarbeitest. Dazu hast du
genug Zeit, bis die Schwingung wieder in die Nähe des Minimums kommt.
Siehste, wie gut ein paar Worte mehr tun?
W.S.
Jobst M. schrieb:> Oder möchtest Du genau JEDE Welle vermessen und als Messwert ausgeben?
Hallo Jobst,
nein, jede Welle MUSS nicht unbedingt ausgegeben werden, denn die
Gaskonzentrationsänderung ist ebenfalls sehr träge, somit kann man sich
"Zeit lassen".
Muss ich denn überhaupt den "Nullpunkt" suchen? Nach meiner Überlegung
ändert sich nur sehr wenig, wenn ich die Signale in einem festen
Zeitabschnitt wandele, wenn sich der Messwert zeitlich nur langsam
ändert. Also müsste das doch reichen !?
> Der laufende MW ist nach Theorie zwar der mit der schlechtesten> Passband-zu-Sperrband-Steilheit, aber er ist derjenige, der die> ursprünglichen Kurvenverläufe nicht verzerrt, also keinerlei> Überschwinger und Artefakte usw. macht.>> Anschließend kannst du getrost dir zuerst den kleinsten Wert suchen und> wenn du den gefunden hast, suchst du nach dem nächsten größten Wert und> bildest die Differenz, die du dann weiterverarbeitest. Dazu hast du> genug Zeit, bis die Schwingung wieder in die Nähe des Minimums kommt.>> Siehste, wie gut ein paar Worte mehr tun?
Wie gesagt, ich habe bewusst am Anfang nicht zu weit ausgeholt - wer
liest schon gerne einen ellenlangen Thread... Nächstes mal schreibe ich
direkt alle Infos.
Momentan bilde ich nach dem Butterworth zusätzlich den Mittelwert. Ich
werde mal versuchsweise den Butterworth rausnehmen, um zu sehen, wie
sich das ganz verhält. Danke für den Tipp.
und jetzt gleiche Frage wie oben. Kann ich nicht die Werte, die im Array
stehen durch die Anzahl teilen -> Mittelwert, und dann ausgeben?
Dankt für die Hilfe.
Harald Wilhelms schrieb:> Spitze-Spitze-Werte neigen zu Störungen. Ich würde die> Wechselspannung normal gleichrichten und über mehrere> Perioden integrieren.
Stimmt. Und integrieren ist ja überhaupt die Idee.
Also Blaubarschbube:
Signal wandeln, wieder in "Wechselspannungswerte" umrechnen (Offset
subtrahieren - das muß nicht 100%ig sein, solange das Signal größer als
der Offset ist.), Absolutwerte davon erstellen und diese für 160ms
aufaddieren (das können auch mehr als 10 Werte -also schneller als 16ms-
sein). Wo der Anfang der Messung ist, ist völlig wurscht, Hauptsache,
die 160ms stimmen recht gut zu den 6.25Hz (160ms passen exakt zu 6.25Hz
- aber ich meine die realen Werte)
Gruß
Jobst