Hallo, ich möchte mit einem M88 einzelne Dreiecktöne bis ca. 2000 Hz über PWM ausgeben (Amplitude konstant). Die Wellenform muss nicht 100%ig sauber sein. Wichtig ist nur, dass die Frequenz weitgehend stimmt. Weiß jemand, ob es schon einen fertigen Algorithmus gibt, bei dem man nur noch die Frequenzen eingeben muss? Ich programmiere in C mit dem AVR-Studio.
Basti schrieb: > Weiß jemand, ob es schon einen fertigen Algorithmus gibt, bei dem man > nur noch die Frequenzen eingeben muss? Du musst nur deinen Zähler unterschiedlich schnell hochzählen. Schau mal nach Phasenakkumulation, die kannst du nehmen, wobei du dir die Lookup-Table sparen kannst, die ist nur für Dreieck -> Sinus verantwortlich. :-)
Vielleicht Bresenham mit Zielpunkt (T/2,Amplitude) und (T,0). Für ein Dreieck musst du ja nur in der Hälfte der Periode linear auf den Maximalwert ansteigen und dann von diesem Wert in der anderen Hälfte wieder auf 0 abfallen. Bresenham erzeugt eine 'lineare quantisierte Gerade'. Vorher muss nur T/2 berechnet werden.
Der µC selber gibt nur Rechteck-signale aus. Erst mit einem Tiefpass wird dem PWM Signal am Ausgang eine analoge Spannung. Der algorithmus der Wahl wäre wohl das DDS Prinzip in Software mit dem PWM Ausgang als Ersatz für einen DA Wandler. Bis 2 kHz sollte das noch einigermaßen gehen - die Wellenform wird aber ggf. nicht mehr gut sein, weil der Tiefpass Oberwellen ab ca. 20 kHz unterdrücken muss. Dazu kommen Störungen aus der PWM Frequenz.
Bis 2 kHz schafft man das locker mit einem kleinen AVR. Setze einfach einen Timer, der am DAC-Ausgang den Wert um 1 U_{LSB} erhoeht und oben angekommen wieder dekrementiert. Die genaue Frequenz musst du wahrscheinlich messen und dann den Timer entsprechend einstellen.
Der Tip mit der DDS ist genau was du Suchst. einfach und sehr genau. Schau mal bei Wikipedia danach... MfG Matze
Danke für die Antworten und die Ideen! Ulrich schrieb: > Erst mit einem Tiefpass > wird dem PWM Signal am Ausgang eine analoge Spannung Selbstverständlich, deshalb hab ich ja auch ein Filter 5. Ordnung am PWM-Ausgang. Zurück zur Ausgangsfrage: Weiß jemand, ob es schon einen fertigen (!) Algorithmus hierfür gibt, bei dem man nur noch die Frequenzen eingeben muss?
Basti schrieb: > Zurück zur Ausgangsfrage: > Weiß jemand, ob es schon einen fertigen (!) Algorithmus hierfür gibt, > bei dem man nur noch die Frequenzen eingeben muss? Ja, der Algorithmus nennt sich DDS http://de.wikipedia.org/wiki/Direct_Digital_Synthesis wie schon oben erwähnt wurde. In Microcomputern kannst du den so implementieren:
1 | x:=0 |
2 | WIEDERHOLE |
3 | x:=(x+f) MODULO Tabellenlänge |
4 | GibaufPWMaus(tabelle[x]) |
5 | BIS Endbedingung |
Wobei f proportional zu Deiner gewünschten Frequenz ist, und Tabellenlänge die Länge Deiner Tabelle ist. Wenn Du Deine Tabelle mit 256 Einträgen machst, dann wird die Modulodivision automatisch vom Controller als Inteberüberlauf gemacht und Du sparst Dir Arbeit. In der Tabelle wird Deine gewünschte Wellenform abgespeichert. Alternativ zur Tabelle kannst Du Deinen Dreieck allerdings auch berechnen, beispielsweise mit Hilfe der Betragsfunktion. Als Unterbrechungsdienstroutine wird das noch eleganter:
1 | Hauptprogramm: |
2 | x:=0 |
3 | |
4 | Unterbrechungsdienstroutine: |
5 | x:=(x+f) MODULO Tabellenlänge |
6 | GibaufPWMaus(tabelle[x]) |
Und Du kannst im Hauptprogramm auch noch andere Dinge tun.
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.