Servo Drehgeschwindigkeit verlangsamen "Slow Down Tiny"

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

    • Servo Drehgeschwindigkeit verlangsamen "Slow Down Tiny"

      Hallo zusammen,

      habe schon wieder ein neues Projekt am Start, bei dem ich mal Eure Hilfe benötige. Es geht darum, einen Servo in der Geschwindigkeit langsamer zu machen.

      Die Idee: Es gibt eine Quelle, die ein Servo Signal ausgibt. Dieses kommt als Eingang (PB0 ) in einen Tiny13. Über ein ADC(2) und Poti kann die Geschwindigkeit eingestellt werden und das Signal wird wieder ausgegeben (PB1).

      Nun wäre Interessant zu wissen, ich ich am besten das Servo Signal einlese ? Mit Pulsein oder einem Timer ?

      Bin für alle Tipps dankbar !
    • mir ist nicht ganz klar, was es werden soll.
      Wäre nett, wenn du damit das nächste mal gleich rausrückst.

      Wenn das Servo langsamer fahren soll (meine Frage im letzten Post), dann liest du den Sollwert mit Pulsin (oder Timer) ein und vergleichst das mit dem Wert für Pulsout. ist der Wert für Pulsout kleiner, dann addierst du ein wenig dazu und gibst ihn aus. Ist er größer, subtrahierst du eben. Nach einiger Zeit ist der Ausgabewert = Sollwert, durch die Verzögerung fährt es eben langsamer.
    • die Drehgeschwindigkeit eines Servos hängt doch mit der Veränderung der Pulsbreite zusammen. Wenn sich ein Servo langsam bewegen soll, dürfen sich die Pulsbreiten eben nur langsam verändern. Du müsstest die schnelle Pulsbreitenveränderung (schnelle Bewegung) in viele kleine Veränderungen aufteilen und die über einen längeren Zeitraum ausgeben. Was hast du für eine Anwendung? Ein schnelles hin und her kannst du ohne Drehwinkelverlust nicht verlangsamen. Deine schnelle Bewegung muss Pausen machen, die die langsame Bewegung braucht, um in die gleiche Endposition zu kommen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Die Anwendung:

      Ich habe eine Platine, die ein Servo Signal ausgibt. Diese bietet 3 Posotion. Die Positionen werden über eine Kippschalter gewählt. Hier fährt das Servo jedoch schnell auf die Positionen. Für Schuppentore bei der Modellbahn oder Ähnliches sollte man mit der Zusatzplatine die Geschwindigkeit einstellen können. So die Idee.
    • ist nicht ganz einfach, glaube ich. Du bräuchtest einen 'Speicher', der die Pulse der schnellen Bewegung zwischenspeichert, für die langsame Bewegung werden zwei benachbarte Speicherinhalte hergenommen und die Differenz der beiden Werte in kleinere Teilwerte aufgestückelt. Die Anzahl der Teilstücke wird mit dem Poti eingestellt, diese Teilstücke werden zum langsamen Servo ausgegeben. Die schnelle Bewegung muss aber zwangsweise Pausen machen, damit die langsame nach kommt. Dann könnte ein Ringspeicher (Ringpuffer) gehen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Habe es erstmal ohne Pause versucht. Wollt nur das Servo Signal durch den Tiny schicken. Das klappte schon nicht.

      BASCOM Source Code

      1. '*************************************************************************************************
      2. '* *
      3. '* Tiny13 mit 4,8 MHz *
      4. '* *
      5. '* Servo Slow Down Steuerung *
      6. '* *
      7. '*************************************************************************************************
      8. ' Diese Steuerung dient dazu, ein Servo in der Geschwindigkeit einstellbar zu machen. Die Geschwingkeit
      9. ' kann über einen Poti ( ADC1 - PB4 ) eingestellt werden. Der Servoeingang befindet an PB0, der Servo-
      10. ' ausgang an PB1.
      11. $regfile = "attiny13.dat"
      12. $crystal = 4800000
      13. $swstack = 10
      14. $hwstack = 10
      15. ' Ein-/Ausgänge festlegen
      16. ' Eingänge:
      17. Config Pinb.0 = Input
      18. Config Portb.4 = Input
      19. ' Ausgänge:
      20. Config Portb.1 = Output
      21. ' Variablen festlegen:
      22. Dim Poti As Byte
      23. Dim Puls As Word
      24. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      25. Start Adc
      26. Poti = Getadc(2)
      27. ' Hier beginnt das Hauptprogramm
      28. Do
      29. Pulsein Puls , Pinb , 0 , 0
      30. ' Hier müsszte Pause rein bzw. Poti abfrage
      31. Pulseout Portb , 1 , Puls
      32. Loop
      Display All
    • Programm für servotester mit speedänderung.

      BASCOM Source Code

      1. $crystal = 1000000
      2. $regfile = "attiny85.dat"
      3. Dim Servospeed As Integer
      4. Dim Negservospeed As Integer
      5. Dim I As Integer
      6. Dim Centerservo As Integer
      7. Dim Leftservo As Integer
      8. Dim Rightservo As Integer
      9. Config Pinb.4 = Output 'servo signal
      10. Config Pinb.0 = Input '2ms throw button
      11. Config Pinb.1 = Input '1ms throw button
      12. Config Pinb.2 = Input 'fast button
      13. Portb.0 = 1
      14. Portb.1 = 1
      15. Portb.2 = 1
      16. Portb.4 = 0
      17. Servospeed = 3
      18. Negservospeed = -3
      19. I = 0
      20. Centerservo = 640
      21. Rightservo = 430
      22. Leftservo = 850
      23. 'Wait 1
      24. Do
      25. If Pinb.0 = 0 Then
      26. 'Slow Speed
      27. If Pinb.1 = 0 Then '1ms pulse out
      28. For I = Centerservo To Rightservo Step Negservospeed
      29. Pulseout Portb , 4 , I
      30. Waitms 20
      31. Next
      32. End If
      33. If Pinb.2 = 0 Then
      34. For I = Centerservo To Leftservo Step Servospeed
      35. Pulseout Portb , 4 , I
      36. Waitms 20
      37. Next
      38. End If
      39. If Pinb.1 = 1 And Pinb.2 = 1 Then
      40. Pulseout Portb , 4 , Centerservo
      41. Waitms 20
      42. End If
      43. Else
      44. 'Fast speed
      45. If Pinb.1 = 0 Then '1ms pulses
      46. Pulseout Portb , 4 , Rightservo
      47. Waitms 20
      48. End If
      49. If Pinb.2 = 0 Then
      50. Pulseout Portb , 4 , Leftservo '2ms pulses
      51. Waitms 20
      52. End If
      53. If Pinb.1 = 1 And Pinb.2 = 1 Then '1.5ms pulses
      54. Pulseout Portb , 4 , Centerservo
      55. Waitms 20
      56. End If
      57. End If
      58. Loop
      59. End 'end program
      Display All
    • Wenn ich mir das genauer anschaue, müsste doch zumindet das Durchschleifen von PB0 zu PB1 funktionieren. Das ist leider nicht der Fall. Hier nochmal das aktuelle Programm:

      Source Code

      1. '*************************************************************************************************
      2. '* *
      3. '* Tiny13 mit 4,8 MHz *
      4. '* *
      5. '* Servo Slow Down Steuerung *
      6. '* *
      7. '*************************************************************************************************
      8. ' Diese Steuerung dient dazu, ein Servo in der Geschwindigkeit einstellbar zu machen. Die Geschwingkeit
      9. ' kann über einen Poti ( ADC1 - PB4 ) eingestellt werden. Der Servoeingang befindet an PB0, der Servo-
      10. ' ausgang an PB1.
      11. $regfile = "attiny13.dat"
      12. $crystal = 9600000
      13. $swstack = 10
      14. $hwstack = 10
      15. ' Ein-/Ausgänge festlegen
      16. ' Eingänge:
      17. Config Pinb.0 = Input
      18. Config Pinb.4 = Input
      19. ' Ausgänge:
      20. Config Portb.1 = Output
      21. ' Variablen festlegen:
      22. Dim Poti As Byte
      23. Dim Ppm As Byte
      24. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      25. Start Adc
      26. Poti = Getadc(2)
      27. ' Hier beginnt das Hauptprogramm
      28. Do
      29. Pulsein Ppm , Pinb , 0 , 1
      30. ' Hier müsste Pause rein bzw. Poti abfrage
      31. Pulseout Portb , 1 , Ppm
      32. Loop
      Display All
    • Vielen Dank für den Tipp. :) Nun klappt es. Nur leider nicht so, wie gedacht. Ich glaube da kommt das zum Tragen, was tschoeatsch geschrieben hat. Das Servo dreht zwar langsamer, aber auch die Schritte werden so größer. Mit dem Wert * 25 in Zeile 45 stimmen die Servoposition mit der Servosteuerung überein. Also egal ob MIT oder OHNE Tiny dazwischen sind die Servo Positionen immer die selben.

      BASCOM Source Code

      1. '*************************************************************************************************
      2. '* *
      3. '* Tiny13 mit 4,8 MHz *
      4. '* *
      5. '* Servo Slow Down Steuerung *
      6. '* *
      7. '*************************************************************************************************
      8. ' Diese Steuerung dient dazu, ein Servo in der Geschwindigkeit einstellbar zu machen. Die Geschwingkeit
      9. ' kann über einen Poti ( ADC1 - PB4 ) eingestellt werden. Der Servoeingang befindet an PB0, der Servo-
      10. ' ausgang an PB1.
      11. $regfile = "attiny13.dat"
      12. $crystal = 9600000
      13. $swstack = 10
      14. $hwstack = 10
      15. ' Ein-/Ausgänge festlegen
      16. ' Eingänge:
      17. Config Pinb.0 = Input
      18. Config Pinb.4 = Input
      19. ' Ausgänge:
      20. Config Portb.1 = Output
      21. ' Variablen festlegen:
      22. Dim Poti As Integer
      23. Dim Ppm As Integer
      24. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      25. Start Adc
      26. Poti = Getadc(2)
      27. ' Hier beginnt das Hauptprogramm
      28. Do
      29. Pulsein Ppm , Pinb , 0 , 1
      30. Ppm = Ppm * 25
      31. Waitms 100 ' Ermal testweise mit direkt Wert.
      32. Pulseout Portb , 1 , Ppm
      33. Loop
      Display All

    • Du hast es noch nicht ganz verstanden.
      Im Prinzip läuft das genauso wie bei deinem Lauflicht.
      Der Sollwert von Pulsin wird verglichen mit dem aktuellen Wert (dem letzten Pulsout)
      Natürlich über eine Variable dazwischen.
      Weicht der aktuelle Wert vom Sollwert ab, dann wird er in die entsprechende Richtung addiert, in kleinen Schritten.
      Die Ausgabefrequenz der Impulse musst du beibehalten.

      Ich schrieb es bereits:
      Do
      Warten auf impuls
      Impuls einlesen.
      Kleinen Schritt auf den Ausgabewert addieren wenn ungleich.
      Impuls ausgeben
      Loop
    • Ich glaube ich bin zu doof.

      Habe jetzt nochmal etwas versucht. Ohne Erfolg....

      BASCOM Source Code

      1. '*************************************************************************************************
      2. '* *
      3. '* Tiny13 mit 4,8 MHz *
      4. '* *
      5. '* Servo Slow Down Steuerung *
      6. '* *
      7. '*************************************************************************************************
      8. ' Diese Steuerung dient dazu, ein Servo in der Geschwindigkeit einstellbar zu machen. Die Geschwingkeit
      9. ' kann über einen Poti ( ADC1 - PB4 ) eingestellt werden. Der Servoeingang befindet an PB0, der Servo-
      10. ' ausgang an PB1.
      11. $regfile = "attiny13.dat"
      12. $crystal = 9600000
      13. $swstack = 10
      14. $hwstack = 10
      15. ' Ein-/Ausgänge festlegen
      16. ' Eingänge:
      17. Config Pinb.0 = Input
      18. Config Pinb.4 = Input
      19. ' Ausgänge:
      20. Config Portb.1 = Output
      21. ' Variablen festlegen:
      22. Dim Poti As Integer
      23. Dim Ppm_in As Integer
      24. Dim Ppm_out As Integer
      25. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      26. Start Adc
      27. ' Hier beginnt das Hauptprogramm
      28. Do
      29. Pulsein Ppm_in , Pinb , 0 , 1
      30. Poti = Ppm_in ' Postiwert testweise als PPM_in
      31. If Poti < Ppm_in Then
      32. Incr Ppm_in
      33. Elseif Poti > Ppm_in Then
      34. Decr Ppm_in
      35. Elseif Poti = Ppm_in Then
      36. Ppm_out = Ppm_in
      37. End If
      38. Pulseout Portb , 1 , Ppm_out
      39. Loop
      Display All