Ansteuerung von Modellbauservos via TWI mit ATTiny25 in C

Gast #2858919
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.
Angehängte Dateien:
Gast #2860006
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.
Angehängte Dateien:
#2860249
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
Gast #2860397
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.

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