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.
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.