mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik unruhiges Sinussignal


Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?).
:-)

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weshalb soll zurueckgelesen werden was ausgesandt wird ? Ich wuerd den 
ICP sein lassen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: Frank Buss (foobar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Kakadu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@stefan

von dieser Möglichkeit hatte ich bislang keine Ahnung. Danke, werde das 
Link mal studieren..

Gruß

Thomas

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Kakadu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Da liegen 12 Jahre Entwicklungsarbeit dahinter.

Aus Neugier: wo werden diese 65Hz gebraucht? Ratten, Mäuse, Ungeziefer?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ulrich
Sorry, war ne blöde Frage, ist ja eine Phasenakkumulation....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.