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?). :-)
Weshalb soll zurueckgelesen werden was ausgesandt wird ? Ich wuerd den ICP sein lassen.
@ 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 DDS DDS 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.
@stefan von dieser Möglichkeit hatte ich bislang keine Ahnung. Danke, werde das Link mal studieren.. Gruß Thomas
@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.
>Da liegen 12 Jahre Entwicklungsarbeit dahinter.
Aus Neugier: wo werden diese 65Hz gebraucht? Ratten, Mäuse, Ungeziefer?
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.