[Atmega] Software-PWM mit Compare-Match- und Overflow-Interrupt

OP #2583218
Lesenswert?

Hallo an alle,
an einem Atmega (Frequenz 18,432Mhz) versuche ich gerade, für eine 
Motorsteuerung eine Software-PWM zu programmieren (weil ich mehr Pins 
brauche, als bei Hardware-PWM verfügbar sind).
Mein Ansatz ist, den Motor bei einem Overflow-Interrupt einzuschalten 
und bei einem Compare-Match wieder auszuschalten. Damit kann ich die 
Geschwindigkeit direkt über OCR0A regeln:
1
int main(void){
2
  //PWM-Timer initialisieren
3
  TCCR0A = (1<<WGM00); // Timer 0: 9 kHz, Motor-PWM
4
  TCCR0B = (1<<CS01);
5
  OCR0A = 255;
6
  TIMSK0 = (1<<OCIE0A)|(1<<TOIE0);
7
  sei();
8
}
9
...
10
ISR(TIMER0_COMPA_vect){
11
  M0_OFF
12
}
13
//Mindestgeschwindigkeit
14
#define M_OFFS 15
15
ISR(TIMER0_OVF_vect){
16
  if(speed0>M_OFFS){ //positive Geschwindigkeit
17
    M0_V //Motor nach vorne drehen
18
  }else if(speed0<-M_OFFS){ //negative Geschwindigkeit
19
    M0_H //Motor nach hinten drehen
20
  }else{
21
    M0_OFF //Motor nicht drehen
22
  }
23
}

Ist das soweit richtig?
Beim Ausprobieren habe ich festgestellt, dass der Motor (obwohl 
OCR0A=255) nur etwa mit halber Kraft dreht. Woran liegt das?

Schonmal vielen Dank im Voraus!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren