PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo mit Feedback, ungenaue Division



Normalo
27.12.2008, 18:45
Ich möchte einen Servo so steuern, dass er auf Bewegungseinfluss von außen reagiert, indem er nachgibt. Es scheint aber noch an einer Division zu scheitern.

Ich habe den Servo am DA1 der Main Unit 2.0 und das Poti an AD1 angeschlossen. So kann ich die Position des Servos lesen und stelle den Servo immer wieder auf diesen Wert, so dass eine Drehung mit der Hand sofort zu gleichem Stellbefehl führt.

Der Positionswert beträgt 2 bis 151, die Stellbefehle betragen aber 0 bis 255 für denselben Bereich. Also muss ich den Positionswert mit (255/149) multiplizieren, um den richtigen Stellwert zu bekommen. Diese Division scheint aber immer 1 zu liefern.

Hier der komplette Code:

' initialize AD port
define AD1 ad[1]

function readStepperPosition()
return AD1
end function

' initialize stepper
define stepper1 as da[1]
Config.init
Config.put 00000001b
Config.off

' continuously set stepper to AD value
Lcd.init
Lcd.clear
define stepperCurrent as byte, AD1Current as byte
do
AD1Current = readStepperPosition()
stepperCurrent = AD1Current*(255/149)
Lcd.clear
Lcd.pos 1, 1
Lcd.print "ad1cur: " & AD1Current
Lcd.pos 2, 1
Lcd.print "stepperCur: " & stepperCurrent
stepper1 = stepperCurrent
pause 50
loop

radbruch
27.12.2008, 19:21
Hallo

stepperCurrent = AD1Current*(255/149)

Durch die Klammern wird erst 255/149 als Integer ausgerechnet, dies ergibt eben 1.

Besser wäre vermutlich:

stepperCurrent = (AD1Current-2)*255/149

Dazu muss aber zumindest stepperCurrent eine 16bit-Variable sein, vorsichtshalber würde ich auch AD1Current mit 16bit definieren.

Ich hoffe das passt so.

Gruß

mic