[Attiny24] Timer richtig configuriert ?

OP #2212515
Lesenswert?

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
}
Gast #2212690
Lesenswert?

In dem Artikel (Versuch 1) wird es gemacht, weil der Timer1 nicht im CTC 
Modus läuft. Weil dann TCNT1 nicht automatisch auf 0 gesetzt wird, 
schiebt man die nächste Vergleichsgrenze OCR1A quasi um T_PWM versetzt 
vor TCNT1 her. Mit dem aktivierten CTC so wie in deinem Code ist das 
kein richtiges Vorgehen mehr. Dann sollte OCR1A einmalig berechnet 
werden (in main z.B.).
OP #2212745
Lesenswert?

Helfer schrieb:
> In dem Artikel (Versuch 1) wird es gemacht, weil der Timer1 nicht im CTC
> Modus läuft. Weil dann TCNT1 nicht automatisch auf 0 gesetzt wird,
> schiebt man die nächste Vergleichsgrenze OCR1A quasi um T_PWM versetzt
> vor TCNT1 her. Mit dem aktivierten CTC so wie in deinem Code ist das
> kein richtiges Vorgehen mehr. Dann sollte OCR1A einmalig berechnet
> werden (in main z.B.).

Vielen Dank - mit den Änderungen funktioniert es jetzt

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