-
-
Moderator
Robotik Visionär
Hallo
So wird das nichts werden. Wenn der Servoimpuls 1ms dauern soll und er mit dem Wert 100 erzeugt werden soll, dann muss die ISR alle 10µs aufgerufen werden (100*10µs=1000µs=1ms). Das sind 100000 Aufrufe pro Sekunde!
TCCR2 |= (1<<WGM21) | (1<<CS20); //Prescale=1, CTC mode
OCR2 = F_CPU/100000; //alle 10µS ein IRQ
(solche Kommentare sind immer hilfreich und können auch mitkopiert werden!)
Bei Prescaler=1 und OCR2 =1000000/100000=10 hat die ISR genau 10 Kontrollertakte Zeit zur Ausführung (mit Aufruf der ISR, Prolog, Epilog...!) Da deine ISR länger braucht als 10 Takte gibt es einen Überlauf und das Timeing ist futsch.
Lösung:
Schnellerer Porzessortakt. Bei (internen) 8MHz hätten wird 80 Takte Zeit für die ISR. Oder kleinere Auflösung der Servopositionen. Bei 100µs-Zyklen hätten wir 100 Takte für die ISR. Allerdings gingen die Positionsangaben dann nicht von 50 bis 150 sondern nur von 5 bis 15.
btw: Um alle 20ms (nicht nach 20ms!) einen Impuls zu senden muss diese Zeile geändert werden (bei 100µs-Takt sollte hier 200 stehen):
if(count<2000)count++;
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen