www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Servo zittert bei Ansteuerung per PWM mit attiny13


Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte einen Modellbau-Servo mit einem (alten) attiny13 ansteuern.

Wenn mein Testprogramm nichts tut (keine Interrupts o.Ä.) außer per 
Hardware-PWM das Signal für die Mittelstellung (Pulsdauer 1.5ms, 
Frequenz 20Hz) auszugeben, dann stellt sich der Servo wie gewünscht in 
Mittelstellung. Leider steht er dort jedoch nicht, sondern zittert 
leicht hin und her.

Ich habe hier und in anderen Foren viel dazu gelesen, und zahlreiche 
Ursachen ausgeschlossen:

- Getrennte Stromversorgung für Servo und uC hergestellt, ohne 
Veränderung
- Kondensatoren 100pF zwischen VCC und GND etc.

Mir scheint, dass der attiny 13 einfach ein "unsauberes" PWM Signal 
generiert. Aber eigentlich sollten der interne Oszillator (mit 4.8MHz 
und CKDIV8 getaktet) doch hinreichend präsize sein? Ein Umschalten auf 
9.6MHz (natürlich mit entsprechende Anpassung des Prescaler etc.) 
schafft hier auch keine Abhilfe.

Kann es sein dass das PWM-Signal dass der attiny13 ausgibt wirklich so 
unsauber ist?

Ich habe leider in den nächsten 6 Wochen kein Oszi um das zu messen...

Viele Grüße,
Groki

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
häng mal einen externen quarz an den controller und erhöhr die pwm 
frequenz auf 50Hz

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Andy,

danke für die BLITZschnelle Antwort!

20Hz war ein Typo, ich meinte 50Hz. Das sind dann 20ms ;-)

Ich hab grad kein Quarz. Ist es wahrscheinlich dass der interne 
Oszillator SOOO ungenau ist? Dann würde ich morgen ein Quarz kaufen 
gehen...!

groki

Autor: Silvan König (silvan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andi D. schrieb:
> häng mal einen externen quarz an den controller und erhöhr die pwm
> frequenz auf 50Hz

Rechtschreibung?
Ich würde erstmal ohne externen Quartz testen (aber auf jeden Fall die 
Frequenz auf min. 50Hz erhöhen).

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte die Frequenz auch schon bei 100Hz, hab aber gelesen dass 
manche Servos eine Periode von 10ms und weniger nicht so gern mögen. Bin 
daher wieder auf 50Hz umgestiegen.

Ich hab noch ein 8MHz Quarz gefunden. Mir ist aber unklar wie ich das 
nun anschliesse. Ich kenne das vom Atmega88, dort verbindet man den 
Quarz mit den Pins XTAL1 und XTAL2. Diese Pins gibts aber laut 
Datenblatt nicht beim attiny13, es gibt nur einen Pin CLKI.

Später im Datenblatt steht nur, dass hier eine "clock source" verbunden 
wird, wie schließe ich denn das Quarz richtig an?

Danke!!
groki

Autor: smoke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servo zittert weil attiny13 alt (und unerfahren) ist. Verbessere deinen 
ProgStil und er bleibt fast ganz ruhig.

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi smoke,

super dass Du meinen Programmierstil kennst ohne ihn je gesehen zu 
haben.

Könntest Du noch erklären was ich am Programmierstil verbessern soll, 
wenn mein Programm lediglich so aussieht:

- setze Register für inverted PWM an PB1 mit 50Hz Frequenz und 1.5MHz 
pulsweite
- while(1);

Hier im Forum gibt es viele gute Leute die einem bei Problemen 
weiterhelfen. Aber ein generisches "verbessere Deinen ProgStil" ist echt 
nicht hilfreich.

groki

Autor: Hein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
groki schrieb:
> - Kondensatoren 100pF zwischen VCC und GND etc.

Nimm davon mal testweise 1000 Stück.

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hein schrieb:
>> - Kondensatoren 100pF zwischen VCC und GND etc.
>
> Nimm davon mal testweise 1000 Stück.

Nee lieber einen mit 100nF ;-)

Sorry auch ein Typo. Hab heute abend schon viel Zeit vorm Computer 
verbracht mit dem Problem, bin etwas unkonzentriert... War auch ein 
Typo.

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach mal einen Widerling (ca. 1 kOhm) in die Signalleitung.

avr

Autor: NurEInGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
groki schrieb:
> super dass Du meinen Programmierstil kennst ohne ihn je gesehen zu
> haben.

Eben - haben wir nicht.
Vielleicht wollte der Kollege Dir damit durch die Blume sagen :
  Poste doch einfach mal Deine Sourcen. Vielleicht fällt uns da was auf 
?

Machmal sieht man ja einfach den Wald vor lauter Bäumen nicht, hat 
irgend eine Kleinigkeit in der Software falsch gemacht, und kommt beim 
besten Willen nicht drauf, weil man bei seiner eigenen Software immer 
Betriebsblind ist.

Wenn dann ein anderer "unvorbelastet" draufschaut, dann fällt es gleich 
auf.
Muss nicht der Grund sein - könnte aber doch sein.

Autor: AS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist denn das für ein Servo.
Poste doch mal Typ und Hersteller.

Es gibt Billigservos, die außer zittern nix anderes können ;-)

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NurEInGast schrieb:
> Eben - haben wir nicht.
> Vielleicht wollte der Kollege Dir damit durch die Blume sagen :
>   Poste doch einfach mal Deine Sourcen. Vielleicht fällt uns da was auf
> ?


Na ja, ich glaube nicht dass er das durch die Blume sagen wollte. Das 
wäre dann auch ein "Programmierfehler", kein "schlechter 
Programmierstil".

Auch wenn ich denke dass es "Entropiefrei" ist, hier der Quellcode. 
Taktfrequenz ist 9.6MHz mit CKDIV8 Fuse gesetzt, ergibt also 1.2MHz.
#define TOP 220
#define INITPULSELEN 30

...

int main(void){

DDRB |= (1<<PB1_SERVOOUT);

// count from BOTTOM=0 to TOP=OCR0A:         (WGM02,WGM01,WGM00) = (1,1,1)
// set OC0B on compare match, clear OC0B on TOP: (COM0B1,COM0B0)      = (1,1)
// prescaler 64: (CS02,CS01,CS00)    = (0,1,1)
TCCR0A |= (1<<COM0B1) | (1<<COM0B0) | (1<<WGM01) | (1<<WGM00);
TCCR0B |= (1<<WGM02) | (1<<CS01) | (1<<CS00);


// activate timer overflow interrupt
// timer overflow interrupt enable: TOIE0 = 1
TIMSK0 |= (1<<TOIE0);

OCR0A = TOP; // count up to TOP and unset OC0B at TOP
OCR0B = TOP-INITPULSELEN; // set OC0B at TOP-INITPULSELEN (inverted PWM!)

while(1);

return 0;
}

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AS schrieb:
> Was ist denn das für ein Servo.
> Poste doch mal Typ und Hersteller.

Modell Futaba S148.

> Es gibt Billigservos, die außer zittern nix anderes können ;-)

Wenn er direkt am Empfänger hängt zittert er auch nicht...



> Mach mal einen Widerling (ca. 1 kOhm) in die Signalleitung.

Danke für den Tipp, so ein widerliches Ding ist aber schon drin... Hab 
ich vor einigen Stunden eingelötet ;-)

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur um Verwirrungen vorzubeugen: Der Teil
// activate timer overflow interrupt
// timer overflow interrupt enable: TOIE0 = 1
TIMSK0 |= (1<<TOIE0);

ist ein Relikt, und hier natürlich überflüssig. Wenn man es rausnimmt 
ändert's aber nichts.

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schmeiss den sch... Iterrupt raus.
// TIMSK0 |= (1<<TOIE0);

Der Timer macht das ohne!!!

avr

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein analoges Servo zittert wenn
1) der PWM einen Jitter drauf hat
2) das Servo Drehmoment liefern muss.

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avr schrieb:
> Schmeiss den sch... Iterrupt raus.// TIMSK0 |= (1<<TOIE0);
>
> Der Timer macht das ohne!!!

Ja, klar. Ist nur ein Relikt aus einer der gefühlten 200 
Programmversionen die ich von diesem nicht-mal-10-Zeiler nun hab ;-) 
Hatte ursprünglich mal ein längeres Programm, das ich auf der Suche nach 
der Ursache des Zitterns zusammen gekürzt hab.

groki

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gnadenloser Labberer schrieb:
> Ein analoges Servo zittert wenn
> 1) der PWM einen Jitter drauf hat

Woher kommt der Jitter? Die Schaltung ist ein simpler Probeaufbau auf 
einer kleinen Lochrasterplatine. Ich habe verschiedene Quellen 
ausgeschlossen (getrennte Spannungsquellen hergestellt, alle möglichen 
hohen und niedrigen Taktfrequenzen probiert, überall Widerstände und 
Kondensatoren eingelötet wo es Sinn macht. Nichts hat etwas geändert.

Meines Erachtens kann es nur noch am internen Oszillator liegen, vor 
allem weil es mit gleichen Komponenten an einem atmega88 klappt OHNE 
Zittern.
Ich will das aber irgendwie nicht glauben dass der interne Oszillator 
SOOO ungenau ist. Daher wollte ich das mal hier zur Diskussion stellen.

> 2) das Servo Drehmoment liefern muss.

Muss er in diesem Fall nicht, er zittert wenn er ohne Last in 
Mittelstellung gestellt wird.

Autor: FanDjango (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als alter Modellflieger fällt mir noch ein das manche Servos, durchaus 
auch die teureren, evtl. einen kleinen Tick nach rechts oder links 
gesteuert werden sollten damit sie nicht mehr flattern. Es gibt evtl. 
ungünstige Stillstandspositionen. Probiere mal in Deinem Program das 
Servo nach dem Init ein bissi hin- und dann wieder zurückzubewegen, und 
beobachte ob danach das Flattern weniger wird. Mit einem beherzten Dreh 
an der Achse gegen die Steuerung macht man nur das Getriebe kaputt. Es 
geht darum, das Feedback Poti im Servo an eine geringfügig andere Stelle 
zu bringen.
Grüße,
Mike

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jitter kann's zB geben, wenn der Controller noch anderes wie den PWM 
machen muss. zB kommunizieren. Die UART interrupts koennen den PWM 
leicht jittern lassen.

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FanDjango schrieb:
> Probiere mal in Deinem Program das
> Servo nach dem Init ein bissi hin- und dann wieder zurückzubewegen, und
> beobachte ob danach das Flattern weniger wird.

Hi Mike,

danke für den Tipp! Auch hier hab ich schon knapp ein Dutzend 
verschiedene Servo-Stellungen probiert. Das ändert auch nichts.

Ein alternatives Programm

PORTB |= (1<<PB0);
_delay_us(1500);
PORTB &= ~(1<<PB0);
_delay_us(500);
_delay_ms(18);

ruft auch das gleiche Zittern hervor (auch wenn ich alle möglichen 
anderen Werte zwischen 1000 und 2000 im ersten Aufruf der delay-Funktion 
anpasse, und den zweiten Aufruf entsprechend anpasse).

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...und das auch mit 3 verschiendene Servos. Die alle nicht zittern wenn 
sie direkt am Empfänger angeschlossen sind...

Autor: FanDjango (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ganz mistrauische würden mit einem NE555 schnell mal checken wie 
viel oder wie wenig das Servo an einer alternativen Quelle flattert...

Autor: FanDjango (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups. Überschneidung. Flattern am Empfänger nicht. Ok. Sorry

Autor: FanDjango (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also: Kein Oszi. Servos flattern sonst nicht. Damit sind also sozusagen 
Deine Servos sowas wie ein Oszi, oder?

Hmmmm. Jitter im Tiny Takt? Der müsste dann aber auch so richtig heftig 
sein um sich so bemerkbar zu machen.

PWM läuft störungsfrei durch, egal was der Tiny treibt.

Ist evtl. ein Problem mit dem Pegel auf der Leitung zum Servo? Zu knapp? 
verschlissene Flanken? Netzbrumm auf der Leitung? Ich tappe im Dunkeln 
aber vielleicht ist es ein Problem mit der Signal Anpassung und nicht 
mit der Taktung?

Autor: FanDjango (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei dem ATMEGA klappt es ohne Zittern/Flattern. Hmmmm. Vergleich mal in 
den Datenblättern die Eigenschaften des Ausgangsports. Steilheit?

Autor: avion23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche fuses hast du gesetzt?

Autor: AS (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab gerade noch ein S148 in der Kiste gefunden und an ner
T10 mit FASST R167FS ausprobiert:

Futaba benutzt 16ms Periodendauer.

Probier doch mal...

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FanDjango schrieb:
> Also: Kein Oszi. Servos flattern sonst nicht. Damit sind also sozusagen
> Deine Servos sowas wie ein Oszi, oder?

Ja, so habe ich mir auch hergeleitet dass es am "unsauberen" PWM-SIgnal 
liegen muss.

>
> Hmmmm. Jitter im Tiny Takt? Der müsste dann aber auch so richtig heftig
> sein um sich so bemerkbar zu machen.
>

Das will ich auch nicht richtig glauben.

> PWM läuft störungsfrei durch, egal was der Tiny treibt.

Ja, und ich habe trotzdem alles Andere aus dem Prog rausgenommen um 
sicher zu sein. Ohne dass sich was geändert hätte.


> Ist evtl. ein Problem mit dem Pegel auf der Leitung zum Servo? Zu knapp?
> verschlissene Flanken? Netzbrumm auf der Leitung? Ich tappe im Dunkeln
> aber vielleicht ist es ein Problem mit der Signal Anpassung und nicht
> mit der Taktung?

Was sind "verschlissene Flanken"?

Zum Thema Netzbrummen und Pegel: Ich habs auch schon mit 4x1.5V AA 
Batterien als Spannungsquelle versucht. Es hat sich nichts geändert... 
Puh!

Danke für die Ideen.
groki

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avion23 schrieb:
> Welche fuses hast du gesetzt?

"Ab Werk" waren SPIEN und CKDIV8 gesetzt, und Brown-out detection 
disabled. Alle anderen sind nicht gesetzt (=aktiv).

Ich hab bei den Tests auch mit verschiedenen Taktfrequenzen rumprobiert, 
und da CKDIV mal aktiviert und mal nicht, ohne dass sich was tat.

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AS schrieb:
> Futaba benutzt 16ms Periodendauer.
>
> Probier doch mal...

Hi AS,

danke dass Du Dir die Mühe gemacht hast!

Ich hab's mal probiert. Aber es ist genau wie vorher.

Ich hab auch noch einen Billigservo von "hitec". Der weist das gleiche 
Verhalten wie die von Futaba auf...

groki

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
groki schrieb:
> disabled. Alle anderen sind nicht gesetzt (=aktiv).

Also gemeint ist hier: "Alle anderen sind nicht gesetzt (=nicht aktiv)."

Autor: thisamplifierisloud (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
3V Pegel sollte ja eigentlich reichen.
Probiermal das Signal mit nem 74HCT541 aud die 5V zu lupfen.
(nur ein Strohhalm).

Ich kenne das Phänomen, ich hab das auch bei meinem z8encore,
allerdings nur beim Einstellen neuer Werte.

Kommt vermutlich davon, daß ich die neuen PWM-Werte zur Unzeit
in die Register prügle.

Helfen kann ich Dir nicht, nur ein Trostbier trinken,
um meinen Pegel zu lupfen.

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
thisamplifierisloud schrieb:
> 3V Pegel sollte ja eigentlich reichen.
> Probiermal das Signal mit nem 74HCT541 aud die 5V zu lupfen.
> (nur ein Strohhalm).

Hab keinen 74HCT541 da... Wenn ich morgen einen kriege würd' ich sogar 
das mal versuchen.

> Helfen kann ich Dir nicht, nur ein Trostbier trinken,
> um meinen Pegel zu lupfen.

Ich glaub das werd ich nun auch machen! ;-)

Autor: FanDjango (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LoL. Prost.

Hört das Flattern denn auf, wenn Du die PWM stoppst? Der Servo sollte 
dann still stehen.

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FanDjango schrieb:
> LoL. Prost.
>
> Hört das Flattern denn auf, wenn Du die PWM stoppst? Der Servo sollte
> dann still stehen.

 Verdammt, ich fasse es nicht: Das Bier hat geholfen!

Zumindest hat es mich auf die Idee gebracht woanders nochmal einen 
attiny13 auszubauen, den umzuprogrammieren, und zu sehen ob es damit 
auch nicht klappt.

Nun klappt es. Der verwendete attiny13 war einfach kaputt, wie es 
aussieht...


DANKE allen die sich beteiligt haben!

Und Prost!
groki

Autor: groki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...und da soll nochmal jemand sagen "Alkohol ist auch keine Lösung"... 
;-)

Autor: AS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieder was gelernt:
Mit Bier hört das Flattern auf ;)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
groki schrieb:
> ...und da soll nochmal jemand sagen "Alkohol ist auch keine Lösung"...
> ;-)

Du hast den Spruch ja auch falsch zitiert:
http://img.young.de/club_logo/clublogo565.jpg ;-)

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau, wir können auch ohne Spaß Alkohol haben ;))

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.