Neu hier und eine Frage zur Servoansteuerung

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

    • Neu hier und eine Frage zur Servoansteuerung

      New

      Hallo Forum,

      ich klopfe hier mal dreimal auf den Tisch *klopf, klopf, klopf* und gebe ein anerkennendes "Hallo" in die Runde! Ich bin schwer beeindruckt, was Ihr so drauf habt!
      Ich bin hier jedenfalls neu, heiße Stefan, komme aus Norddeutschland und habe schon seit vielen Jahren damit geliebäugelt, mit der Mikroprozessorprogrammierung anzufangen. Allerdings habe ich mich zunächst nicht getraut, weil ich gedacht habe "Das schnall ich nie..!". Kurz vor Weihnachten habe ich dann doch damit angefangen und das war ein Erfolgserlebnis nach dem anderen. Auch wenn es objektiv gesehen kleine bedeutungslose Schritte waren - für einen Anfänger wie mich waren große Erfolge: Bascom-Basics verstanden, Programmer zu laufen gebracht, das erste Programm (eine blinkende LED) auf dem ATmega8, AD Wandlung, LCD-Einsatz, Timereinsatz und Programmierung mit Zeitsabständen... alles schön und vor Allem: Viel einfacher als erwartet! :)
      Die Einarbeitung in die verschiedenen Themen lief etwas "redneckmäßig": Ich habe mir im Netz einfache Programme gesucht und wenn die funktionierten, dann habe ich nachvollzogen warum und dann die Programme solange verändert, bis sie die von mir gewünschte Funktion erfüllten. Da lernt man schnell und Spaß machts auch... ^^
      Jetzt bin ich aber leider doch an eine Grenze gestoßen, an der ich partout nicht weiter komme:
      Ich möchte ein Servo ansteuern, der einen Schieberegler steuern soll. Bascom hat ja dafür extra die Funktion "Config Servos = 1 , Servo1 = Portb.0 , Reload = 10" aber damit klappt es überhaupt nicht. Mein Servo macht bei einem anderen Programm, das ohne diesen Menüpunkt Servos ansteuert zwar eine müde, schwächliche Drehbewegung aber das müsste viel besser gehen. Seit vielen Abenden sitze ich an diesem Problem, google, lese Tipps, probiere Programme aber es hilft nichts... :(
      Deswegen möchte ich gerne ein paar Fragen an Euch stellen:
      Gibt es Servos, die zu diesem Befehl (config Servo...) einfach nicht kompatibel sind? (Mein Servo: Amewi Standard Digital DC5821LV WP)
      An welchen Parametern des Programms sollte ich probeweise modifizieren, damit das Servo sich dann doch mal rührt?
      Sind die Ausgänge des Atmega8 alle gleichwertig zur Ansteuerung eines Servos... also egal ob Pinc.5 oder Pinb.0?

      Für hilfreiche Antworten wäre ich dankbar, viel Grüße,
      Stefan
    • New

      Willkommen im Forum :)

      froschkoenig wrote:

      Gibt es Servos, die zu diesem Befehl (config Servo...) einfach nicht kompatibel sind?
      Also soweit ich weiss gehen mit dem Befehl nur analoge Servos, da ja die analogen Servos ein Puls-Pause-Impuls brauchen und der Servo-Befehl von Bascom diese liefert.
      Falls du einen Analogen zur Hand hast, teste es mal damit.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • New

      froschkoenig wrote:

      Sind die Ausgänge des Atmega8 alle gleichwertig zur Ansteuerung eines Servos
      Sie gehen alle, müssen aber als Ouput configuriert werden. ;) Der Anschlag ist Clock/Servoabhängig.
      Ich fuhr hier welche von 30-130. Nachdem ich den Clock halbiert hatte (4Mhz) hingen sie im Anschlag. Seitdem machen sie die 180° von 40-140.
      Arbeiten die Digitalen nicht auch mit Pulsbreite?
    • New

      froschkoenig wrote:

      Für hilfreiche Antworten wäre ich dankbar
      Ich hätte schon ein paar Ideen für Antworten, aber da wäre das Programm ganz gut.
      Poste es doch bitte noch, dann muss man nicht raten.

      djmsc wrote:

      nur analoge Servos
      digitale nennen sich nur so, weil sie intern die analogen Pulse mit einer Art Controller aufbereiten.

      Im übrigen sind analoge Servos eigentlich auch digital, Puls ist da, oder nicht ;)
    • New

      stefanhamburg wrote:

      Nur zur Sicherheit: Der Servo sollte nicht an derselben Spannungsversorgung wie der Mikrocontroller. Gnd muss aber verbunden sein.
      Hallo stefanhamburg,
      ja, das habe ich gleich gecheckt. (Super Username, übrigens ;) )

      @all: Dank für die Antworten!

      Ich habe jetzt herausgefunden, dass zu diesem Servo eine Frequenz von 333 Hz angegeben wird. Was das genau bedeutet, weiß ich nicht. Möglicherweise ist ja damit die Signalhäufigkeit gemeint. Normale Servos wollen wohl 50 Hz, also alle 20 msek ein Signal.
      Eines meiner Servotestprogramme sieht so aus:
      ***********************************************************************
      $regfile = "m8def.dat"
      $crystal = 8000000
      Config Servos = 1 , Servo1 = Portc.0 , Reload = 10
      Config Portc = Output
      Enable Interrupts

      Servo(1) = 100
      waitms 1000
      Servo(1) = 70
      waitms 1000
      Servo(1) = 130
      waitms 1000
      end
      *********************************************************************
      Kann ich da mit Reload die Frequenz der Signale beeinflussen? Oder sind die Zahlen für die Servopositionen völlig daneben? Oder mit $crystal eine andere Frequenz vorgeben?
      Zu viele mögliche Einflussgrößen für einen Anfänger... :(

      Gruß, Stefan
    • New

      froschkoenig wrote:

      Oder mit $crystal eine andere Frequenz vorgeben?
      Den Compiler belügen? Kann im Einzelfall funktionieren ist aber eine ganz schlechte Idee: ALLE Timings stimmen dann nicht mehr (Baudrate, Uhr, Timer). Was ein Problem werden kann wenn der Code erweitert oder woanders benützt wird.
      Er hat wirklich 8Mhz? Per Quarz oder Fuses? Mit 1Mhz (Auslieferungszustand) funktioniert der Servo Befehl nicht.
      Ich hätte die Befehle in eine Do(nach Enable Interrupts) ... Loop(vor dem End) gebettet. Jetzt fährt er nur einmal etwas hin und her und macht dann nie wieder was.
      Eine Refresh Rate von 333Hz habe ich noch nicht gesehen. Läßt sich aber gut testen:
      do
      set portc.0
      waitus 1400
      reset portc.0
      waitus 1600
      Loop
      würde ihn dann irgendwo mittig halten ?
    • New

      Sorry... Die Stackangaben habe ich beim Kopieren vergessen:
      *******************************************************************************
      $regfile = "m8def.dat"
      $crystal = 1000000
      $swstack = 32
      $hwstack = 32
      $framesize = 40
      Config Servos = 1 , Servo1 = Portd.7 , Reload = 10
      Config Portd = Output
      Enable Interrupts
      Servo(1) = 100
      waitms 1000
      Servo(1) = 70
      waitms 1000
      Servo(1) = 130
      waitms 1000
      end
      **********************************************************************************
      Es klappt leider trotzdem nicht. :( Ich würde sogar den Compiler belügen... es wäre ja eine Notlüge. ;)
      Nein, im Ernst: Ich habe schon alle möglichen Werte bei $crystal probiert - die Eingabe scheint schon einen Einfluss auf die Timer zu haben. Leider habe ich noch nicht verstanden, wie man die Taktfrquenz "richtig" auf 8000000 Hz umstellt.
      Also mit 1000000 Hz funktioniert "config servo" überhaupt nicht?
      Einen externen Quarz habe ich jedenfalls nicht am Start. Ich bin ja noch in einem Stadium, in dem ich alles möglichst einfach und überschaubar halten möchte.

      @ Pluto: Deine nette Schleife werde ich heute abend mal ausprobieren. Danke dafür. Gute idee!

      Gruß, Stefan
    • New

      Ich experimentiere noch gar nicht. Erst heute abend wieder. :)
      djmsc schreibt ja sinngemäß "... falls zur Hand, teste mal analoges Servo" und "Soweit ich weiß geht digital nicht..." Andere Postings wiederum haben mir Mut gemacht, dass es vielleicht doch noch klappen könnte. :|
      Leider habe ich keinen analoges zur Hand und so schnell wollte ich nicht aufgeben, bevor ich mein neues digitales Servo auf den Müll werfe.

      Wenn Du jetzt aber "Never ever digital, ganz sicher!" sagst, dann bestelle ich mir noch heute ein analoges Servo. :)

      Gruß, Stefan
    • New

      avralfred wrote:

      Entweder habe ich überlesen dass du nun mit einem analogen Servo experimentierst.....
      Wenn nicht: -> Mit deinem digitalen Servo wird das nicht klappen! Siehe auch Post2 von djmsc

      Warum sollte das nicht klappen ???

      Es ist ein ganz normales, handelsübliches Modellbauservo. Diese können (egal ob analog oder digital) mit jedem Standart Servosignal angesteuert werden. Ein Standart Servosignal besteht aus einer 1ms bis 2ms langer High-Phase, welche ca alle 20ms wiederholt wird. Digitalservos kommen zwar auch mit kürzeren Refreshzeiten zurecht, ändert aber nichts an der Tatsache, dass lediglich die 1ms-2ms ausgewertet werden.

      Froschkoenig:
      Funktioniert Dein Servo normal, wenn Du es an einen Servotester oder einem RC Empfänger ranhängst?

      The post was edited 1 time, last by R2D2 Bastler ().

    • New

      @R2D2 Bastler: So etwas habe ich leider nicht.
      Allerdings habe ich ein bisschen herum gegooglet, ob in RC-Anlagen digitale und Analoge Servos gegeneinander ausgetauscht werden können. Die überwiegende Meinung: Ja. Allerdings heißt das nicht im Umkehrschluss, dass digitale Servos mit dem "Config Servo"-Befehl funktionieren müssen.

      Alles nicht so einfach... :|

      Gruß, Stefan
    • New

      Ich hab jetzt gerade etwas rumgetestet. Wenn Dein Controller nur mit 1Mhz läuft, funktioniert der Servo Befehl praktisch gar nicht mehr (Refreshzeiten von ca 127ms). Ob Dein Kontroller mit 1Mhz oder 8Mhz läuft, kannst Du ganz einfach testen. Lade mal das Programm hier auf Deinen Atmega8 und schließe eine LED (mit Vorwiderstand) an den im Programm genannten Pin an. Blinkt sie im Sekundentakt (eine sec an, eine sec aus), dann läuft Dein Kontroller mit 8MHz.
      Dauert das Blinken aber 8 Sekunden (8sec an, 8sec aus), dann läuft er nur mit 1MHz.

      BASCOM Source Code

      1. '
      2. '---------------------------------------------
      3. '
      4. ' LED Blinker
      5. ' LED über Vorwiderstand (ca 330 Ohm) auf GND
      6. '
      7. '---------------------------------------------
      8. $regfile = "m8def.dat" ' ATMega 8
      9. $crystal = 8000000
      10. $hwstack = 32
      11. $swstack = 8
      12. $framesize = 24
      13. Led Alias PortB.0 ' Hier Ausgabepin angeben
      14. Config Led = Output
      15. Do
      16. Toggle LED
      17. Wait 1
      18. Loop
      19. End
      Display All
    • New

      @froschkoenig: Die Taktgeschwindigkeit änderst Du (bei internem Takt) mit den Fuses. Ab Fabrik läuft der ATmega8 mit 8 MHz und einem Vorteiler durch 8. Ergibt 1 MHz. Das muss dem BASCOM-Compiler mit $crystal mitgeteilt werden.
      Wenn in den Fuses der Teiler durch 8 deaktiviert wird, dann läuft der ATmega8 mit 8 MHz. Das muss dann BASCOM auch mit $crystal mitgeteilt werden. Ansonsten nichts an den Fuses anfassen!
    • New

      R2D2 Bastler wrote:

      Ich hab jetzt gerade etwas rumgetestet. Wenn Dein Controller nur mit 1Mhz läuft, funktioniert der Servo Befehl praktisch gar nicht mehr (Refreshzeiten von ca 127ms). Ob Dein Kontroller mit 1Mhz oder 8Mhz läuft, kannst Du ganz einfach testen. Lade mal das Programm hier auf Deinen Atmega8 und schließe eine LED (mit Vorwiderstand) an den im Programm genannten Pin an. Blinkt sie im Sekundentakt (eine sec an, eine sec aus), dann läuft Dein Kontroller mit 8MHz.
      Dauert das Blinken aber 8 Sekunden (8sec an, 8sec aus), dann läuft er nur mit 1MHz.
      Danke dafür. ich habe es angewendet: Das blinkt in 8 sek ...also läuft mein Prozessor mit 1000000 Hz.