-         

Ergebnis 1 bis 2 von 2

Thema: Servo mit Feedback, ungenaue Division

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    26.11.2007
    Beiträge
    36

    Servo mit Feedback, ungenaue Division

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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:
    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

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •