habs nochmal genau durchgeschaut bei folgenden daten geht das bein hoch:
Hoehe = 50
Abstand = 97
bei abstand = 98 bleibt es noch unten und verhält sich so wie es soll
code ist folgender:
EDIT: hab gerade noch ein poti für die höhe eingebaut. und ich muss feststellen sobald der kniewinkel kleiner als 90° werden würde geht das bein in fehlstellung. aber ich glauber nur der unterschenkel. dieser stellt sich dann immer in den 180° winkelCode:$regfile = "m8def.dat" $crystal = 3686400 $baud = 19200 $framesize = 64 $swstack = 64 $hwstack = 64 Config Timer1 = Timer , Prescale = 1 'timer für Servos Enable Timer1 Timer1 = 56320 Config Portc = Output Portc.2 = 0 'hier hängt servo1 Portc.3 = 0 'hier hängt servo2 Portc.4 = 0 'hier hängt servo3 Portc.5 = 0 'hier hängt servo4 Config Pinc.0 = Input ' Port C.0 Ausgang Config Pinc.1 = Input On Timer1 Servoirq 'servo Config Adc = Single , Prescaler = 64 , Reference = Avcc Start Adc Enable Interrupts Declare Sub Berechnung Dim Kanal As Byte Dim Servo(4) As Word 'links: 63200, mitte 60000, rechts 56800 Dim Hoehe As Byte Dim Abstand As Byte Dim Wert1_a As Single Dim Wert1_b As Word Dim Hoehe_q As Word Dim Abstand_q As Word Dim Dis_q As Word Dim Dis As Byte Dim Knie_wi As Byte Dim Kniea As Word Dim Knieb As Word Dim Knie_zw_a As Word Dim Knie_zw_b As Word Dim Knie_zw_c As Word Dim Knie_zw_d As Integer Dim Knie_zw_e As Single Dim Knie_zw_wi As Single Dim Hufta_zw_a As Single Dim Hufta_zw_b As Single Dim Hufta_wi As Byte Dim Huftb_zw_a As Word Dim Huftb_zw_b As Word Dim Huftb_zw_c As Word Dim Huftb_zw_d As Integer Dim Huftb_zw_e As Single Dim Huftb_zw_wi As Single Dim Huftb_wi As Byte Dim Huft_wi As Byte Dim Hufta As Word Dim Huftb As Word Const Oberschenkel = 67 Const Unterschenkel = 87 Const Oberschenkel_q = 4489 Const Unterschenkel_q = 7569 Hoehe = 50 Abstand = 100 Call Berechnung Servo(3) = 60000 Servo(4) = 60000 Wait 3 Do Wert1_b = Getadc(0) Waitus 50 Wert1_a = 150 / 1024 Abstand = Wert1_a * Wert1_b Call Berechnung Loop Servoirq: If Kanal = 0 Then If Portc.2 = 0 Then 'wenn port low Timer1 = Servo(1) 'dann timer auf entsprechende verzögerung Portc.2 = 1 'und port anschalten Else 'das hier passiert erst bei dem darauf folgenden interrupt Portc.2 = 0 'dann port wieder ausschalten Incr Kanal 'und den nächsten kanal bearbeiten End If End If If Kanal = 1 Then If Portc.3 = 0 Then Timer1 = Servo(2) Portc.3 = 1 Else Portc.3 = 0 Incr Kanal End If End If If Kanal = 2 Then If Portc.4 = 0 Then Timer1 = Servo(3) Portc.4 = 1 Else Portc.4 = 0 Incr Kanal End If End If If Kanal = 3 Then If Portc.5 = 0 Then Timer1 = Servo(4) Portc.5 = 1 Else Portc.5 = 0 Incr Kanal End If End If If Kanal = 4 Then Timer1 = 21300 '54016 eine pause von ca. 12ms bis zum nächsten interrupt. Bei guten Servos oder Brushlessreglern kann man hier bis auf 65530 gehen ==> ansteuerfrequenz von ~ 200Hz Kanal = 0 End If Return '------------------------------------------ Sub Berechnung If Hoehe > 110 Then Hoehe = 110 If Abstand < 37 Then Abstand = 37 Hoehe_q = Hoehe * Hoehe Abstand_q = Abstand * Abstand Dis_q = Hoehe_q + Abstand_q Dis = Sqr(dis_q) '-------------- Knie ---------------------- Knie_zw_a = Dis_q - Unterschenkel_q Knie_zw_b = Knie_zw_a - Oberschenkel_q Knie_zw_c = Unterschenkel * Oberschenkel Knie_zw_d = -2 * Knie_zw_c Knie_zw_e = Knie_zw_b / Knie_zw_d Knie_zw_wi = Acos(knie_zw_e) Knie_wi = Rad2deg(knie_zw_wi) If Knie_wi < 45 Then Knie_wi = 45 If Knie_wi > 180 Then Knie_wi = 180 Kniea = 6400 / 180 Knieb = Kniea * Knie_wi Servo(2) = 63200 - Knieb '-------------- Hüfte a --------------------- Hufta_zw_a = Hoehe / Dis Hufta_zw_b = Acos(hufta_zw_a) Hufta_wi = Rad2deg(hufta_zw_b) '-------------- Hüfte b --------------------- alpha = acos((ober² + dis² - unter²)/(2·ober·dis)) 'alpha = acos((ober² - unter² - dis²) / (-2 * ober * dis)) Huftb_zw_a = Oberschenkel_q + Dis_q Huftb_zw_b = Huftb_zw_a - Unterschenkel_q Huftb_zw_c = Oberschenkel * Dis Huftb_zw_d = 2 * Huftb_zw_c Huftb_zw_e = Huftb_zw_b / Huftb_zw_d Huftb_zw_wi = Acos(huftb_zw_e) Huftb_wi = Rad2deg(huftb_zw_wi) Huft_wi = Hufta_wi + Huftb_wi If Huft_wi < 55 Then Huft_wi = 55 If Huft_wi > 180 Then Huft_wi = 180 Hufta = 6400 / 180 Huftb = Hufta * Huft_wi Servo(1) = 56800 + Huftb Print "----------------------------------" Print Print "Knie_wi " ; Knie_wi Print Print "Abstand " ; Abstand Print "adc " ; Wert1_b Print "huft_wi " ; Huft_wi Print End Sub End
mfg bammel






Zitieren

Lesezeichen