Dreieck mit AVR bis 2kHz

Gast #2081398
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.
Gast #2081416
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.
Gast #2081511
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?
#2081538
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren