PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fast PWM zu langsam? Denkfehler oder Rechenfehler?



oberallgeier
26.09.2012, 17:03
Hallo Alle,

meine Fast-PWM läuft langsamer als berechnet.

Umgebung: mega328/20 MHz
// ================================================== ============================ =
// == PWM-Routinen zur Motoransteuerung
void TC1PWM_init(void) //Init Timer/Counter1 für Erzeugung des PWM-Signals
{ //
TCCR1A |= (1<<COM1A1)|(1<<COM1B1); //Clear/set OC1A/OC1B on Cmp Match, S132
// OC1A/OC1B ist Port PB1/B2
TCCR1A |= (1<<WGM10)|(1<<WGM12); // Fast PWM, TOP=0xFF=dez255, doc S133
TCCR1B |= (1<<CS11); // Prescaler ist clk/8 doc S135
TIMSK1 &= ~(1<<OCIE1A)|(1<<OCIE1B); // T/C1 Oput CmpA+B Match intrrpt dsabld
TIMSK1 &= ~(1<<TOIE1); // T/C1 Ovrflw intrrpt dsabled ~S137
OCR1A = 0; // PWM auf Null setze
OCR1B = 0; // PWM auf Null setzen
}
// ================================================== ============================ =
void setPWM1_re (uint8_t speed) // Geschwindigkeit Motor1, Mot12 (rechter)
{OCR1A = speed;} // PWM auf PB1/OC1A
// ================================================== ============================ =
void setPWM2_li (uint8_t speed) // Geschwindigkeit Motor2, Mot34 (linker)
{OCR1B = speed;} // PWM auf PB2/OC1B
// ================================================== ============================ =

Nach meiner Rechnung (Taschenrechner) ergibt das also 20Mio Maschinenzyklen div Prescaler8 div 255-PWM-TOP 9803 PWM-Zyklen. Der Oskar zeigt mir aber nur rund 5000 PWM-Zyklen (rund 10 bei 10*0,2ms/DIV). Kann mir bitte jemand ne richtige Rechnung aufmachen?

Danke im Voraus.

radbruch
26.09.2012, 17:31
Hallo

Vielleicht schwingt der Quarz nicht richtig. Betreibst du eine (asyncrone) serielle Schnittstelle mit dem mega238?

Beim Setzen der ersten Bits in den Kontrollregistern würde ich mit = anstelle von != beginnen um etwaigen Schrott in den Registern zu löschen. Sonst ist mir noch kein (Denk-)Fehler aufgefallen.

Gruß

mic

Searcher
26.09.2012, 17:37
TCCR1A |= (1<<WGM10)|(1<<WGM12); // Fast PWM, TOP=0xFF=dez255, doc S133


Hallo,
Timer sind mein neues Hobby :-) Das WGM12 Bit ist in TCCR1B ;)

Gruß
Searcher

oberallgeier
26.09.2012, 17:51
Danke, mic, für die schnelle Antwort.

mic> Vielleicht schwingt der Quarz nicht richtig.
Die Bordzeit wird aus einem 20 kHz-Signal des Timer/Counter 0 abgeleitet. Jede 20000 Counts wird eine LED getoggelt - mein Standardverfahren. Die LED blinkt mit 2 sec Periodendauer (1sec an, 1sec aus). Das ist geprüft und sollte stimmen. BTW: in den Current Configuration Options sind von Beginn an auch 20 MHz eingetragen.

mic> Betreibst du eine (asyncrone) serielle Schnittstelle mit dem mega238?
Ja. Mit #define BAUD 230400 im Controller klappts bestens beiUSB-Adapter auf 256000 mit Terminal/br@y. Der Taktfehler ist aber in der momentanen sehr sparsamen Testphase, da läuft "nix" ausser dem genannten Timer, die PWM wird in einer Schleife for ( ; ; ) gewobbelt.

mic> Beim Setzen ... Kontrollregistern ... mit = anstelle von != beginnen ...
??? Ich dachte, meine Syntax "TCCR1A |= (1<<COM1A1)|(1<<COM1B1);" ist Standard bei C ?? Aber ich probiers mal.

Danke.

oberallgeier
26.09.2012, 17:54
... Timer sind mein neues Hobby ... Das WGM12 Bit ist in TCCR1B ...Möge Dir (und uns) Dein Hobby ewig erhalten bleiben. So stehts auch in meinem Datenblatt 8271E–AVR–07/2012 auf Seite 134 - und ich schwöre, ich habs gelesen. Aber eben schlampig *schnief*.

Whow - danke Searcher !

Und die Softwareanpassung bestätigt den Datenblattinhalt. Danke nochmal.

Searcher
26.09.2012, 18:08
:-) :-) :-)

Gerne, ist doch mein Hobby und wer beißt sich nicht schon mal an sowas fest.

Gruß
Searcher