Hallo Leute, ich bin leidenschaftlicher C-Programmierer aber noch neu in der Controller Programmierung (avr-gcc). Ich habe mir einen AT90S2313 vom Atmel zugelegt und versuche eine sinusbewertete Pulsweitenmodulation umzusetzen. Hierbei soll also der Vergleichswert einem Sinus folgen. Den in einem Tutorial beschriebenen "PWM- Mechanismus" habe ich mit einem einfachen Vergleichswert schon nachvollzogen. Jetzt habe ich folgende Fragen an Euch: Wie kann ich im AVR AT90S2313 einen in seiner Frequenz und Amplitude veränderbaren Sinus erzeugen? Wie kann ich diesen Sinus mit der im "PWM- Mechanismus" vorhandenen Dreieckschwingung vergleichen? vielen Dank im voraus, Jens
einen in Frequenz und Amplitude veränderbaren Sinus... Geht nur mit ext. D/A-Wandler, und auch das nur mit relativ geringer Frequenz. Tabelle mit den Sinuswerten von 0-90° ablegen und diese im entsprechenden Zeitraster ausgeben. Je höher die Genauigkeit, desto langsamer wird die Sache. Amplitude: auch nur sinnvoll mit externer Hardware, einstellbare Verstärkung, multiplizierender DAC. Die "Dreieckschwingung" existiert nicht wirklich, es ist die grafische Darstellung des Zählerstandes.
Hallo crazy horse, vielen Dank für Deine Antwort. Der Sinus soll bei dieser Pulsweitenmodulation intern verarbeitet werden. D.h. dass es sich hierbei auch nur um eine grafische Darstellung der zuvor errechneten Sinuswerte handelt. Du hast etwas von einer Tabelle geschrieben. Kann man sich das wie ein Array vorstellen? Wie wird das Zeitraster erzeugt? Wie kann ich einen harten zeitlichen Bezug zwischen den errechneten Sinuswerten herstellen? Jens
Hallo Jens, schau mal bei Atmel ins application note avr335. Hier wird beschrieben, wie man mittels PWM Audiosignale erzeugen kann. In dem App-Note wird ein Soundrecorder vorgestellt. Für deinen Fall reduziert sich das Problem dann auf die Darstellung lediglich einer Frequenz. Ich hoffe, das hilft dir weiter Oliver
Hallo Oliver, ich habe gerade das application note avr335 überflogen. Den Einsatz eines externen Flash's ist sehr interessant.... Das werde ich auf jeden Fall mit einbeziehen. Was jetzt das eigentliche Problem angeht, konnte ich leider keine Hinweise finden. Das Sinussignal soll idealerweise mit Hilfe des internen Counters in Bezug auf die Oszillatorfrequenz erzeugt werden. Dabei muss ich mich aber auf die Geauigkeit verlassen können.
Hallo Jens, ich denke, das ein Ansatz folgendermaßen aussehen könnte. 1. Du generierst dir eine Sinustabelle mit der gewünschten Auflösung (z.B unsigned char sinus[Periodenauflösung]). Hierbei währe unsigned char die Amplitudenauflösung. Die Anzahl der Arraywerte ist die Auflösung der Periodenlänge. 2. Jetzt könnte ich mir vorstellen, dass man mit einem Timer eine Zeitbasis definiert, in der die Arraywerte ausgelesen werden. Dieser wird dann dem PWM-Ausgang als Puls-Pausenverhältnis oder ähnliches zugeordnet. 3. Die Frequenz der PWM muss deutlich höher sein, als die zu generierende Sinusfrequenz (Faktor 10 ist ein guter Wert). Vielleicht bringt dich das ja weiter. Oliver
http://www.mikrocontroller.net/projects/dds/ Du musst das Programm nur so anpassen, dass der Funktionswert statt an den am Port angeschlossenen DA-Wandler an das PWM-Register gegeben wird. Und dann natürlich die Frequenz der DDS gaaaaanz stark reduzieren.
Hallo Leute, vielen Dank für Eure Tips. Da ich mit dem eingebauten PWM-Mechanismus nicht zufrieden bin, habe ich mir folgenden Lösungsweg ausgedacht. Die PWM (sinusbewertet) wird mittels eines geeigneten Algorithmus auf dem PC ausgerechnet und anschliessend im Controller abgespeichert. Ausgegeben wird das ganze dann mit Hilfe des 16-Bit Timer/Counters auf einen Port. Somit habe ich die ganzen rechen- und zeitintensiven Operationen auf den PC verschoben. mfg Jens
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.