pwm programm,atmega324

OP #6193512
Lesenswert?

Hallo,

ich bin neu in diesem Forum und habe ein Programm,das ich nicht 
nachvollziehen kann.Hierbei gehts um einen Servo der an einem Atmega324 
angeschlossen ist und mit PWM vor und zurück bewegt werden muss.
Der atmega324 hat eine Frequenz von 1Mhz und der Servo braucht 50Hz.
Benutzt wird Fast PWM,Prescaler: 1,Nicht-invertierte Modus.Der max.Wert 
im Fast PWM beträgt 19999(da Servo Periode von 20 ms hat) und dieser 
wird in ICR1 geschrieben.

Das folgende Programm ist korrekt allerdings kann ich nicht 
nachvollziehen warum er vor und wieder zurück fährt.Bedeuten denn nicht 
beide Anweisungen in der while Schleife eine Vowärtsbewegung?

#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRD |= 0xFF;
TCCR1A |= 1<<WGM11 | 1<<COM1A1 | 1<<COM1A0;
TCCR1B |= 1<<WGM13 | 1<<WGM12 | 1<<CS10;
ICR1A = 19999;
OCR1A = ICR1 - 2000; //17999
while (1)
{
      OCR1A = ICR1 - 800;
     _delay_ms(100);
    OCR1A = ICR1 - 2200;
   _delay_ms(100);
    }
}
#6193537
Lesenswert?

Einmal wird eine Pulsdauer von 800µs = 0,8ms ausgegeben, das ist 
Rechtsanschlag. Nach 100ms wird eine Pulsdauer von 2200µs = 2,2ms 
ausgegeben, das ist Linksanshlag (oder jeweils umgekehrt...).

Das Servo wird sich dabei mit Maximalgescheindigkeit bewegen aber 
vermutlich das Ende nicht erreichen. Servos brauchen je nach Typ für 
60-90° Drehwinkel zwischen 100ms und 300ms. In der Zeit schaltet du 
bereits wieder um.
Mache das ganze mal in kleineren Schritten in einer Schleife
1
for(uint16_t PULS=800; Puls <= 2200; Puls+=100) {
2
   OCR1A = ICR1 - Puls;
3
   _delay_ms(100);
4
}

und danach in die andere Richtung...

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