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:
Code:
$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
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° winkel
mfg bammel
Lesezeichen