Servo-Signale mit timer2 im ctc-modus

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Servo-Signale mit timer2 im ctc-modus

      Ich hab' jetzt mal versucht, Servo-Steuerpulse mit timer2 und ctc zu erzeugen. Meine Hintergründe sind die:
      Puls min 1msec, max 2msec lang, Servo auf Anschlag mit 1msec Puls, Mittelstellung 1,5msec Puls, anderer Anschlag 2msec Puls.
      Kontroller läuft mit 20MHz, timer2 prescaler=128, 156 Takte ergeben 1msec. Also habe ich 156 mögliche Stellungen der Servos.
      Der 2msec Puls braucht somit 318 Takte, deshalb hab' ich das so gelöst, dass ich einen 'Abschnitt mit 0,5msec erzeuge (78 Takte) und einen folgenden mit 0,5..1,5msec (78..234 Takte).
      Das passt laut Oszi auch ganz gut, nur meine mikro-Servos bewegen sich nur in einer Hälfte des möglichen Ausschlags und das verstehe ich nicht. Habe ich schon wieder Murks programmiert?

      BASCOM-Quellcode

      1. $regfile = "m168pdef.dat"
      2. $crystal = 20000000
      3. $hwstack = 32
      4. $swstack=32
      5. $framesize = 30
      6. Dim Xx_ As Byte 'Umschalterin der isr
      7. Dim Servo_n As Byte 'Servonummer in der isr
      8. Dim Servo(8) As Word 'Stellwert0=1msec, 156=2msec
      9. Servoport Alias Portd
      10. Config Servoport = Output
      11. Config Timer2 = Timer , Prescale = 128 , Clear_timer = 1 '156 Takte für 1 msec
      12. On Compare2a Timer2_isr
      13. Start Timer2
      14. Enable Interrupts
      15. Dim N As Byte
      16. Compare2a = 156 'Startwert
      17. Servo_n = 0 : Xx_ = 0 'Startwert
      18. Enable Compare2a
      19. Servo(1) = 78
      20. Servo(2) = 78
      21. Servo(3) = 78
      22. Servo(4) = 78
      23. Servo(5) = 78
      24. Servo(6) = 78
      25. Servo(7) = 78
      26. Servo(8) = 78
      27. Do
      28. For N = 0 To 156
      29. Servo(1) = N
      30. Waitms 1
      31. Next N
      32. For N = 156 To 0 Step -1
      33. Servo(1) = N
      34. Waitms 2
      35. Next N
      36. Loop
      37. End
      38. Timer2_isr:
      39. If Xx_ = 0 Then
      40. Compare2a = 78 'für die Dauer von 0,5 msec
      41. Servoport.servo_n = 0 'Portpin wird gesetzt
      42. Incr Servo_n 'Servonummer hochzählen
      43. If Servo_n > 8 Then Servo_n = 0
      44. Servoport.servo_n = 1
      45. Xx_ = 1 'beim nächsten mal den else-Teil ausführen
      46. Else
      47. Compare2a = Servo(servo_n + 1) + 78 'Einschaltdauer+ 0,5 msec =max 1,5 msec
      48. Xx_ = 0 'beim nächsten mal den true-Teil ausführen
      49. End If
      50. Return
      Alles anzeigen
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Das passt laut Oszi auch ganz gut, nur meine mikro-Servos bewegen sich nur in einer Hälfte des möglichen Ausschlags und das verstehe ich nicht.
      alle Servos zusammen haben eine Wiederholzeit von 8-9ms, das ist vielleicht zuwenig. Mach mal noch eine Pause von 5-10ms rein.
      (oder schieb noch 5 Dummyservos hinterher)

      tschoeatsch schrieb:

      Habe ich schon wieder Murks programmiert?
      Würde dir die Antwort gefällen, würde ich sie posten ;)

      Was spricht gegen Timer1?
      Das ist viel entspannter und feiner aufgelöst.
      Dann kannst du auch die Pausenzeit genauer machen und nebenbei die Uhr im selben Timer laufen lassen.
    • Michael schrieb:

      Würde dir die Antwort gefällen, würde ich sie posten
      Ich frage, um Antwort zu erhalten, aber schreib' blos nix falsches a_20_e8d7189d
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Mal das ganze auf 20msec Wiederholrate gebracht.
      Servopuls.jpg
      Aber meine mikro-Servos (Jamara super micro 400x) drehen sich nur um 90°, per Hand kann man die um >180° drehen a_27_b277ca12

      BASCOM-Quellcode

      1. $regfile = "m168pdef.dat"
      2. $crystal = 20000000
      3. $hwstack = 32
      4. $swstack=32
      5. $framesize = 30
      6. Const Servo_anzahl = 4
      7. Dim Xx_ As Byte 'Umschalterin der isr
      8. Dim Servo_n As Byte 'Servonummer in der isr
      9. Dim Servo(servo_anzahl) As Word 'Stellwert0=1msec, 156=2msec
      10. Servoport Alias Portd
      11. Config Servoport = Output
      12. Config Timer2 = Timer , Prescale = 128 , Clear_timer = 1 '156 Takte für 1 msec
      13. On Compare2a Timer2_isr
      14. Start Timer2
      15. Enable Interrupts
      16. Dim N As Byte
      17. Compare2a = 156 'Startwert
      18. Servo_n = 0 : Xx_ = 0 'Startwert
      19. Enable Compare2a
      20. Servo(1) = 78
      21. Servo(2) = 0
      22. Servo(3) = 177
      23. Servo(4) = 78
      24. Do
      25. For N = 0 To 176
      26. Servo(1) = N
      27. Waitms 5
      28. Next N
      29. Wait 1
      30. For N = 176 To 0 Step -1
      31. Servo(1) = N
      32. Waitms 10
      33. Next N
      34. Wait 1
      35. Loop
      36. End
      37. Timer2_isr:
      38. If Xx_ = 0 Then
      39. Compare2a = 78 'für die Dauer von 0,5 msec
      40. If Servo_n < Servo_anzahl Then Servoport.servo_n = 0 'Portpin wird gesetzt
      41. Incr Servo_n 'Servonummer hochzählen
      42. If Servo_n > 12 Then Servo_n = 0
      43. If Servo_n < Servo_anzahl Then Servoport.servo_n = 1
      44. Xx_ = 1 'beim nächsten mal den else-Teil ausführen
      45. Else
      46. If Servo_n < Servo_anzahl Then
      47. Compare2a = Servo(servo_n + 1) + 78 'Einschaltdauer+ 0,5 msec =max 1,5 msec
      48. Else
      49. Compare2a = 156
      50. End If
      51. Xx_ = 0 'beim nächsten mal den true-Teil ausführen
      52. End If
      53. Return
      Alles anzeigen
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo

      Das mit 90° paßt schon viel mehr können die Servos Standartmässig auch nicht.
      Hier mal ein Servo aus deutscher Fertigung mit vernüftiger Beschreibung.
      becker-fm.de/shop/product/3020/Drehservo+s200?gID=31

      und hier ein weiteres
      graupner.de/Servo-digital-DES-678-BB-MG-16-mm/7943/ Reiter Spezifikationen

      Der Anschlag mit 180° ist der letzte Notanker bevor das Poti überdreht.
      Zusätzlich besteht heute die Möglichkeit bei den Computersendern die Mitte zu verschieben
      sowie die Ausschläge von 100% bis auf 150% zu erhöhen.
      Deshalb werden die Servos mit dem großen mechanischen Anschlag ausgeliefert.

      Gruß Bernd
    • Ja dann passt ja alles.
      Aber wenn ich das lese

      Bernd_57 schrieb:

      Zusätzlich besteht heute die Möglichkeit bei den Computersendern die Mitte zu verschieben
      sowie die Ausschläge von 100% bis auf 150% zu erhöhen.
      dann sind die 2msec nicht mehr Standard?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • elektron schrieb:

      die werden nicht besser, wenn man sie über die Anschläge dreht
      Hab' ich nicht, ich hab' schon ein Gefühl für einen Anschlag a_15_a5ddcf85
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • @elektron Was ist an 180° so sonderbar? betrachte die Bilder von Bernd, da sind die Anschläge auf 180°
      Modelbauservo digital/analog


      ceperiga schrieb:

      Sagt bescheid, wenn Ihr neue braucht
      Nur her damit!
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo tschoeatsch,
      Es sind ja keine Mühen zu gering: Obwohl ich es "im Gefühl" hatte, habe ich nochmal nachgeschaut und das gefunden:
      robotrack.org/include.php?path=article&contentid=210
      "Niemals ein Servo an seinem Stellhebel drehen !
      Dies hat zwei Gruende. Die Servouebersetzung liegt bei etwa 100:1. Bei
      den Billiggetrieben ist so schnell mal ein Zahn abgebrochen. Das Servo
      könnt ihr (dann) wegwerfen. (Font geändert von mir hier).
      Der zweite Grund ist, durch die hohe Uebersetzung wird mit einer halben
      Stellhebeldrehung der Motor 50x gedreht. Ein Kollektorläufermotor, wie
      sie in Servos verbaut sind wirken dann wie ein Generator der Strom
      erzeugt. Die Servoelekronik bekommt also Spannung VOM Motor. Das kann
      die H-Bruecke zerstören. Also bitte langsam drehen wenn es unbedingt
      nötig ist."
      Kannste demnach also entsorgen (falls es auf geringes Spiel ankommt).
      Erster Grund auch für Überdrehen der Stops.
      @ceperiga: Mülleimer fehlt noch. :D
      Und dann: Guten Rutsch, trinkende-smileys-211
      Gruß elektron
    • Warum soll ich mein schönes Servo wegschmeißen? Endlich eins, das ordentlich was aushält.
      Auch von mir die besten Wünsche zum Rutschen!
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Versuchs mal mit Pulseout im Beispiel 10 Mhz Microservo 9G Bei 4Mhz ist Pulseout 1µsec.
      Servoausschlag ca 175°grad.

      Quellcode

      1. $crystal = 10000000
      2. $regfile = "attiny85.dat"
      3. $hwstack = 32
      4. $swstack = 16
      5. $framesize = 24
      6. Dim Servospeed As Byte
      7. Dim Negservospeed As Byte
      8. Dim I As Integer
      9. Dim Centerservo As Integer
      10. Dim Leftservo As Integer
      11. Dim Rightservo As Integer
      12. Config Portb.0 = Output
      13. Config Pinb.1 = Input
      14. Config Pinb.2 = Input
      15. Portb.0 = 0
      16. Servospeed = 3
      17. Negservospeed = -13
      18. I = 0
      19. Centerservo = 4000
      20. Rightservo = 1700
      21. Leftservo = 6400
      22. Wait 1
      23. Do
      24. If Pinb.1 = 1 Then
      25. For I = Centerservo To Rightservo Step Servospeed
      26. Pulseout Portb , 0 , I ,
      27. Next
      28. Waitms 20
      29. Else
      30. For I = Rightservo To Centerservo Step Negservospeed
      31. Pulseout Portb , 0 , I ,
      32. Next
      33. Waitms 20
      34. End If
      35. If Pinb.2 = 1 Then
      36. For I = Centerservo To Leftservo Step Servospeed
      37. Pulseout Portb , 0 , I ,
      38. Next
      39. Waitms 20
      40. Else
      41. For I = Leftservo To Centerservo Step Negservospeed
      42. Pulseout Portb , 0 , I ,
      43. Next
      44. Waitms 20
      45. End If
      46. Loop
      47. End 'end program
      Alles anzeigen
    • Erstmal danke, aber, ohne das Programm probiert zu haben, ist das waitms 20 nicht an der falschen Stelle? Müsste doch innerhalb der for..next stehen.

      Für mich ist jetzt die Erkenntnis wichtig: ein Puls von 1...2msec ergibt einen Drehwinkel von 90° um die Mittelstellung, wenn man mehr möchte, muss man den Puls anpassen. Das hatte ich bei meinen flüchtigen Recherchen nicht mitbekommen.
      Raum für Notizen

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

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