Forum: Mikrocontroller und Digitale Elektronik [Attiny24] Timer richtig configuriert ?


von Stefan H. (stefan_h16)


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
}

von spess53 (Gast)


Lesenswert?

Hi

Und an welcher Stelle setzt du OCR1A?

MfG Spess

von Stefan H. (stefan_h16)


Lesenswert?

spess53 schrieb:
> Hi
>
> Und an welcher Stelle setzt du OCR1A?
>
> MfG Spess

In der ISR.
MFG
Stefan

von Helfer (Gast)


Lesenswert?

> In der ISR.

Seltsam. Warum machst du so was?

von Helfer (Gast)


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.).

von Stefan H. (stefan_h16)


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

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.