Hallo zusammen,
Ich baue gerade eine Motorsteuerung auf Basis eines Attiny und des
TLE4202.
Einfaches An/Aus der Motoren funktioniert bestens. Aber wenn ich jetzt
versuche die Motorsteuerung auf Software-PWM umzustellen, wie im Artikel
http://www.mikrocontroller.net/articles/Soft-PWM
beschrieben, ist das Verhalten völlig merkwürdig. Der Motor läuft an,
stoppt, läuft wieder an. In Programm ist die main() schleife sonst leer,
also nichts was die motoren beeinflussen kann.
Da der Rest läuft wollte ich fragen ob das an der Einstellung des Timers
liegen kann ? Bei Bedarf kann ich auch den ganzen Quelltext posten.
Init in der Main
1 | #define F_CPU 8000000UL
|
2 | #define F_PWM 100 // PWM-Frequenz in Hz
|
3 | #define PWM_STEPS 256 // PWM-Schritte pro Zyklus(1..256)
|
4 |
|
5 | TCCR1B |= (1 << WGM12); //CTC Mode
|
6 | TCCR1B |= (1 << CS10); //no prescaling
|
7 | TIMSK1 |= (1 << OCIE1A); //Activate Interrupt
|
ISR
1 | ISR(TIM1_COMPA_vect)
|
2 | {
|
3 | static uint8_t pwm_cnt = 0;
|
4 | uint8_t port_set;
|
5 |
|
6 | OCR1A += (uint16_t) T_PWM;
|
7 |
|
8 | port_set = MOTOR_PORT & (~((1 << MOTOR_A_OUT1) | (1 << MOTOR_A_OUT2) | (1 << MOTOR_B_OUT1) | (1 << MOTOR_B_OUT2) | (1 << MOTOR_C_OUT1) | (1<< MOTOR_C_OUT2)));
|
9 |
|
10 | if (rxbuffer[0] > pwm_cnt)
|
11 | port_set |= (1 << MOTOR_A_OUT1);
|
12 |
|
13 | if (rxbuffer[1] > pwm_cnt)
|
14 | port_set |= (1 << MOTOR_A_OUT2);
|
15 |
|
16 | if (rxbuffer[2] > pwm_cnt)
|
17 | port_set |= (1 << MOTOR_B_OUT1);
|
18 |
|
19 | if (rxbuffer[3] > pwm_cnt)
|
20 | port_set |= (1 << MOTOR_B_OUT2);
|
21 |
|
22 | if (rxbuffer[4] > pwm_cnt)
|
23 | port_set |= (1 << MOTOR_C_OUT1);
|
24 |
|
25 | if (rxbuffer[5] > pwm_cnt)
|
26 | port_set |= (1 << MOTOR_C_OUT2);
|
27 |
|
28 | MOTOR_PORT = port_set;
|
29 |
|
30 |
|
31 | if (pwm_cnt == (uint8_t) (PWM_STEPS - 1))
|
32 | pwm_cnt = 0;
|
33 | else
|
34 | pwm_cnt++;
|
35 | }
|