Forum: Projekte & Code Ansteuerung von Modellbauservos via TWI mit ATTiny25 in C


von Michael S. (Gast)


Angehängte Dateien:

Lesenswert?

Nachfolgend ist eine kompakte Ansteuerung für bis 3 Modellservos 
vorgestellt, die als USI/TWI-Slave über die TWI-Schnittstelle 
angesprochen wird.

Als Hardware wird ein in AVR-GCC programmierter ATTiny25 benutzt.

Die Servopositionen werden durch den Offset bezogen auf den Neutralpunkt 
(die Servo-Mittelstellung) definiert.
Für jeden Servo kann unabhängig eingestellt und im Eeprom abgelegt 
werden:

- die Mittelstellung des Servos (Neutralpunkt),
- die Startposition des Servos nach dem Einschalten,
- die Drehgeschwindigkeit des Servos.

Weitere Beschreibung in der USI_Servo_Readme.pdf

Michael S.

von Michael S. (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, da habe ich die falsche Datei erwischt.
Der Programmcode steht in dieser Datei.

mfg

Michael S.

von Michael S. (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch ein Update.

Ein Problem beim Timing trat auf, wenn die Impulslänge im Bereich von 
256 ..257 * 8us lag:

Dann war die ISR, die einen neuen Compare-Wert schreiben muss, zu 
langsam.
Der Counter hatte bereits über den neuen Wert hinaus gezählt - und der 
Impuls verlängerte sich abrupt auf 4ms.

Durch zeitliches Vorverlegen des Compare-Interrupts konnte das Problem 
beseitigt werden.

Es zeigt allerdings auch eine Schwäche des Konzeptes, auf die 
hingewiesen werden muss:

Der Aufruf von Interrupt-Routinen der USI-Schnittstelle kann dazu 
führen, dass der CompA-Interrupt mit geringfügiger Verzögerung zur 
Ausführung kommen.
Die Folge ist, dass während einer TWI-Kommunikation sporadisch einzelne 
Impulse an den Servos länger ausfallen können als sie sollen.

Zwar kann durch einen höheren CPU-Takt und durch die Codierung der 
USI-ISR's die Verzögerung minimiert werden, grundsätzlich zu vermeiden 
ist sie aber nicht.


mfg

Michael S.

von Gerhard W. (gerhard_w)


Lesenswert?

Hallo,

nur mal so als Denkansatz:
hatte schon mal das selbe Problem wie du auch, daß der Timer nicht über 
2ms hinaus gereicht hat. Wenn ich es dann so gelöst habe, wie Du es auch 
machst, einfach den Rest nochmal weiterzuzählen, war dort immer ein 
kleiner Ruckler merkbar.
Ich habs dann so gelöst, daß ich den Timer 0,5ms zählen lies und dann 
erst den Rest bis zur gewünschten Impulsdauer.
Somit hab ich bei jeder Impulslänge den gleichen Ablauf im Programm und 
hatte dann einen flüssigeren Ablauf.


Gruß
Gerhard

von Michael S. (Gast)


Lesenswert?

Hallo Gerhard,

wenn ich Dich richtig verstehe, dann habe ich das Problem beim Überlauf 
im letzten Update genauso gelöst wie Du beschrieben hast.

Ich habe mir den Übergang von 255 auf 256 mit dem Logic-Analyser 
angesehen, es sich keine "Ruckler" mehr erkennbar.

mfg

Michael S.

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.