Forum: Mikrocontroller und Digitale Elektronik PWM erzeugen - benötige Hilfe


von Patrick W. (yellow_dog)


Lesenswert?

Hallo liebes Forum,

ich hab da ein Problem. Ich komm echt nicht weiter. Und ich hoffe, dass 
ich mit Eurer Hilfe endlich zu einem Ergebnis komme.
Leider kann ich momentan mein Programm bzw. meine Ideen nicht testen, da 
der Mikrocontroller in der Schule liegt. Komm erst in einer Woche wieder 
dazu. Bis dahin will ich die Zeit nicht sinnlos vergolden, sondern will 
theoretisch das durcharbeiten. Achja. Ist mein erster Versuch einen 
Mikrocontroller zu programmieren! :)

So. Aufgabe ist es, eine PWM zu erzeugen. Ist mir auch gelungen. Hab nun 
das Datenblatt studiert, das ACR-GCC-Tutorial durchgelesen und mir 
einige Notizen gemacht.

/* ***************************************************************/
/* Programm: PWM auf AVR-Board mit ATMega8        */
/* Name: Patrick Willenshofer              */
/* Datum: 18.12.2011                */
/* ***************************************************************/

#include <avr/io.h>
int main (void)
 {
  DDRB = (1 << PB1 );
  // Freischalten des Ausganges PB1(OC1A) am PortB

  TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0);
  //Um die PWM starten zu können müssen Parameter für das Controll 
Register A (TCCR1A)
  //laut Tabellen gesetzt werden hier handelt es sich um eine 8-Bit, 
invertierende PWM

  TCCR1B = (1<<CS12);
  //Das Controllregister B (TCCR1B) ist für den Takt zuständig und kann 
ebenfalls
  //durch Parameter aus den Tabellen bestimmt bzw. eingestellt werden.

  OCR1A = 200;
  // Das Output Compare Register (OCR1A) gibt den Vergleichswert an.
 }

Lasst die Doku mal so neben stehen..

Ich habe jetzt einige Fragen:

1. Beispiel: TCCR1B = (1<<CS12); <<--- clkI/O/256 (From prescaler) - Was 
ist clkI/O? Ist das nun die Frequenz, mit der die PWM ausgegeben wird?!
2. Was bewirkt der CTC-Modus? Hab schon einiges im Forum gelesen, dass 
der CTC-Modus empfohlen wird?
3. Ich will noch ein Poti an ADC0 und ein Poti an ADC1 anschließen, um 
je Frequenz und Pulsbreite zu verändern.

Ich kann es laut dem Tutorial nicht nachvollziehen, wie das 
funktionieren soll? Ich wurde darauf hingewiesen, es nachzulesen. 
Irgendwas mit Routinen - aber dazu finde ich nichts!

Ich bitte euch wirklich um Hilfe. Achja - ADC hab ich schon alles 
gelesen. Die einzelnen Register und alles. Nur wie ich eben den Wert, 
nachdem ich ihn eingelesen habe, ihn dazu bringe, die 
Frequenz/Pulsbreite zu verändern, verstehe ich nicht mehr. :(

Mein µC ist ein Atmel Atmega8.

Ich wär euch sehr dankbar!

von Detlev Neumann (Gast)


Lesenswert?

Hallo Patrick,

dieses ist Super im GCC-Tutorial beschrieben

Gruß

Detlev

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#PWM_.28Pulsweitenmodulation.29

von Patrick W. (yellow_dog)


Lesenswert?

Hallo Detlev,

ich hab mir den Artikel über Pulsweitenmodulation und ADC schon 
durchgelesen. Aber ich finde da echt nirgends das Beispiel mit 2 Potis 
um Frequenz und Pulsbreite zu verändern?

Lg

von Karl H. (kbuchegg)


Lesenswert?

Patrick Willenshofer schrieb:
> Hallo Detlev,
>
> ich hab mir den Artikel über Pulsweitenmodulation und ADC schon
> durchgelesen. Aber ich finde da echt nirgends das Beispiel mit 2 Potis
> um Frequenz und Pulsbreite zu verändern?


Das gibts auch so nicht fertig.
ABer man kann es aus den Einzelteilen zusammenstoppeln, wenn man 
verstanden hat wie die Einzelteile funktionieren.

Tip: Um eine PWM mit (in Grenzen) variabler Frequenz in Hardware zu 
erzeugen, brauchst du einen PWM Modus, bei dem du den TOP Wert in einem 
Register vorgeben kannst.

von Karl H. (kbuchegg)


Lesenswert?

Patrick Willenshofer schrieb:

> 1. Beispiel: TCCR1B = (1<<CS12); <<--- clkI/O/256 (From prescaler) - Was
> ist clkI/O? Ist das nun die Frequenz, mit der die PWM ausgegeben wird?!

Das ist die Frequenz mit der dein µC läuft.

> 2. Was bewirkt der CTC-Modus? Hab schon einiges im Forum gelesen, dass
> der CTC-Modus empfohlen wird?

Er bewirkt, dass der Timer nicht bis zu seiner durch die Bitbreite 
vorgegebenen Höstzahl hochzählt, sondern schon vorher bei einem anderen 
Wert wieder auf 0 zurückgesetzt wird.

> Ich kann es laut dem Tutorial nicht nachvollziehen, wie das
> funktionieren soll? Ich wurde darauf hingewiesen, es nachzulesen.
> Irgendwas mit Routinen - aber dazu finde ich nichts!

Dann musst du als nächstes verstehen, wie PWM auf Hardware Ebene genau 
funktioniert. Wie der Timer arbeitet und wie daraus ein PWM Puls 
entsteht.


> nachdem ich ihn eingelesen habe, ihn dazu bringe, die
> Frequenz/Pulsbreite zu verändern, verstehe ich nicht mehr. :(

vergiss fürs erste den ADC. Der ist nicht wichtig, wenn du dich erst mal 
mit PWM beschäftigst. Ob die PWM durch Wert vom ADC beeinflusst werden 
oder ob du die Werte erst mal einfach nur als Konstante Zahlen vorgibst, 
ist der PWM ja egal.
Du musst wissen: Welche PWM Modi gibt es und welchen brauch ich?
WElche Register muss ich für diesen Modus wie einstellen?
Welche Zahlenwerte bewirken welche Veränderung des PWM-Pulses (dazu 
musst du aber wiederrum wissen, was PWM eigentlich ist und wie sie vom 
Timer erzeugt wird. Und das ist im Grunde sehr simpel)

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.