Forum: Mikrocontroller und Digitale Elektronik [Atmega] Software-PWM mit Compare-Match- und Overflow-Interrupt


von Electric S. (electricsheep)


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!

von Electric S. (electricsheep)


Lesenswert?

Mhm, anscheinend funktioniert die Software-PWM auf diese Weise nicht...

Inzwischen habe ich mir den Compare-Match-Interrupt gespart und eine 
Software-PWM ähnlich wie bei Soft-PWM programmiert.

closed

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.