www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Verständnisfrage


Autor: Elias B. (bouni)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Ich weiss das das schon oft gefragt wurde, aber eine Klare Antwort hab 
ich auch nach Tagelangem suchen noch nicht gefunden.

Im Anhang ist eine Grafik die sich an  die des Tutorials anlehnt.

Ist das was ich in dieser Grafik gezeichnet habe soweit korrekt ??

Ich möchte mittels der PWM eines 8515 einen Servo (Conrad 4,95) 
ansteuern.
Ist es richtig das die Periodendauer 20ms betragen sollte, aber eher 
unkritisch ist, und der Puls zwischen 1 und 2ms ??

Ist meine Berechnung der Obergrenze und des Vergleichswertes so richtig 
??

Dank für eure Antworten!

Bouni

Autor: PicPic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Elias B. (bouni)

Nach meinen Informationen hast du deine Fragen schon selbst richtig 
beantwortet.

Autor: Elias B. (bouni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Hab mir das Tutorial nochmal durchgelesen und bin stutzig geworden.
Was hat es mit den 8, 9 oder 10Bit auf sich?

Im Tutorial steht das dadurch die Obergrenze gesetzt wird (10-Bit = 
1023),
Im Beispielprogramm jedoch steht
//  den Endwert (TOP) für den Zähler setzen
//  der Zähler zählt bis zu diesem Wert
 
ICR1 = 0x6FFF; -> 28671 dez


Wieso ist die Obergrenze grösser als 10-Bit ??
TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);

Denn hier wird ja WGM11 & WGM10  auf 1 gesetzt = 10Bit PWM.

Ich steh auf m Schlauch :)

Danke für eure Hilfe

Bouni

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das is sicher n Druckfehler.
Wenn du das binär mal anschaust, muss statt der 6 eine 3 stehen.
Also 0x3FFF

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Elias B. wrote:
> Hab mir das Tutorial nochmal durchgelesen und bin stutzig geworden.
> Was hat es mit den 8, 9 oder 10Bit auf sich?
Das legt eine feste Obergrenze (TOP) und damit abhängig vom 
eingestellten Prescaler-Wert eine feste PWM-Frequenz fest.

> Im Tutorial steht das dadurch die Obergrenze gesetzt wird (10-Bit =
> 1023),
> Im Beispielprogramm jedoch steht
> [...]
> Wieso ist die Obergrenze grösser als 10-Bit ??
>
>
> TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
> 
>
> Denn hier wird ja WGM11 & WGM10  auf 1 gesetzt = 10Bit PWM.
Und was ist mit WGM12 und WGM13 im TCCR1B? Wenn WGM13 auch gesetzt ist 
(was ich aus dem Zusammenhang heraus mal vermute), dann ist das nämlich 
keine 10-Bit-PWM, sondern Phase Correct PWM mit ICR1 als TOP...

Bei 8-, 9- und 10-Bit-PWM wird der TOP-Wert nicht explizit angegeben, 
sondern ist fest vorgegeben (eben je nachdem 0xFF, 0x1FF oder 0x3FF). 
Wenn im ICR1 ein TOP-Wert angegeben wird, dann handelt es sich um einen 
anderen PWM-Modus, bei dem TOP frei gewählt werden kann.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Micha R. wrote:
> Das is sicher n Druckfehler.
Und nein, das ist höchstwahrscheinlich kein "Druckfehler"

> Wenn du das binär mal anschaust, muss statt der 6 eine 3 stehen.
> Also 0x3FFF
Siehe oben. 0x3FFF wären übrigens 14 Bit, und die gibt's nicht als feste 
Obergrenze...

Es gibt übrigens im Datenblatt eine schöne, übersichtliche und mit 
Liebe gemachte Tabelle (steht bei der Beschreibung der Steuerregister 
des Timers), in der alle Timer-Betriebsarten mit den dazugehörenden 
Konfigurationen der 4 Steuerbits WGM13..10 dargestellt sind. Und jetzt 
frag bitte keiner, wo man denn das Datenblatt herbekommt...

Autor: Elias B. (bouni)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Der Vollständigkeit halber:

Hier die Tabelle:


Bouni

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> Micha R. wrote:
>> Das is sicher n Druckfehler.
> Und nein, das ist höchstwahrscheinlich kein "Druckfehler"
>
>> Wenn du das binär mal anschaust, muss statt der 6 eine 3 stehen.
>> Also 0x3FFF
> Siehe oben. 0x3FFF wären übrigens 14 Bit, und die gibt's nicht als feste
> Obergrenze...

Ich entschuldige mich vieltausendmal für diese Fehlinformation von mir.
Soll nicht wieder vorkommen.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Elias B. wrote:
> Der Vollständigkeit halber:
>
> Hier die Tabelle:
Das hättest Du Dir sparen können, steht alles im Datenblatt (und v.a. in 
besserer Qualität!).

Allerdings hatte ich mich oben verguckt. Du hattest geschrieben, dass 
WGM11 und WGM10 gesetzt sind. Dann macht das mit ICR1 keinen Sinn. 
ICR1 wird nur in den Modi 8, 10, 12 und 14 benötigt. Der "Fehler" liegt 
also woanders.

EDIT:
Im Tutorial (habe grad nachgesehen) steht
erstens eindeutig, dass es sich auf PWM-Modus 14 bezieht (wie von mir 
bereits weiter oben wegen der Benutzung von ICR1 vermutet) und
zweitens nichts davon, dass WGM10 gesetzt werden soll! Klar, dass das 
mit den Angaben widersprüchlich ist. Das "1 << WGM10" gehört da schlicht 
und ergreifend nicht hin. Wenn Du Änderungen am Code des Tutorials 
machst, darfst Du Dich nicht wundern, wenn er nicht das macht, was da 
steht.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, nach weiterer Recherche neue Erkenntnisse:
In 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu... 
steht eine Beispielzeile im Text, in der beide WGM-Bits in TCCR1A 
gesetzt werden. Diese Zeile gehört aber nicht zum 
Initialisierungsbeispiel für Modus 14 darunter, aus dem die Zeile "ICR1A 
= 0x6FFF;" stammt! Deshalb gehören die beiden Zeilen, auf die sich die 
Frage bezog, gar nicht zusammen. Das Beispiel zur Initialisierung für 
Modus 14 ist soweit völlig korrekt und vollständig. Die andere Zeile ist 
nur als Beispiel für die Verwendung der (mittlerweile gar nicht mehr so) 
neuen Bezeichnungen der Bits gedacht.

Autor: Elias B. (bouni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich bin grade wieder am servo probieren.

Ich bin jetzt so weit das er an den Anschlag im Uhrzeigersinn läuft :(


Ich arbeite mit folgendem Code auf dem Atmega8515L:
#include <avr/io.h>
 
int main()
{

  DDRB = (1 << PD5 ); 

// beim Atmega 8515L der OC1A
 
  TCCR1A = (1<<COM1A1) | (1<<WGM11);
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS01);

// CS02 CS01 CS00 Description
//   0    1    0  clkI/O/8 (From prescaler)
//
// Mode WGM13 WGM12 WGM11 WGM10    Typ    TOP UPDATE
//  14    1     1     1     0   Fast PWM ICR1 BOTTOM 
//
// COM1A1 = 1 :Clear OC1A/OC1B on Compare Match (Set output to low level).

  ICR1 = 0x1200; // = 4608 dezimal

  OCR1A = 0x0159; // = 345 dezimal
 
 
  while( 1 )
    ;  
}

Mein CPU Takt ist 3686400 Hz
Mein Prescaler ist 8
Prescaled Takt = 460800Hz
Periodendauer = 1/460800Hz = 2,17e-6 sek
für 20ms brauche ich demnach 0,02s/2,17e-6s = 9216 Perioden,
 Da aber nur die hälfte der 20ms hochzuzählen ist ist die Obergrenze bei 
4608 zu setzen.
4608 dez = 0x1200

Da der Servo zwischen 1 und 2ms Takte braucht um die Position anzufahren 
muss ich den Zählerwert zwischen
4608/20ms = dez 230
und
4608/(20ms*2) = dez 460
wählen

die Mittelstellung sollte demnach bei dez 345 liegen (0x159)

Das tue ich doch, aber wo liegt mein Fehler ??

Ich bin ratlos!

Danke im Voraus


Bouni

Autor: Elias B. (bouni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt tuts komischer weise ?!

Bouni

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.