Forum: Mikrocontroller und Digitale Elektronik Sinussignal auf AD Wandler


von Blaubarschbube (Gast)


Lesenswert?

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.


1
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 1, ADC_SampleTime_384Cycles);        
2
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 2, ADC_SampleTime_384Cycles);
3
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 3, ADC_SampleTime_384Cycles);
4
...

Danke für die Hilfe!

von Bernie (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von El Camino (Gast)


Lesenswert?

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

von Blaubarschbube (Gast)


Lesenswert?

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.

von Harald W. (wilhelms)


Lesenswert?

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

von Blaubarschbube (Gast)


Lesenswert?

In der Amplitude

von Georg G. (df2au)


Lesenswert?

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.

von Blaubarschbube (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Jobst M. (jobstens-de)


Lesenswert?

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

von Harald W. (wilhelms)


Lesenswert?

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

von W.S. (Gast)


Lesenswert?

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.

von Blaubarschbube (Gast)


Lesenswert?

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.

von Jobst M. (jobstens-de)


Lesenswert?

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

von Blaubarschbube (Gast)


Lesenswert?

Jobst, danke für den Hinweis, klingt logisch & so werde ich es 
probieren.

Schönen Abend.

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.