Hallo,
Mit angehändten Code erzeuge ich ein Sinussignal um die 65 Hz.
Timer 1 ICP
Timer 2 PWM
Timer 3 Über OCR3A auslesen der LUT
Ich habe hier recht viele Interruptquellen
1. Timer1_CAPT_vect
2. Timer1_OVF_vect
3. Timer3_COMPA_vect
4. USART0_UDRE_vect
Nun ist der erzeugte Sinus recht unruhig, d.h. die ICP Messung gibt eine
recht große Bandbreite von Werten aus. Ich wollte nun keine
Mittelwertlösung,
da das erzeugte Signal innerhalb des Projektes eine Interferenz zu einer
anderen Signalquelle bilden soll. Dazu sollte das Signal genau und
möglichst stabil sein.
Wenn ich nur das Signal mit einem Interrupt erzeuge, ohne die ganzen
anderen Interrupts, ist es deutlich stabiler.(Oszi)
Muss ich unbedingt auf DDS gehen oder kann ich irgendwie dem
Timer3_COMP_vect
eine Priorität einräumen, damit er exakt läuft und nicht von den anderen
Interruptquellen gestört wird.
Habe im Tutorial nachgelesen, es aber nicht recht verstanden. Und vorm
DDS habe ich etwas Muffe. (Habe mir aber schon ein Buch bestellt)
Über einen Tipp würde ich mich freuen
Gruß
Thomas
Musst du das Datensenden als Interrupt erledigen?
Ansonsten einfach in der Hauptschleife die Werte raushauen.
Selbe Frage, ob dein Capture-Interrupt nötig ist, da du ja Messung und
Senden hintereinander machst?
So liese sich sicherstellen, dass der Sinusgenerator auch immer seinen
Wert ändern kann (übrigends, sind 64 Punkte nicht ein bisschen wenig?).
:-)
@ Thomas (Gast)
>Mit angehändten Code erzeuge ich ein Sinussignal um die 65 Hz.>Timer 1 ICP>Timer 2 PWM>Timer 3 Über OCR3A auslesen der LUT
Erstmal unritisch.
>Ich habe hier recht viele Interruptquellen>1. Timer1_CAPT_vect>2. Timer1_OVF_vect>3. Timer3_COMPA_vect>4. USART0_UDRE_vect
Und da wunderst du dich über einen unruhigen Sinus? Ich nicht.
>Wenn ich nur das Signal mit einem Interrupt erzeuge, ohne die ganzen>anderen Interrupts, ist es deutlich stabiler.(Oszi)
Surprise, Surprise.
>Muss ich unbedingt auf DDSDDS kann auch nicht zaubern.
>gehen oder kann ich irgendwie dem>Timer3_COMP_vect>eine Priorität einräumen, damit er exakt läuft und nicht von den anderen>Interruptquellen gestört wird.
Nicht direkt.
>Habe im Tutorial nachgelesen, es aber nicht recht verstanden. Und vorm>DDS habe ich etwas Muffe. (Habe mir aber schon ein Buch bestellt)
Auch DDS braucht einen stabilen Takt, auch in Software.
Man muss das Konzept ändern. Es darf nur EINEN Interrupt geben, der
liest die LUT aus. Ich würde den Timer 2 mit deiner PWM nehmen. Der Rest
wird per Polling clever abgefragt. Wenn man das schnell und richtig
macht, so wie im Beispiel Multitasking, gibt es auch keinen Jitter
mehr bei der Signalerzeugung.
MFG
Falk
Die Idee mit einem Interrupt ist schon eine gute Idee. Falls es nicht
auf absoluten Tiefstpreis beim Microcontroller ankommt würde allerdings
die faule Lösung bevorzugen und einfach einen Chip der STM32-Familie
einsetzen, mit integriertem DAC ohne PWM, wo man einem DMA sagen kann,
schicke jetzt einfach mal diesen Block im Speicher mit diesem Takt auf
den DAC raus, sodaß man sich keine Sorgen mehr um Echtzeitprobleme
machen braucht.
DDS ist aber auch recht einfach und würde, je nachdem wie geschickt man
das implementiert, den Jitter verhindern und eine sehr feine Auflösung
der Ausgangsfrequenz erlauben. Ich habe das mal mit einem FPGA
implementiert:
http://www.frank-buss.de/SignalGenerator/
Den VHDL-Code kann man relativ leicht in C übernehmen. Wobei man dort
natürlich nicht meinen Ansatz mit einer 24-Bit genauen Winkelberechnung
aus dem DDS-Akkumulator per CORDIC verwenden muß, sondern eine etwas
größere Wertetabelle je nach Genauigkeitsanforderung wohl auch reichen
würde.
Auch wenn man bei der Signalerzeugung per PWM (PWM als Ersatz für einen
DAC) bleibt, ist DDS das Verfahren der Wahl. Die Abtastfrequenz ist
durch die PWM Frequenz vorgegeben - einige der Timer haben da auch einen
Hardware Puffer, so dass das genaue timing beim Schreiben der PWM Werte
unkritisch ist. Einfach im Überlauf des Timers der das PWM Signal
erzeugt je einen DDS Schritt ausführen. Das wird normal nicht so oft
sein und man hat genügend Rechenzeit. Mehr als einmal pro Periode des
PWM Signals braucht man den Wert auch gar nicht ändern.
Idealerweise sollte man Phasenkorrektres PWM nehmen, weil sich sonst die
dem PWM Wert auch die Zeit des Pulses verschiebt. Das ist nicht viel,
aber bei höheren Frequenzen schon ein merklicher Fehler.
Auf das Nachmessen in Echtzeit kann man verzichten - der µC wird schon
richtig rechnen. Da besser das Programm noch einmal mehr kontrollieren.
Hallo,
vielen Dank für Eure Antworten.
Ich möchte kurz das Projekt konkretisieren:
1.Möglichst geringer Bauteilaufwand, in der Entwicklungsphase kein SMD,
da ich während der klinischen Prüfung noch Hardware modifizieren können
will. Wenns läuft, sollte es mit SMD so klein wie möglich werden
(Akkubetrieb)
2. ein externer Vorgang produziert einen Takt zwischen 0,5 Hz und 2 Hz.
Er produziert dabei ganzzahlige Obertöne.
3. Der µC bekommt das Signal und soll daraus ein genaues ganzzahliges
Vielfaches im Bereich um 65 Hz als Sinus produzieren.
4. Das Sinussignal betreibt einen nichtlinearen Aktor, dessen
spezifische Eigenschaft in der Produktion von starken Subharmonischen
besteht. Er ist träge und kommt deswegen mit wenig Stützstellen
aus)@Floh)
5. Ziel ist, mit den erzeugten Subharmonischen eine Interferenz zu den
Obertönen des externen Signals zu erreichen. Die vom µC erzeugte Sinus
Frequenz wird dabei nie den Bereich zwischen 63Hz und 66Hz verlassen.
@Ulrich
Deshalb würde ich gerne erstmal versuchen ohne zusätzliches DDS Baueil
auszukommnen.
@Hacky
Die UART Routine verwende ich zur Zeit nur um das erzeugte Signal zu
kontrollieren.
Später soll es nur die emfpangenen externen Signale als Werte zum PC
senden
(Im stationären Betrieb. mobil evtl LCD)
D.h. im normalen Betrieb finden die zwei ISR für ICP und UART nur alle
0,5-2 Hz statt, fallen dann evtl als Jitterursache eh raus.
@falk
werde jetzt erstmal den Multitasking Artikel lesen.
Gruß
Thomas
Hallo Thomas
versuch mal an alle Interupts die nicht so wichtig sind
_attribute_ ((interrupt))
siehe
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
zu schreiben.
Damit wird in denen der Interrupt für deine Sinuserzeugung wieder
freigeschalten(sei wieder an).
Gruß Stefan
>da ich während der klinischen Prüfung noch Hardware modifizieren können>will.
An anderer Stelle schreibst Du, dass Du ein Anfänger bist.
Hier redest Du jetzt von klinischer Prüfung?
Wenn das etwas für Humanmedizin werden soll, laß besser die Finger
davon, bevor Du nicht fundierte Erfahrung hast.
@kakadu
;-) keine Sorge, lediglich was das Programmieren, bzw das Programmieren
von µC anbelangt bin ich Anfänger. Die Vorversion des Verfahrens, bei
dem die Frequenzen "zu Fuß" analysiert und berechnet werden, hat die
Prüfung schon hinter sich. Da liegen 12 Jahre Entwicklungsarbeit
dahinter. Bislang mit Informatiker. Nun aber wollte ich die Sache selbst
in die Hand nehmen, weil einerseits das ständige Warten auf irgendwelche
Betaversionen nervt und den Prozess unnötig blockiert, andererseits die
Auseinandersetzung mit µC-proggen durchaus bewußtseinserweiternd wirken
kann......
Gruß
Thomas
Bei der niedrigen Frequenz kann man die DDS Methode auch in Software
anwenden. Man braucht also keine externe Hardware. Der Unterschied ist
nur die Methode mit der die PWM Werte berechnet werden.
Der deutlich schwierigere Teil wird ohnehin das nach-regeln der Frequenz
nach dem Externen Signal sein - das ist dann vermutlich ein Software PLL
- das geht, ist aber von der Theorie dazu recht anspruchsvoll.
@ulrich
das denke ich auch, mit der Software DDS. Und was das Nachführen der
Frequenz anbelangt hatte ich ja da gerade das Problem mit dem Jitter,
was sich aber gelöst hat. Nun wollte ich eine Wertetabelle erstellen, in
dem ich OCR3A immer um 1 inkrementiere und die sich daraus ergebende
Frequenz gegenüberstelle. Daraus wollte ich eine Funktion mit passendem
Algorithmus ableiten. So hatte ich es zumindest vor.
@kakadu
Säugetiere incl. Mensch. Auflösung von Grenzzyklen im Blutstrom.
Grenzzyklen sind pathologische Anteile der Mikrozirkulation biologischer
Systeme. Die 65Hz sind die optimale Frequenz für den nichtlinearen Aktor
(+-2Hz)Durch dessen Subharmonische gehe ich in Resonanz zu den
Grenzzyklen, die sich dadurch in nächst höhere Attraktoren umwandeln.
Gruß
Thomas
Das DDS Verfahren geht etwas anders: Es wird bei einer festen Frequenz
von Rechenschritten (hier wohl nach jedem PWM Zyklus) die aktuelle Phase
der Schwingung berechnet und dann der passende Wert ausgegeben. Die
phase berechent sich einfach durch fortlaufendes Aufsummieren einer Zahl
mit z.B. 24 oder 32 Bit Auflösung. Die Frequenz wird dadurch festgelegt
was man in jeden Zeitschritt dazu addiert. In diesem Fall reicht also
der Timer 2 aus, der das PWM Signal erzeugt.
@ulrich
>Das DDS Verfahren geht etwas anders: Es wird bei einer festen Frequenz>von Rechenschritten (hier wohl nach jedem PWM Zyklus) die aktuelle Phase>der Schwingung berechnet und dann der passende Wert ausgegeben.
wirklich Phase oder Periode?
Thomas