- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: ZeichenKETTE einlesen und damit G'keit von 2 Steppern regeln

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Anzeige

    Powerstation Test
    Hab es nun hingekriegt, dass Tempo zu ändern *freu*. Aber eben erst mit einem Motor und ich will aber schon zwei ansteuern. Mit dem jetztigen Programm dreht sich der linke Stepper (Timer0) einwandfei.
    Kannst du nicht beide Motoren über den selben Timer steuern?
    Anstatt den Timerintervall zu ändern, könntest du doch mit festem Intervall eine Funktion aufrufen und in dieser Funktion entscheiden, ob die Motoren einen Schritt machen oder nicht.

    ungefähr so:

    Code:
    Dim Tempolinks As Byte
    Dim Temporechts As Byte
    Dim Temp As Byte
    Const X = 255 
    
    
    Sub Go()
       Incr Temp
       If Temp > Tempolinks Then Call Rechtermotorvor()
       If Temp > Temporechts Then Call Rechtermotorvor()
       If Temp = X Then Temp = 0
    End Sub
    
    
    
    Timerirq:
       Call Go()
    Return
    Bei X = 255 hoppelt dein Roboter vermutlich etwas um die Kurve, wenn du mit weniger Geschwindigkeitsstufen auskommst, könntest du X kleiner und dafür den Timerintervall entsprechend grösser machen.

    Das ist aber eh nur eine auf die schnelle hingeschmierte Idee. Es gibt sicherlich elegantere Lösungen beide Motoren mit einem Timer zu steuern. Den 2. Timer wirst du sicher irgendwann auch noch für was anderes gut gebrauchen können.

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    22.11.2004
    Ort
    Luzern
    Alter
    37
    Beiträge
    80
    Hallo recycle,

    Ja du hast es auf den Punkt gebracht. Das beste wäre wirklich beide Motoren mit nur einem Stepper zu steuern. Dazu fehlt mir aber bis jetzt der passende Ansatz.
    Bei deinem Beispiel blicke ich aber noch nicht ganz durch. Sollte da nicht bei
    If Temp > Tempolinks Then Call Rechtermotorvor()
    If Temp > Tempolinks Then Call Linkermotorvor() stehen. Andernfals verstehe ich den Ansatz gar nicht mehr. Und ausseredem ist ja da Vorwärts/Rückwärts noch nicht berücksichtigt (oder täusche ich mich da?), könnte man das nicht auch hineinbringen.

    Aber wenn du schon sagst,
    Das ist aber eh nur eine auf die schnelle hingeschmierte Idee.
    hoffe ich das sich jemand meldet der einen eleganten Ansatz kennt. Ich danke aber trotzdem für die Starthilfe.


    Gruss commander7

  3. #13
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hi, ich mach das so: Ich laß den Timer0 mit 1 mS permanent tickern. Und für jeden Motor gibt es einen Wert, nach wieviel solchen Tickern er einen Step machen soll (=Geschwindigkeit).
    Die Festlegung der Richtung der einzelnen Motoren und der Speed-wert werden woanders festgelegt (also bei dir in der PC-Kommandobearbeitung, bei anderen durch Sensoren, etc)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #14
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    54
    Beiträge
    1.258
    Hallo commander7,
    Ist es möglich, dass der Fehler eintritt, weil sich Timer0 und Timer2 irgendwie in die Quere kommen oder hab ich was falsch programmiert?
    prinzipiell solltest du systematisch vorgehen und dein Programm Schritt für Schritt ausbauen.
    Das was du vorhast geht aber. Hier ein Video:
    Bild hier  
    Bei diesem Roboter werden die Schrittmotoren über Timer0 und Timer1 angesteuert(Timer2 hat er nicht). Damit kann er saubere Kurven ohne Ruckeln fahren.
    Versuche also erstmal Timer2 richtig zum laufen zu bringen, erster Ansatz wäre, gleiche Werte in beide Timer zu schreiben, dann siehst du, ob Timer2 richtig funktioniert.
    Gruß, Michael

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    22.11.2004
    Ort
    Luzern
    Alter
    37
    Beiträge
    80
    hallo PicNick,

    vielen dank für deine Antwort. Könntest du mir noch ein wenig nachhelfen (wie sag ich dem AVR nach wievielen Ticks er den Step machen soll?). Ich bin noch Anfänger bei der Programmierung von AVR Chips und das oben gepostete Programm von mir ist das Beste, was ich im Moment hinkriege.

    gruss commander7

  6. #16
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Naja, ich versuch mal das wesentliche zusammenzufassen
    Code:
    $crystal = 8000000                                'Quarzfrequenz
    $baud = 9600                                      'Baudrate für RS232
    
    Config Timer0 = Timer , Prescale = 64           'Timer 1mS
    Const Tmr_c_preload = 131
    
    Dim Timflag  As Byte  
    
    Dim Stpleft As Byte                              '
    Dim Speedleft As Byte                          ' 
    
    Dim Stpright As Byte                            '
    Dim Speedright As Byte                        '
    
    Enable Interrupts                                 'General enable
    
    On Timer0 Interrupt_ticker                        ' Timer for Timer Queue
    
    Enable Timer0
    Start Timer0                                      ' timer starten
    
    Timer0 = Tmr_c_preload
    
    
      Speedleft   = 10   ' Geschwindigkeit linker Mot
                               ' je kleiner, je schneller 
                              '   ca 2 od. 3 ist maximum, je nach motor
      Speedright = 15   ' rechter Mot    (etwas langsamer)                     
    
    
    
    Do
          if Timflag  = 1 then 
              Timflag  = 0
              decr Stpleft
              if Stpleft = 0 then 
                    Stpleft = Speedleft
                    call schrittlinks()      ' ein schritt linker motor
              end if
              decr Stpright
              if Stpright = 0 then 
                    Stpright = Speedright
                    call schrittrechts()   ' ein schritt rechter motor
              end if
          end if
    
    
      Loop
    
     End
    
    '=============================
    Interrupt_ticker:
    Timer0 = Tmr_c_preload
          Timflag  = 1
    Return
    Wie gesagt, der Timer gibt alle mS ein Signal
    das merkt er in der Do-Schleife und setzt das Signal zurück.
    dann wird erst vom linken Zähler eins abgezogen
    kommt null raus, --> ein Schritt und Zähler wieder auf "speed"

    dann dasselbe rechts

    In einer mS mach der 8 MHZ - AVR 8000 Cycles, d.h Zeit genug, zwischendurch sich mit der Tastatur zu befassen oder mit sensoren.
    Warteschleifen sind allerding pfui.

    Die Speed kann jederzeit irgendwo anders im Programm geändert werden
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    22.11.2004
    Ort
    Luzern
    Alter
    37
    Beiträge
    80
    @PicNick:
    Vielen Dank, werde mal versuchen damit etwas zurechtzubasteln.

    @Michael:
    hab mal den Timer2 etwas untersucht. Bei meinem Programm für nur einenen Stepper funktioniert alles mit dem Timer0 einwandrei. Nun habe ich das mal mit dem Timer2 getestet und schon fing der Motor wieder an zu meckern. Die Richtung stimmt zwar und ändert sich richtig, aber schon bei Tempo = 0 dreht der Motor sehr schnell und wenn ich das Tempo nur wenig erhohe, dann fängt er an zu stocken bis hin zum Pfeiffkonzert (übrigens genau gleich wie mit beiden Motoren gleichzeitig).
    Ich kann einen Hardwarefehler ausschliessen, da ich das gleiche Problem auch mit dem anderen Motortreiber und Stepper probiert habe.
    Tritt genau das gleiche Problem auf.

    Timer0 und Timer2 sollten doch bei einem AtMega8 genau gleich sein, nur der Timer1 ist doch ein 16Bit Timer.
    Könnte vieleicht an den Fuses etwas falsch eingestellt sein, oder was stimmt sonst mit meinem Timer2 nicht ???

    gruss commander7

  8. #18
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    54
    Beiträge
    1.258
    Hallo commander7,
    nur der Timer1 ist doch ein 16Bit Timer.
    du kannst ihn ja zw. 65280 und 65535 betreiben. Dann verhält er sich (in diesem Fall) wie ein 8 bit Timer.

    Nun habe ich das mal mit dem Timer2 getestet und schon fing der Motor wieder an zu meckern....
    ....oder was stimmt sonst mit meinem Timer2 nicht ???
    wahrscheinlich wird Timer2 von Bascom nicht richtig angesprochen.

    Gruß, Michael

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    22.11.2004
    Ort
    Luzern
    Alter
    37
    Beiträge
    80
    was kann man da machen? Habe Bascom Version 1.11.7.3.

    gruss commander7

  10. #20
    Benutzer Stammmitglied
    Registriert seit
    22.11.2004
    Ort
    Luzern
    Alter
    37
    Beiträge
    80
    Hab es nun mit dem Timer1 und 65280 - 65535 hingekriegt und die Timer kommen sich nicht spürbar in den Weg. Glücklich bin ich damit aber noch nicht ganz. Es nimmt mich schwer wunder was mit dem Timer2 los ist...

    Hatte jemand auch schon ein solches Problem???

    mfg commander7

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen