Hallo, ich möchte einen Servo ansteuern. Dazu muss ja alle 20ms ein Impuls von 1-2ms Länge erzeugt werden. Nimmt man dafür am besten den Timer und Konfiguriert diesen für PWM, oder lieber den Pin manuell in der ISR toggeln? VG
Wie du möchtest. Wenn nur einen Servo gesteuert werden soll, ist die Verwendung der HW-Funktionen am einfachsten. Falls viele Servos bedient werden sollen muß man das per Software machen, z.B. http://www.mikrocontroller.net/articles/Soft-PWM
So habs ich gemacht ...
1 | /************************************************************************************************************/
|
2 | void EnableServoTestTimer () |
3 | {
|
4 | DisableServoTestTimer (); |
5 | // External crystal 16 MHz, Prescaler 8
|
6 | // Enable fast PWM mode 14 (table 47 page 113 ATMega16 Doc):
|
7 | TCCR1A = (1 << COM1A1) | (1 << WGM11); |
8 | // Set prescaler 8
|
9 | TCCR1B = (1 << CS11) | (1 << WGM13) | (1 << WGM12); |
10 | // Set PWM
|
11 | ICR1 = (uint16_t)40000; |
12 | OCR1A = (uint16_t)ServoPosition; // min: 1800, neutral: 3000 max: 4200 |
13 | sei (); |
14 | }
|
Grüße, Michael
nope ... bzw. es kommt auf das verwendete Servo und die geforderte Genauigkeit an, aber in der Regel eher nicht ... Grüße, Michael
Hmm denn der Timer1 Ausgang ist schon belegt. Könnte ich aber nicht einfach in der 8-Bit Timer ISR µs zählen? Dann dürfte doch die Genauigkeit ausreichen.
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.