Hallo
Ich hab's jetzt auch mal versucht die Impulslängen der Servosignale mit Bascom zu messen. Mit dem Pulsein-Befehl habe ich es nicht geschafft, aber mit einer einfachen Zählschleife funktioniert es recht gut:
Code:
$regfile = "m32def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 8
$framesize = 24
$baud = 38400
Dim A As Byte
Dim Counter As Integer
Config Servos = 1 , Servo1 = Portc.0 , Reload = 10
Config Portc.0 = Output
'Servo(1) = 100
Enable Interrupts
Do
Print
Print "----------------"
For Servo(1) = 30 To 150 Step 10
Waitms 500
Counter = 0
Do ' Warten bis aktiver Impuls zu Ende
A = Pinc.0
Loop Until A = 0
Do ' Warten bis Pause fertig
A = Pinc.0
Loop Until A = 1
Do
A = Pinc.0
Incr Counter ' Zähler erhöhen
'Waitus 2
Loop Until A = 0 ' Solange impuls ansteht
Counter = Counter - 149 ' Wert für Mittelstellung abziehen
Print "Winkel:" ; Servo(1)
Print "Zähler: " ; Counter
Print
Next
Loop
Das Programm erzeugt mit Config Servos seine eigenen Impulse und misst dann deren Länge mit einer Zählschleife. Der Drehbereich meines angeschlossenen Servos ist 30 bis 150. Die Zählwerte sind ohne Verzögerung durch waitus in der Zählschleife und ohne Korrektur von 49 bis 249:
Code:
Winkel:30
Zãhler: 49
Winkel:40
Zãhler: 66
Winkel:50
Zãhler: 82
Winkel:60
Zãhler: 99
Winkel:70
Zãhler: 116
Winkel:80
Zãhler: 133
Winkel:90
Zãhler: 149
Winkel:100
Zãhler: 166
Winkel:110
Zãhler: 183
Winkel:120
Zãhler: 199
Winkel:130
Zãhler: 216
Winkel:140
Zãhler: 233
Winkel:150
Zãhler: 249
Mit Korrektur -149 erhalte ich folgende Werte:
Code:
Winkel:30
Zãhler: -100
Winkel:40
Zãhler: -83
Winkel:50
Zãhler: -66
Winkel:60
Zãhler: -50
Winkel:70
Zãhler: -33
Winkel:80
Zãhler: -16
Winkel:90
Zãhler: 0
Winkel:100
Zãhler: 17
Winkel:110
Zãhler: 34
Winkel:120
Zãhler: 50
Winkel:130
Zãhler: 67
Winkel:140
Zãhler: 84
Winkel:150
Zãhler: 100
Bin ich jetzt selbst etwas überrascht wie gut das passt ;) Für schneller getaktete Kontroller kann man in der Zählschleife noch etwas mit waitus spielen. Bei 16MHz muss man vermutlich nur den Zählwert halbieren.
Gruß
mic
Lesezeichen