Motor mittels Joystick Poti ansteuern

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Motor mittels Joystick Poti ansteuern

      Hallo zusammen,

      für ein neues Projekt bräuchte ich mal wieder eure Hilfe. Es geht darum, mit einem Joystick Poti ( Kreuzknüppel ), einen Motor anzusteuern. Ähnlich wie bei einer Funkfernsteuerung. Das Ansteuern über eine H Brücke mit den PWM0A und PWM0B Ausgängen und mittels ADC und Poti als Eingang ist soweit alles klar und stellt kein Problem für mich da.

      Ich möchte es nun gerne so haben, dass ich einen kleinen Totbereich in der Mittelstellung habe. Schiebe ich nun den Poti nach oben, soll sich, je nach Ausschlag, der Motor in die eine Richtung, oder eben nach unten, in die andere Richtung drehen. Hoffe ihr versteht, was ich meine.

      Ich stehe nun nur etwas auf dem Schlauch, da ich den Wert vom ADC ja nicht einfach 1:1 an die PWM Ausgänge geben kann.

      Wäre euch für Tipps und Hilfen sehr dankbar ! :)

      Viele Grüße
      Sven
    • Sowas kann man mit case gut machen
      Select case ad-Wert
      case is < 500: hier Formel für Pwm in Richtung A
      case 500 to 524: hier pwm ausschalten
      case is >524: hier Formel für pwm in Richtung B
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Oder wie wäre es damit

      Dim PotiY as Integer ' Potiwert Y-Richtung

      Einlesen und Auswerten.

      PotiY = Getadc(DeinKanal)

      Jetzt hast du einen 10-Bit Wert. Den 1x rechts schieben (9-Bit Wert).

      Dann 256 abziehen

      PotyY=PotiY -256

      Jetzt hast du positive Werte nach oben (8-Bit) und negative Werte nach unten (8 Bit)

      Select Case PotyY

      Case > 5
      ' Motor nach oben drehen
      OCRnA = PotyY

      Case -5 to +5
      ' Motot soll nichts machen

      Case <-5
      ' Motor nach unten drehen lassen
      OCRnB = Abs(PotyY)

      End Select
      Kaum macht man es richtig - und schon geht's!
    • Hallo Mitch,

      das klingt auch interessant. Ich habe es nun mal versuch umzusetzen, bekomme aber immer Fehlermeldungen:


      - Es werden 3 Parameter benötigt
      - End Select wird benötigt.

      Ist aber meiner Meinung nach, doch alles vorhanden. Hier der Programmcode:

      BASCOM Source Code

      1. $regfile = "m328pdef.dat"
      2. $framesize = 32
      3. $swstack = 32
      4. $hwstack = 64
      5. $crystal = 16000000 'Resonatorfrequenz
      6. $baud = 9800 'Baudrate (Übertragungsgeschwindigkeit)
      7. Baud = 9800
      8. Dim Poti1 as Integer
      9. ' Ein/Ausgänge festlegen:
      10. Config PINC.0 = Input
      11. ' Timer Programmieren:
      12. Config Timer0 = PWM, Prescale = 1024 , Compare A PWM = Clear Up, Compare B PWM = Clear Up
      13. ' Analog / Digital Wandler aktivieren:
      14. Config Adc = Single , Prescaler = auto , Reference = Avcc ' Poti ( 4,7 KOHM ) VCC --- PinB2 --- GND
      15. Start Adc
      16. ' Hier beginnt das Hauptprogramm:
      17. Main:
      18. Do
      19. Poti1 = Getadc(0)
      20. Poti1 = Poti1 - 256
      21. Select Case Poti1
      22. Case > 5 : Gosub M1_links
      23. Case -5 to +5 : Gosub M1_stop
      24. Case < 5 : Gosub M1_rechts
      25. End Select
      26. Loop
      27. End
      28. ' Hier befinden sich die Unterprogramme:
      29. M1_links:
      30. PWM0A = Poti1
      31. PWM0B = 0
      32. return
      33. M1_rechts:
      34. PWM0A = 0
      35. PWM0B = Poti1
      36. return
      37. M1_stop:
      38. PWM0A = 0
      39. PWM0B = 0
      40. return
      Display All
    • Passt aber noch nicht.
      Der ad-Wandler liefert 0..1023, für die pwm brauchst du 0..255. Wenn 255 Vollgas ist, dann soll das in der einen Motorrichtung bei ad-Wandlerwert=0 sein und in der anderen Richtung bei 1023.
      Schau nochmal bei @Mitch64 Vorschlag, wie er das vorgeschlagen hat zu lösen.
      Es fehlt bei dir
      'Jetzt hast du einen 10-Bit Wert. Den 1x rechts schieben (9-Bit Wert).'
      Dann hast du für den Wert poti1 einen Wertebereich von 0..511.
      Wenn du jetzt 255 abziehst, hast du einen Wertebereich von -255 bis 256. Jetzt kommt man schon zu Werten, die für pwm passen (die 256 müssen noch korrigiert werden. Und das -255 muss zu positiver Zahlen mit abs() konvertiert werden.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      The post was edited 2 times, last by tschoeatsch ().

    • Vielen Dank für die Tipps !

      Habe es nun nochmal geändert. Zu 75 % klappt es nun. Die Richtung Links, sowie der Nullpunkt ( Nach ändern des Wertes von 5 auf 8 ) klappen nun einwandfrei. Nur die Rechtsdrehung funktioniert noch nichts. Hat jemand eine Idee, was das sein könnte ?

      BASCOM Source Code

      1. $regfile = "m328pdef.dat"
      2. $framesize = 32
      3. $swstack = 32
      4. $hwstack = 64
      5. $crystal = 16000000 'Resonatorfrequenz
      6. $baud = 9800 'Baudrate (Übertragungsgeschwindigkeit)
      7. Baud = 9800
      8. Dim Poti1 as Integer
      9. ' Ein/Ausgänge festlegen:
      10. Config PINC.0 = Input
      11. ' Timer Programmieren:
      12. Config Timer0 = PWM, Prescale = 1024 , Compare A PWM = Clear Up, Compare B PWM = Clear Up
      13. ' Analog / Digital Wandler aktivieren:
      14. Config Adc = Single , Prescaler = auto , Reference = Avcc ' Poti ( 10 KOHM ) VCC --- PinB2 --- GND
      15. Start Adc
      16. ' Hier beginnt das Hauptprogramm:
      17. Main:
      18. Do
      19. Poti1 = Getadc(0)
      20. shift Poti1, right, 1
      21. Poti1 = Poti1 - 256
      22. Select Case Poti1
      23. Case is > 8 : Gosub M1_links
      24. Case -8 to 8 : Gosub M1_stop
      25. Case is < 8 : Gosub M1_rechts
      26. End Select
      27. Loop
      28. End
      29. ' Hier befinden sich die Unterprogramme:
      30. M1_links:
      31. PWM0A = Poti1
      32. PWM0B = 0
      33. return
      34. M1_rechts:
      35. PWM0A = 0
      36. PWM0B = Poti1
      37. return
      38. M1_stop:
      39. PWM0A = 0
      40. PWM0B = 0
      41. return
      Display All
    • Mitch64 wrote:

      So:

      BASCOM Source Code

      1. Select Case Poti1
      2. Case is > 8 : Gosub M1_links
      3. Case -8 to 8 : Gosub M1_stop
      4. Case is < 8
      5. Poti1 = Abs(Poti1) ' ergibt max. +256
      6. Decr Poti1 ' Korrektur wegen möglichem Wert +256
      7. Gosub M1_rechts
      8. End Select
      Zeile 4 stimmt nicht richtig wäre case is < -8
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------