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
häng mal einen externen quarz an den controller und erhöhr die pwm frequenz auf 50Hz
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
Servo zittert weil attiny13 alt (und unerfahren) ist. Verbessere deinen ProgStil und er bleibt fast ganz ruhig.
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
groki schrieb: > - Kondensatoren 100pF zwischen VCC und GND etc. Nimm davon mal testweise 1000 Stück.
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.
Mach mal einen Widerling (ca. 1 kOhm) in die Signalleitung. avr
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.
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 ;-)
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 | }
|
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 ;-)
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.
Schmeiss den sch... Iterrupt raus.
1 | // TIMSK0 |= (1<<TOIE0);
|
Der Timer macht das ohne!!! avr
Ein analoges Servo zittert wenn 1) der PWM einen Jitter drauf hat 2) das Servo Drehmoment liefern muss.
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).
...und das auch mit 3 verschiendene Servos. Die alle nicht zittern wenn sie direkt am Empfänger angeschlossen sind...
Und ganz mistrauische würden mit einem NE555 schnell mal checken wie viel oder wie wenig das Servo an einer alternativen Quelle flattert...
Ups. Überschneidung. Flattern am Empfänger nicht. Ok. Sorry
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?
Bei dem ATMEGA klappt es ohne Zittern/Flattern. Hmmmm. Vergleich mal in den Datenblättern die Eigenschaften des Ausgangsports. Steilheit?
Hab gerade noch ein S148 in der Kiste gefunden und an ner T10 mit FASST R167FS ausprobiert: Futaba benutzt 16ms Periodendauer. Probier doch mal...
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
groki schrieb: > disabled. Alle anderen sind nicht gesetzt (=aktiv). Also gemeint ist hier: "Alle anderen sind nicht gesetzt (=nicht aktiv)."
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! ;-)
LoL. Prost. Hört das Flattern denn auf, wenn Du die PWM stoppst? Der Servo sollte dann still stehen.
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
...und da soll nochmal jemand sagen "Alkohol ist auch keine Lösung"... ;-)
Wieder was gelernt: Mit Bier hört das Flattern auf ;)
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.