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


von groki (Gast)


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

von TestX .. (xaos)


Lesenswert?

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

von groki (Gast)


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

von Silvan K. (silvan) Benutzerseite


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).

von groki (Gast)


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

von smoke (Gast)


Lesenswert?

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

von groki (Gast)


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

von Hein (Gast)


Lesenswert?

groki schrieb:
> - Kondensatoren 100pF zwischen VCC und GND etc.

Nimm davon mal testweise 1000 Stück.

von groki (Gast)


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.

von avr (Gast)


Lesenswert?

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

avr

von NurEInGast (Gast)


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.

von AS (Gast)


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 ;-)

von groki (Gast)


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.
1
#define TOP 220
2
#define INITPULSELEN 30
3
4
...
5
6
int main(void){
7
8
DDRB |= (1<<PB1_SERVOOUT);
9
10
// count from BOTTOM=0 to TOP=OCR0A:         (WGM02,WGM01,WGM00) = (1,1,1)
11
// set OC0B on compare match, clear OC0B on TOP: (COM0B1,COM0B0)      = (1,1)
12
// prescaler 64: (CS02,CS01,CS00)    = (0,1,1)
13
TCCR0A |= (1<<COM0B1) | (1<<COM0B0) | (1<<WGM01) | (1<<WGM00);
14
TCCR0B |= (1<<WGM02) | (1<<CS01) | (1<<CS00);
15
16
17
// activate timer overflow interrupt
18
// timer overflow interrupt enable: TOIE0 = 1
19
TIMSK0 |= (1<<TOIE0);
20
21
OCR0A = TOP; // count up to TOP and unset OC0B at TOP
22
OCR0B = TOP-INITPULSELEN; // set OC0B at TOP-INITPULSELEN (inverted PWM!)
23
24
while(1);
25
26
return 0;
27
}

von groki (Gast)


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 ;-)

von groki (Gast)


Lesenswert?

Nur um Verwirrungen vorzubeugen: Der Teil
1
// activate timer overflow interrupt
2
// timer overflow interrupt enable: TOIE0 = 1
3
TIMSK0 |= (1<<TOIE0);

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

von avr (Gast)


Lesenswert?

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

Der Timer macht das ohne!!!

avr

von Purzel H. (hacky)


Lesenswert?

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

von groki (Gast)


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

von groki (Gast)


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.

von FanDjango (Gast)


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

von Purzel H. (hacky)


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.

von groki (Gast)


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
1
PORTB |= (1<<PB0);
2
_delay_us(1500);
3
PORTB &= ~(1<<PB0);
4
_delay_us(500);
5
_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).

von groki (Gast)


Lesenswert?

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

von FanDjango (Gast)


Lesenswert?

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

von FanDjango (Gast)


Lesenswert?

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

von FanDjango (Gast)


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?

von FanDjango (Gast)


Lesenswert?

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

von avion23 (Gast)


Lesenswert?

Welche fuses hast du gesetzt?

von AS (Gast)


Angehängte Dateien:

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...

von groki (Gast)


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

von groki (Gast)


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.

von groki (Gast)


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

von groki (Gast)


Lesenswert?

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

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

von thisamplifierisloud (Gast)


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.

von groki (Gast)


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! ;-)

von FanDjango (Gast)


Lesenswert?

LoL. Prost.

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

von groki (Gast)


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

von groki (Gast)


Lesenswert?

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

von AS (Gast)


Lesenswert?

Wieder was gelernt:
Mit Bier hört das Flattern auf ;)

von Rolf Magnus (Gast)


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 ;-)

von Rudi (Gast)


Lesenswert?

Genau, wir können auch ohne Spaß Alkohol haben ;))

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.