Forum: Mikrocontroller und Digitale Elektronik Dreieck mit AVR bis 2kHz


von Basti (Gast)


Lesenswert?

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.

von Floh (Gast)


Lesenswert?

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.
:-)

von Dussel (Gast)


Lesenswert?

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.

von Ulrich (Gast)


Lesenswert?

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.

von Hans-Bernd (Gast)


Lesenswert?

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.

von Matze (Gast)


Lesenswert?

Der Tip mit der DDS ist genau was du Suchst. einfach und sehr genau. 
Schau mal bei Wikipedia danach...

MfG
Matze

von Basti (Gast)


Lesenswert?

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?

von Christian B. (casandro)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?


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.