Forum: Mikrocontroller und Digitale Elektronik Frequenz und Phasengang mit MSP430 messen


von Simon H. (simon12)


Lesenswert?

Hallo,
im Rahmen meiner Masterarbeit soll ich mit einem MSP430G2553 die Phase 
und die Frequenz zweier sinusförmiger Signale bestimmen. Es geht dabei 
um Vibrationsmessungen. Das eine Signal wird von einem analogen 
Beschleunigungssensor erzeugt (ADXL 337). Der Sensor gibt dabei je nach 
Beschleunigung einen Spannungswert um Vdd/2 aus (0g Beschleunigung = 
Vdd/2). Das andere Signal wird von einem Piezo erzeugt und soll mittels 
Komparator bzw. Schmitt-Trigger „digitalisiert“ werden. Die 
Schwingungsfrequenz liegt zwischen 50-100Hz. Zur Bestimmung der Größen 
sollen 5 Perioden betrachtet werden. Das ganze sollte zudem noch 
möglichst energiesparend sein da es sich dabei um ein energieautarkes 
System handelt. Ich habe die letzten Tage den TI User’s Guide studiert 
und habe mir folgendem Ansatz überlegt:
Den Beschleunigungssensor an einen Komparator mit Vdd/2 als 
Referenzspannung, den Schmitt-Trigger des Piezos an einen digitalen 
I/O-Pin im Capture-Mode anschließen. Timer A starten und bei jedem 
Aufruf der ISR den aktuellen Wert von Timer A zur späteren Auswertung in 
ein Array schreiben. Bei einer der beiden ISR sollte zudem ein Counter 
inkrementieren werden damit beim 5. Ausführen der ISR die Interrupts 
disabled werden und Timer A angehalten wird. Anschließend könnte aus den 
Werten im Array Frequenz und Phase bestimmt werden. Als Clock für Timer 
A hätte ich die ACLK mit LFXT1CLK als Quelle verwendet. Als LFXT1CLK 
hätte ich gerne eine 32kHz Quarz genommen. Das sollte ja ausreichend 
präzise sein, oder? Ist es richtig, dass die ACLK im LPM3 aktiv ist und 
die Messung somit relativ energiesparend erfolgen könnte?
Ich hätte nun gerne von euch gewusst ob das alles so prinzipiell 
funktioniert oder ob es eine bessere Methode gibt. Evtl. gibt es auch 
schon irgendwo fertigen C Code für sowas. Habe bisher leider 
ausschließlich mit den Arduino programmiert und nur selten mal ne 
Funktion in C geschrieben wenn es nichts Fertiges gab;-)

Vielen Dank und viele Grüße
Simon

von Ulrich H. (lurchi)


Lesenswert?

Das Problem sollte man erst einmal in 3 Teilen Betrachten:
1) Die Hardware Umsetzung, also wie bekommt man die Signal in den µC.
2) Den Algorithmus für die Frequenz und Phasenbestimmung
3) Die Umsetzung in Software

Bei der Hardware ist es komisch, das einmal der AD und einmal der 
Komparator genutzt werden soll. Der Komparatoreingang ist gut für eine 
Frequenzmessung, wenn man keine Störungen hat. sonst kann es schwer / 
ungenau werden. Da wäre ein AD Eingang ggf. besser.

Beim Algorithmus zur Auswertung hat man verschiedene Möglichkeiten. Das 
ist ein Abwägung zwischen Genauigkeit bzw. Toleranz gegen Störungen und 
dem Aufwand bzw. Stromverbrauch. Da müsste man sich klar werden welche 
Genauigkeit gefordert ist, und wie das Signal etwa aussieht, bzw. was an 
Störungen noch toleriert werden soll. Beim Komparator hat man außer den 
Zeiten der Nulldurchgänge nicht viel mehr Information - da kann man 
höchstens noch sehr schnelle Schwankungen durch Rauschen etc. 
Rausfiltern. Bei der Auswertung des ADC Kanals gibt es mehr 
Möglichkeiten - ggf. müsste man die auch parallel entwickeln um dann zu 
vergleichen und die passende Lösung auszusuchen. Einfach wäre es etwa 
die Nulldurchgänge durch lineare Interpolation zu bestimmen. 
Aufwändiger, aber auch besser wäre ein kompletter Sinus Fit an die Daten 
- das klingt sehr aufwändig, ist aber gar nicht so schlimm, wenn man 
einen brauchbaren Schätzwert für die Frequenz als Startwert hat. Als 
Zwischenlösung gäbe es auch noch erst eine Digitale Filterung und dann 
die Nulldurchgänge zu bestimmen. Es ginge auch ein FFT - wenn man 
unbedingt will, wobei das bei ca. 5 Periode eher nicht die Methode der 
Wahl ist. Den Vergleich der Algorithmen kann man ggf. auch am PC mit 
simulierten Daten machen - da ist es einfacher mit der Ausgabe von 
Zwischenwerten.

Ein 32 kHz Quarz ist schon recht präzise. Das sollte normalerweise 
ausreichen: die wenigsten mechanischen Systeme sind so stabil, und mit 
mit Störungen auf dem Signal werden auch die Messwerte eher nicht so 
genau sein, das mehr Auflösung bei den Zeiten sinnvoll ist. Bei wenig 
Störungen und hohen Anforderungen könnte man aber ggf. mehr 
Zeitauflösung gebrauchen.

von Easylife (Gast)


Lesenswert?

Simon Heller schrieb:
> Habe bisher leider
> ausschließlich mit den Arduino programmiert und nur selten mal ne
> Funktion in C geschrieben wenn es nichts Fertiges gab;-)

Dann wird's aber Zeit. Du glaubst ja nicht wirklich, dass es für Alles 
eine fertige Lösung im Internet gibt. So eine Einstellung wird unter 
Entwicklern nicht wirklich geschätzt, behaupte ich mal so.
Und ich vermute mal, deine Masterarbeit ist im technischen Bereich, oder 
willst du direkt nen Doktor draufsetzen? Da muss man natürlich nur 
Internet bedienen können...

So, genug gelästert, zu deinen Fragen:

Du solltest darauf achten, beide Sinus Signale erstmal auf die gleiche 
Amplitude zu bringen, bevor du sie auf den Komparator/Schmitt-Trigger 
schickst.
Ich würde den Schmitt-Trigger nehmen, da du damit sicherer vor 
"Prellern" bist.

Du musst allerdings für beide Kanäle die gleiche Eingangs-Schaltung 
nehmen (zwei (identische) Schmitt-Trigger, oder zwei Komparatoren), denn 
sonst hast du eine frequenzabhängige Phasenverschiebung, da Komparator 
und Schmitt-Trigger an unterschiedlichen Stellen des Sinus high/low 
gehen würden.

Die Idee mit dem 32KHz Quarz ist gut.
Das Array würde ich mir sparen, einfach 5 Phasendurchläufe zählen, und 
den Timerwert nehmen.

von W.S. (Gast)


Lesenswert?

Simon Heller schrieb:
> Die
> Schwingungsfrequenz liegt zwischen 50-100Hz.

Ach je, da würde ich ganz einfach den ADC nehmen und beide Signale 
anschließend digital weiterverarbeiten: erstmal nen laufenden Mittelwert 
zum Glätten, dann generellen Mittelwert über ein paar Perioden um den 
mittleren Pegel zu bestimmen, dann bei beiden die Durchgänge durch den 
mittleren Pegel bestimmen, dann aus zeitlichem Versatz und Periode den 
Phasenversatz. Reicht.

Aber mal was Grundsätzliches: Muß man heutzutage nicht immer noch 
erklären, daß man die Arbeit auf eigenem Mist hat wachsen lassen? Oder 
ist Guttenberg jetzt Allgemeingut?

W.S.

von Simon H. (simon12)


Lesenswert?

Guten Abend,
danke für den Input!
Eine kurze Stellungnahme zu der angeklungenen Kritik ;-)
Mir ist durchaus bewusst, dass es nicht immer eine fertige Lösung gibt 
aber warum sollte man das Rad neu erfinden? Meine Masterarbeit besteht 
auch nicht nur daraus einen MSP430 zu programmieren, sondern beinhaltet 
noch ein paar weitere Aufgaben. Mir wäre auch nicht bekannt, dass man 
sich in Internetforen keine Tipps und Anregungen holen darf ;-)Das 
Problem von unserm Herrn zu Guttenberg war ja leider, dass er fremdes 
geistiges Eigentum als sein Eigenes ausgegeben hat! Wenn ich irgendeinen 
Code-Schnipsel aus dem Internet verwenden würde, würde ich das natürlich 
kenntlich machen!

Vielleicht kurz noch ein paar Worte zu meiner Arbeit:
In der Arbeit geht es um die Regelung eines Energy Havesters, in diesem 
Fall einem Biegebalken mit einer piezoelektrischen Schicht die aus 
mechanischen Schwingungen kleine Mengen elektrischer Energie erzeugt. 
Meine Aufgabe ist es die erzeugte Spannung gleichzurichten und mit einen 
Buck-Boost Converter auf eine µC-verträgliche Spannung zu bekommen um 
den MSP430 und den ADXL337 betreiben zu können. Natürlich kann die 
Anregungsfrequenz variieren was dazu führt, dass die Steifigkeit des 
Balkens variiert werden muss um das System immer in Resonanz zu halten.

Über das simple Sampeln mit dem ADC hab ich auch schon nachgedacht da 
ich über kurz oder lang auch die Amplitude des Beschleunigungssensors 
brauche. Ich habe nur gedacht, dass der Ansatz mit den Interrupts 
deutlich energiesparender ist. Immerhin müsste ich für 5 Perioden bei 
50Hz mind. 100 ms aufnehmen. Bei einer Samplerate von 5 kHz wären das 
500 Werte die ich zwischenspeichern müsste. Und dann wäre die Auswertung 
noch nicht gemacht. Wäre der ADC im LPM3 überhaupt zu betreiben? Wobei 
der Ansatz programmiertechnisch auch für mich machbar klingt;-) 
Letztlich interessiert mich ca. alle 30 Sekunden die Phase und 
vermutlich alle 60 Sekunden die Amplitude. Das gleiche „Level“ für die 
Signale ist schaltungstechnisch wohl etwas komplizierter. Die Spannung 
des Piezos wird wie gesagt mit einem Brückengleichrichter 
gleichgerichtet wodurch der Nulldurchgang des Sinus nicht mit dem GND 
des µC übereinstimmt. Das sollte sich aber messen bzw. Simulieren 
lassen. Der entstandene Fehler kann ja dann einfach in die Berechnung 
der Phase einfließen.
Gruß, Simon

von Easylife (Gast)


Lesenswert?

Hi Simon,
danke für die gute Erläuterung der Arbeit (sieht man hier selten), jetzt 
kann man sich gleich viel besser vorstellen, wo das ganze hinführen 
soll.

Wie viel Energie (mW/s, uW/s, nW/s?) kommt denn aus dem System in etwa 
heraus, damit wir eine Vorstellung bekommen, wie sparsam du mit Energie 
umgehen musst.

Ich frage mich halt, ob man durch die Art der Programmierung hier 
wirklich etwas einsparen kann.
Der uC muss ja eh für 5 Perioden (so ca. 0.1s) aktiv sein, und ich denke 
fast es ist ziemlich egal, ob er sich in dieser Zeit mit Timerwerten 
oder ADC Samples beschäftigt.

Das mit dem Nulldurchgang kann dir wirklich noch zum Problem werden.
Wenn die Amplitude des Piezosignals ein Mehrfaches der Forwardspannung 
der Diode ist, dann kommst du nahe dem Nulldurchgang an.
Je kleiner die Piezospannung wird, sagen wir mal nur leicht über der 
Forwardspannung, hast du eine Phasenverschiebung von fast 90° - alleine 
durch den Pegel des Piezosignals.
Da du ja die Amplitude der Piezospannung nicht kennst, kannst du diesen 
Faktor auch nicht hinterher herausrechnen.

Daher ist glaube ich die von W.S. vorgeschlagene Lösung mit dem ADC sehr 
gut. Da bekommst du alles: Amplitude, Frequenz und Phasenlage.

von Amateur (Gast)


Lesenswert?

Hab' mal 'ne halbe Pupille auf den MSP430 geworfen.

Schickst Du den zwischenzeitlich ins Bett, so ist der Stromverbrauch 
echt klasse.
Pass' aber auf, im Tiefschlaf lässt der sich nicht mehr besonders 
universell aufwecken.

Wie und ob der aus einem Uhrenquarz 'nen ordentlichen Ticker (PLL ?) 
machen kann weis ich noch nicht. Möglicherweise benötigst Du dann zwei 
verschiedene Quarze.
Allgemein gilt aber "echte" Uhrenquarze sind relativ genau.

Beim Digitalisieren von analogen Signalen ist die Sache mit den 
Schwellwerten nicht ganz ohne.
Am Beispiel eines Sinus:
Stehst Du auf den Spitzenwert, so währe es toll, wenn das Signal 
konstant und sauber ist.
Stehst Du aber mehr auf den Nulldurchgang, so währe es echt toll, wenn 
kein Versatz durch Gleichspannung Dir eine lange Nase macht.
In beiden Fällen wären die Ergebnisse bestenfalls höflich.
Beim Messen der Periode hilft Dir wahrscheinlich die Wiederholung.

von F. F. (foldi)


Lesenswert?

Simon Heller schrieb:
> Vielleicht kurz noch ein paar Worte zu meiner Arbeit:
> In der Arbeit geht es um die Regelung eines Energy Havesters,

Sehr interessantes Thema. Das wird sicher in den nächsten Jahren eines 
der allerwichtigsten Themen sein.

von F. F. (foldi)


Lesenswert?

Amateur schrieb:
> Hab' mal 'ne halbe Pupille auf den MSP430 geworfen.
>
> Schickst Du den zwischenzeitlich ins Bett, so ist der Stromverbrauch
> echt klasse.
> Pass' aber auf, im Tiefschlaf lässt der sich nicht mehr besonders
> universell aufwecken.

Hä?
Einer der großen Vorteile soll sein, dass er in nullkommanix wieder wach 
ist
Ultrafast Wake-Up From Standby Mode in
less than 1 µs

von Amateur (Gast)


Lesenswert?

>Hä?
>Einer der großen Vorteile soll sein, dass er in nullkommanix wieder wach
>ist

Die "Aufwachzeit" hat nichts mit der reduzierten Anzahl an 
"Aufwachquellen" zutun.

von F. F. (foldi)


Lesenswert?

Der steht auch noch auf meiner Agenda, aber ich habe noch fast nichts 
damit gemacht und erst recht noch nicht viel gelesen.

Erzähl mal wie begrenzt der in diesem Bereich ist. Nur kurz umreißen.

von Amateur (Gast)


Lesenswert?

Bin auch noch nicht besonders weit mit dem Teil.
Aber soweit ich weiß kommt der vom Tiefschlaf nur durch ein externes 
Signal (Interrupt), in die Pötte.
Ich glaube es gibt 4 Modi. Im Halbschlaf (Modus 3) geht's schon besser, 
der stromt aber auch stärker.

von F. F. (foldi)


Lesenswert?

Amateur schrieb:
> Bin auch noch nicht besonders weit mit dem Teil.
> Aber soweit ich weiß kommt der vom Tiefschlaf nur durch ein externes
> Signal (Interrupt), in die Pötte.
> Ich glaube es gibt 4 Modi. Im Halbschlaf (Modus 3) geht's schon besser,
> der stromt aber auch stärker.

Ja eben, aber so wie es da steht, durch jeden Interrupt. Ob der nur von 
außen kommen darf, das weiß ich zur Zeit auch noch nicht.
Der steht erst für Ende diesen Jahres, bis Mitte nächsten Jahres bei mir 
auf dem Plan. Ein Buch hab ich schon und da stand gleich zu Anfang, dass 
es einer der wesentlichen Vorteile sein soll, dass er so schnell wach 
wird und sich dann selbst wieder schlafen legt. Kein Hinweis, dass das 
begrenzt auf wenige Quellen sei.

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.