Servo zittert bei Ansteuerung per PWM mit attiny13

Gast #1855133
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
Gast #1855150
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
Gast #1855163
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
Gast #1855187
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.
Gast #1855200
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
}
Gast #1855207
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 ;-)
Gast #1855219
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
Gast #1855224
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.
Gast #1855233
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
Gast #1855240
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).
Gast #1855252
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?
Gast #1855261
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
Gast #1855272
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.
Gast #1855274
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! ;-)
Gast #1855279
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

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