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!