www.mikrocontroller.net

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


Autor: Basti (Gast)
Datum:

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

Autor: Floh (Gast)
Datum:

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

Autor: Dussel (Gast)
Datum:

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

Autor: Ulrich (Gast)
Datum:

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

Autor: Hans-Bernd (Gast)
Datum:

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

Autor: Matze (Gast)
Datum:

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

MfG
Matze

Autor: Basti (Gast)
Datum:

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

Autor: Christian Berger (casandro) Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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:
x:=0
WIEDERHOLE
  x:=(x+f) MODULO Tabellenlänge
  GibaufPWMaus(tabelle[x])
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:
Hauptprogramm:
  x:=0

Unterbrechungsdienstroutine:
  x:=(x+f) MODULO Tabellenlänge
  GibaufPWMaus(tabelle[x])

Und Du kannst im Hauptprogramm auch noch andere Dinge tun.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.