- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 8 von 8

Thema: Schrittmotor zeitpräzise steuern

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Man braucht nicht für jeden Motor einen eigenen Timer. Es reicht 1 Timer, der die ganze Zeit durch läuft und es wird nur das Output compare Register angepasst. Das entspricht in etwa der Weckzeit für einen Wecker. Man hat bei Timer 1 in der Regel 2 solcher Register. Für mehr Motoren wird es aber schon etwas aufwendiger.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    15.03.2011
    Ort
    Dresden
    Alter
    37
    Beiträge
    1.937
    Ich bin jetzt gerade dabei, ein wenig mit dem Timer herum zu probieren, allerdings gibts da wohl noch ein paar Verständnisprobleme. Ich habe jetzt folgenden einfachen Code geschrieben:
    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 1000000
    $baud = 9600
    
    
    Config Portc.1 = Output
    Config Timer1 = Timer , Prescale = 256
    Enable Timer1
    On Timer1 Led
    Enable Interrupts
    
    Led:
    Toggle Portc.1
    Timer1 = 34215
    Return
    Eigentlich müsste die LED etwa alle 16 Sekunden an/aus gehen, stattdessen flackert sie aber nur ziemlich schnell...was mache ich falsch?

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Es fehlt irgendwie noch ein Hauptprogramm. Da sollte einfach eine Endlosschleife rein, oder wenn man es ganz vornehm will, auch noch den µC in den Idel- Mode versetzen. Ich weiss nicht was Bascom am Ende des Programms macht, und wie der µC darauf dann reagiert. Das könnte aber die Ursache sein.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    15.03.2011
    Ort
    Dresden
    Alter
    37
    Beiträge
    1.937
    Hab das mittlerweile auch schon herausgefunden und mit einem !Nop in einer schleife gelöst (hab ich beim Suchen so gefunden). Zur Erzeugung einer Rampe habe ich folgenden Link entdeckt:
    http://www.mikrocontroller.net/artic..._und_berechnen
    Besonders das hier:
    Häufigster Fehler
    Die Rampe wird unter der Prämisse erstellt, die Zeit zwischen den Einträgen sei konstant, man könne also die linear berechneten Frequenz- oder Timerwerte einfach so eintragen. DEM IST NICHT SO. Die Mitte der Liste ist bei Weitem nicht nach der halben Rampenzeit erreicht, da Schritte am Anfang wesentlich langsamer ausgeführt werden. Die Liste muss bei niedrigen Geschwindigkeiten grobe, bei hohen Geschwindigkeiten feine Abstufungen haben.

    Richtig ist: nach jedem Step die Zeit seit Beschleunigungsbeginn (einfach die Timer-Werte aufaddieren), daraus die gewünschte Frequenz und daraus den benötigten Timer-Wert berechnen.
    Hatte den Fehler erst auch gemacht *schäm*
    und versuche das nun irgendwie umzusetzen, irgendwie steh ich da aber noch auf dem Schlauch...

    edit:
    Hab den Code jetzt so weit gebracht:
    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 1000000
    $baud = 9600
    
    Config Portc.0 = Output
    Config Portc.1 = Output
    Config Timer1 = Timer , Prescale = 8
    Enable Timer1
    On Timer1 Led
    Enable Interrupts
    
    Dim A As Word
    Dim V As Word
    Dim V0 As Word
    Dim S As Word
    Dim Sk As Word
    Dim Sa As Word
    Dim Sv As Word
    Dim Temp As Single
    Dim Temp1 As Word
    Dim T As Single
    Dim Ta As Single
    Dim Tp As Word
    Dim B As Long
    Dim Zeit As Single
    
    S = 20000
    V = 1000
    A = 200
    V0 = 100
    
    Temp1 = V - V0
    Temp = Temp1 * Temp1
    Sa = Temp1 / A
    
    Sk = S - Sa
    T = 1 / V0
    
    Zeit = T
    B = 0
    
    Do
    
      If B = S Then B = 0
    
      If B < Sa Then
        Temp = A * Zeit
        Temp = Temp + V0
        T = 1 / Temp
        Temp = 125000 * T
        Tp = Round(temp)
      Elseif B > Sk Then
        Temp = Ta - Zeit
        Temp = A * Temp
        Temp = Temp + V0
        T = 1 / Temp
        Temp = 125000 * T
        T = Round(temp)
      Else
        T = 1 / V
        Temp = 125000 * T
        Tp = Round(temp)
        Zeit = 0
      End If
    
      If B = Sa Then Ta = Zeit
    Loop
    End
    
    Led:
    Toggle Portc.1
    Load Timer1 , Tp
    Zeit = Zeit + T
    Incr B
    Toggle Portc.1
    Return
    Allerdings ergibt das Ganze nur ein seltsames Stocken am Schrittmotor. Findet wer den Fehler?
    Geändert von Geistesblitz (09.07.2011 um 22:04 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    15.03.2011
    Ort
    Dresden
    Alter
    37
    Beiträge
    1.937
    Auch wenn sich keiner weiter gemeldet hat, nach langem Herumprobieren habe ich es doch so halbwegs hinbekommen. Hier mal ein Video davon:



    Am Ende kann man etwas sehen, was mich sehr stört und ich weiß auch nicht, wo das her kommt. Der Motor fährt nicht bis auf die Mindestgeschwindigkeit und kehrt dann um, sondern fährt bis ganz herunter und bekommt dann Probleme, da dann die Frequenz zu klein für den Timer wird. Das Piepen ist der Chopper zur Stromregelung (keine Ahnung, warum man das nur manchmal hört...).
    Ansonsten muss ich noch die Fallunterscheidung einbauen, falls der Beschleunigungsweg größer als der Gesamtweg ist, sollte jetzt aber nicht mehr das Problem darstellen.

    Hier der Code (ist reichlich kompakter geworden, hab sämtliche Floats rausgeschmissen)

    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 1000000
    $baud = 9600
    
    Config Portc.0 = Output
    Config Portc.1 = Output
    Config Timer1 = Timer , Prescale = 8
    Enable Timer1
    On Timer1 Isr
    Enable Interrupts
    
    Dim A As Word
    Dim V As Word
    Dim V0 As Word
    Dim S As Word
    Dim Sk As Word
    Dim Sa As Word
    Dim Temp As Long
    Dim Dt As Long
    Dim T As Long
    Dim B As Long
    
    S = 10000
    V = 2000
    A = 1500
    V0 = 2
    
    Temp = V - V0
    Temp = Temp * Temp
    Temp = Temp / A
    Sa = Temp / 2
    
    Sk = S - Sa
    Sk = Sk + 1
    Dt = 0
    T = 0
    B = 0
    V0 = 125 * V0
    
    Do
    
      If B = S Then
        B = 0
        Toggle Portc.0
      End If
    
      If B >= Sa And B <= Sk Then
        Dt = 125000 / V
      Else
        Temp = T / 1000
        Temp = A * Temp
        Temp = Temp + V0
        Dt  = 17000000 / Temp
      End If
    
    Loop
    End
    
    Isr:
    Load Timer1 , Dt 
    Toggle Portc.1
    If B < Sa Then
       T = T + Dt 
       Elseif B > Sk Then
       T= T - Dt 
       Else
       T=T
    End If
    Incr B
    Toggle Portc.1
    Return
    Geändert von Geistesblitz (12.07.2011 um 22:17 Uhr)

Ähnliche Themen

  1. schrittmotor steuern
    Von watermelon im Forum Software, Algorithmen und KI
    Antworten: 6
    Letzter Beitrag: 17.11.2010, 20:23
  2. Schrittmotor über Schrittmotor steuern?
    Von Tarribo im Forum Motoren
    Antworten: 1
    Letzter Beitrag: 06.06.2010, 22:40
  3. Schrittmotor mit LPT steuern
    Von timo1105 im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 11.11.2006, 11:40
  4. Schrittmotor von Hand steuern??
    Von heduobacht im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 31.08.2006, 17:07
  5. [ERLEDIGT] Schrittmotor mit PC steuern
    Von SK112 im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 08.01.2005, 08:23

Berechtigungen

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

Labornetzteil AliExpress