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
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
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).
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
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
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.
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.
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
intmain(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)
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 ;-)
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
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.
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
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.
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).
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?
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
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.
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
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.
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! ;-)
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
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