Hallo,
Zitat von
oberallgeier
Das hättste Dir jetzt patentieren lassen sollen
Verdam..., hoffentlich noch nicht zu spät
Zitat von
radbruch
Erste Umsetzung der Erkenntnisse wären wohl Belüftungslöcher in den Servogehäusen
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.
@PICture: ich werd weiter nach der Hysterese Ausschau halten
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.
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 ##############################################
Gruß
Searcher
Lesezeichen