Ich dachte da mehr an die P,I,D Anteile und so Dinge wie Antiwindup und Deadband.
MfG Klebwax
Druckbare Version
Ich dachte da mehr an die P,I,D Anteile und so Dinge wie Antiwindup und Deadband.
MfG Klebwax
Naja, soweit bin ich noch nicht;) Hab jetzt erstmal die Elektronik aus dem Servogehäuse rausgeholt und einen kleinen Maschinenschraubstock eingespannt. Drähte vom Motor zur Elektronik gelegt und einen Kühlkörper mit etwas Wärmeleitpaste auf den Chip gelegt.
Dramatische Verbesserung:
20 Sekunden Lauf ohne Last, max. Geschw., ohne Kühlkörper - Abweichung der Neutralstellung ca.46µs
20 Sekunden Lauf ohne Last, max. Geschw., mit Kühlkörper - praktisch keine Abweichung mehr.
Hab das gleich mit einer Aluminiumplatte (20mm x 20mm x 1,5mm) wiederholt. Schon Abweichung von ca 6µs feststellbar, die sich aber sehr schnell (ca 5s ) zurückgestellt hat
Der Chip wird bei Lauf mit maximaler Geschwindigkeit schon ohne Last so heiß, daß man den Finger kaum drauf lassen kann.
Gruß
Searcher
Aha, die "richtige" Theorie. Mit Simulation habe ich in diesem Fall nix am Hut. Aber reale Messungen könntest Du Dir ansehen. Hier, eine weitere hier, und in diesem Posting noch ein paar. Der Thread ist voll mit Messdiagrammen für elektroniklose "modelcraft ES-05" in einer realen Anwendung.Zitat:
Zitat von Klebwax
Hallo!
Die Ursache der Unstabilität des gehakten Servos scheint mir zu geringe bzw. keine Hysterese in der Steuerelektronik zu sein.
Hallo PICture :Strahl,
weis jetzt nicht genau, welche Hysterese Du meinst. Es gibt eine Zeitspanne von ungefähr 12µs in der sich die Pulsweite in der Neutralstellung (Motor dreht nicht) verändern kann, ohne das sich der Motor beginnt zu drehen. Auch wenn sich die Neutralstellung durch Wärme verändert hat, ist die Zeitspanne in etwa gleich.
Für mich ist der Servo einfach nicht für diese Anwendung als Getriebemotor gebaut. Darüber hinaus ist es auch ein sehr günstiges Modell und wie es aussieht nicht temperaturstabilisiert.
Gruß
Searcher
Na ja, wer kann, der kann. Ohne Versuchen, geht's leider kaum. :lol:
"Es gibt eine Zeitspanne von ungefähr 12µs in der sich die Pulsweite in der Neutralstellung (Motor dreht nicht) verändern kann, ohne das sich der Motor beginnt zu drehen."
Auch das ist normal. Dieser Bereich wird u.a. Totbereich genannt:
http://www.google.de/search?q=servo+totbereich
Echt spannend wie sich der Thread entwickelt. :)
Erste Umsetzung der Erkenntnisse wären wohl Belüftungslöcher in den Servogehäusen. Das Thema wird für mich akut weil ich grad mit 18 ES-05ern rumspiele...
Gruß
mic
Hallo,
Verdam..., hoffentlich noch nicht zu spät :-)Zitat:
Zitat von oberallgeier
Wenn die Servos dauernd mit Höchstgeschwindigkeit laufen kann ich eigentlich nur sagen: je mehr Kühlung desto besser. Hab den Servo noch nicht unter Normalbedingungen, also den Servo als Servo unter die Lupe genommen. Aber auch da könnte ich mir Wärmeeinflüsse vorstellen (und hast Du ja auch schon bestätigt), besonders, wenn er mit Belastung läuft.Zitat:
Zitat von radbruch
@PICture: ich werd weiter nach der Hysterese Ausschau halten:cool:
Damit man das Zustandekommen der Testergebnisse besser einschätzen kann, ein Bild der Testumgebung und das Servotesterprogramm auf einem ATtiny24 mit 16 Bit Timer. Rechts unten im Bild kann man die im Schraubstock eingespannte, jedoch von der mit Wärmweleitpaste angeklebten Aluplatte verdeckten Servoelektronik erkennen. Ein größerer "echter" Kühlkörper brachte viel bessere Ergebnisse. Rechte Seite des Steckbretts dient nur der Ausgabe der Meßwerte ;) Versorgungsspannung des Ganzen: 5 Volt
Bestimmung der Zeiten geschah durch Justieren des Potis, Horchen auf Motorgeräusche und Ablesen der Pulsweite - also keine Präzisonsmessungen :-) Tendenz ist aber eindeutig.
GrußCode:'###################################################
'File: servo_hack_01.bas
'IDE: BASCOM-AVR DEMO Version 2.0.5.0
'
'Servotester mit Servopulseinstellung über Potentiometer
'Servopuls Auflösung ist 2µs im Bereich 500 - 2546µs bei 50Hz
'
'ATtiny24
'PA0 : ADC0, Eingang vom Poti
'PA6 : OC1A, Servosignal - Ausgang zum Servo
'PB0 : SW UART #1 , für Ausgabe der Pulsweite an 4 fach 7-Segmentanzeige
'#######################################################
$regfile = "attiny24.dat"
$framesize = 32
$swstack = 32
$hwstack = 36
$crystal = 8000000 'internal Oscillator
Osccal = &H8E 'trim internal oscillator close to real 8MHz
'##### Definitionen und Initialisierung für 7segment ausgabe ######
Dim Number_string As String * 6
Dim Digits(5) As Byte
Dim X As Byte
Dim Y As Byte
Dim Idx As Byte
Dim Num_to_disp As Word
Declare Sub Display_value(num_to_disp As Word)
Open "comb.0:115200,8,n,1" For Output As #1 'comb.0 -> TX ist Pin PB0
Y = &B11111101 'segment g
For X = 1 To 5 : Put #1 , Y : Next '7 segment initialisieren
'#### Ende Definitionen und Initialisierung für 7 Segmentausgabe #######
Dim Adc_result As Word
Dim Timer1_overflows As Byte
Timer1_overflows = 0
Porta = Porta Or &B10111110 'all Pullups on at porta , exept PA6, PA0
Portb = Portb Or &B11111110 'all Pullups on at portb , exept PB0 - TX
Config Porta.6 = Output 'servo at oc1a
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Set Tccr1a.wgm11 : Set Tccr1b.wgm12 : Set Tccr1b.wgm13 'fast pwm - icr1 as top
Icr1 = 19999 ' :-) 50 Hz for Servo PWM
Set Tccr1a.com1a1 'clear oc1a on compare match
Ocr1a = 1500 '1,5ms pulse - Servo neutral position
Set Tccr1b.cs11 'timer1 on, prescaler 8 - 1Mhz at 8MHz systemclock
On Timer1 Isr_show_pulsewidth
Enable Timer1 'overflow interrupt enable
Enable Interrupts
Do
Adc_result = Getadc(0) 'read potentiometer position at ADC0 (PA0)
Shift Adc_result , Left 'multiply by 2
Adc_result = Adc_result + 500 'add offset for pulses from 500 till 2546µs
Ocr1a = Adc_result 'assign pulsewidth to compare register
Loop
Isr_show_pulsewidth: 'isr may take time - no problem here
Incr Timer1_overflows
Timer1_overflows = Timer1_overflows And &B00001111 'display update about 3 times a second
If Timer1_overflows = 0 Then Call Display_value(ocr1a) 'display actual pulsewidth
Return
'############ Folgende Zeilen bis zum Ende nur zur Datenausgabe über 7 Segmentanzeige #############
Sub Display_value(num_to_disp As Word) 'gibt Dezimalzahlen bis 9999 aus
Number_string = Str(num_to_disp) 'Zahl in String geben
Str2digits Number_string , Digits(1) 'Ziffern im String in Byte Array geben
X = Digits(1) + 1 'in Digits(1) befindet sich Anzahl der Ziffern der Zahl
For Idx = 5 To 2 Step -1
If X < Idx Then
Put #1 , &HFF 'Leerstellen dunkel schalten
Else
Y = Lookup(digits(idx) , Pattern) 'Segmentpattern aus Tabelle fischen
Put #1 , Y 'Segmentpattern senden
End If
Next
End Sub
Pattern: 'darzustellende Zeichen (hex 0..F...)
'Segmente abcdefg: ' ":" = Doppelpunkt in der Mitte
Data &B00000011 'Ziffer "0", 0 = segment ein, 1 = aus
Data &B10011111 'Ziffer "1"
Data &B00100101 'Ziffer "2"
Data &B00001101
Data &B10011001
Data &B01001001
Data &B01000001
Data &B00011111
Data &B00000001
Data &B00001001
Data &B00010001
Data &B11000001
Data &B01100011
Data &B10000101
Data &B01100001 'Ziffer "E"
Data &B01110001 'Ziffer "F"
Data &B11111111 'dunkel
Data &B11111101 'nur Segment g eingeschaltet (-)
'########### ENDE US-Meßprogramm_ICP.bas ##############################################
Searcher