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);
}
}
Nein. Schau dir mal an, wie eine Servo-PWM funktioniert. Die Position des Servos wird über die Pulsbreite kodiert. Oliver
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.