-         

Ergebnis 1 bis 8 von 8

Thema: Wie steuert ihr eure Schrittmotoren GENAU an?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.11.2006
    Ort
    Wendeburg
    Alter
    29
    Beiträge
    96

    Wie steuert ihr eure Schrittmotoren GENAU an?

    Anzeige

    Hallo,

    Ich habe jetzt schon ein wenig mit Schrittmotoren rumexperimentiert.
    Nur irgendwie habe ich das Gefühl, dabei nicht sonderlich genau zu arbeiten.

    Wie ich bemerkt habe, gibt es mehrere Möglichkeiten einen Puls für die Steuerung in Bascom zu erzeugen.

    Beispiel 1:

    Angefangen habe ich mit einer Timerfunktion mit dem 16bit Timer.Nur besteht dort noch ein kleines Verständnisproblem. Kann ich das Timerinterrupt auch nach einem Tastendruck erst auslösen?

    Beispiel 2:

    For/Next Schleife.

    Diese kann auch als Subroutine geschrieben werden und bei einem Tastendruck ausgelöst werden. Nur finde ich diese Variante zu ungenau...
    Um dort einen Takt zu erzeugen baut man zwischen Port-High und Port-Low immer ein "waitms x" ein. Ist das nicht ziemlich ungenau?


    Mich würde jetzt interessieren, wie ihr das in Bascom so macht?
    Also z.B bei gedrücktem Taster den Motor in irgendeiner Geschwindigkeit zu bewegen.


    Timo

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    10.07.2004
    Ort
    Nürnberg
    Alter
    36
    Beiträge
    186
    Hi,
    was soll bei dir genau sein?
    Die Postition oder die Geschwindigkeit!
    Bei meinem Schrittmotor war die Position das wichtigste, deswegen gebe ich den Takt in einer for-Schleife mit wait-funktion vor.
    Da jetzt die Geschwindigkeit über die wartefunktion gestellt wird ist die halt nichtmehr so genau, aber immer noch tolerierbar.
    Ich bin keine Signatur ich mach hier nur sauber

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    08.11.2006
    Ort
    Wendeburg
    Alter
    29
    Beiträge
    96
    Hallo,

    Da das ganze später für eine teleskopsteuerung genutzt werden soll ist beides wichtig

    Im Hintergrund soll der SM immer in einer ganz genau best. Gewschw. fahren.

    Wenn jetzt ein Taster gedrückt wird, soll sich die Geschw. erheblich erhöhen.Dabei sollte aber auch die Position stimmen!

    Was muss jezt bei mir genau sein? Kann man es schaffen, dass beides genau ist?

    Timo

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    10.07.2004
    Ort
    Nürnberg
    Alter
    36
    Beiträge
    186
    HI,
    naja, damit die Geschwindigkeit auch wirklich stimmt muss halt die Taktfrequenz von deinem Atmega stimmen. Da die interne Takterzeugung net so genau ist solltest du auf extern umbauen.
    Wenn die dann stimmt und die wartezeiten richtig berechnet wurden dann lässt sich die Geschwindigkeit auch genau einstellen.
    Die ungenauigkeiten bei meiner Geschwindigkeiten liegen zu einem großen Anteil an dem ungenauen Takt. Sind aber wie gesagt zu vernachlässigende Fehler.
    Ich bin keine Signatur ich mach hier nur sauber

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    08.11.2006
    Ort
    Wendeburg
    Alter
    29
    Beiträge
    96
    Hi,

    Ich benutze als externe taktquelle einen 16MHZ Quarz. Darauf muss ich mich verlassen, dass der genau ist...

    Ich habe mal meinen bisherigen Code reingestellt:

    Code:
    $regfile = "m8def.dat"
    $crystal = 16000000
    
    
    
    Declare Sub Fuenf()
    Declare Function Tastenabfrage() As Byte
    
    
    
    
    Dim A As Byte
    Dim B As Byte
    Dim Taste As Byte
    Dim Ws As Word
    Dim Adc_ohne_taste As Word
    
    
    Motorport Alias Portd
    
    
    
    
    Config Adc = Single , Prescaler = Auto , Reference = Off
    
    Ddrd = &B10100110
    Ddrc = &B00000000
    Portc.0 = 1
    Portd.1 = 0                                                 'Enable
    Portd.7 = 0                                                 'CW
    Portd.5 = 1                                                 'Halbschritt
    
    start adc
    
    
    Adc_ohne_taste = Getadc(0)                      'Messe Spannung wenn keine Taste gedrückt ist
    Adc_ohne_taste = Adc_ohne_taste - 2
    
     Do
    
       Taste = Tastenabfrage()
    
    
       If Taste <> 0 Then
    
          Select Case Taste
             Case 1
                 Call Fuenf
                 End Select
                 End If
                 Waitms 100
    
                 Loop
    
                 End
    
     Function Tastenabfrage() As Byte
     Tastenabfrage = 0
     Ws = Getadc(0)
    
     If Ws < Adc_ohne_taste Then
          Select Case Ws
             Case 330 To 370
                Tastenabfrage = 1
                End Select
                End If
                End Function
    
    
    
    
    Sub Fuenf()
    
     For B = 1 To 5
    For A = 1 To 96
    Portd.1 = 1
    Portd.2 = 1
    Waitms 10
    Portd.2 = 0
    
    Next A
    Waitms 500
    Next B
    
    
    
    Motorport = 0
    End Sub
    Kann man das so durchgehen lassen?

    Timo

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    14.01.2006
    Ort
    Hattingen
    Alter
    52
    Beiträge
    984
    Hi Timo,
    für eine Teleskopanwendung würde ich evtl. mit Microschrittsteuerung arbeiten, da Schittmotore sonst ja eben Schritte machen und entsprechend hackeln, zumindest aber mit Halbschritten.

    Für genaue Ergebnisse würde ich mit Timer und Interrupts arbeiten.

    * ausrechnen, in welchen Abständen du einen Schritt brauchst. * Timer 1 initialisieren, dass er nach der Zeit einen Interrupt auslöst.
    * Interrupt-Service Routine setzt als erstes den Timer zurück und führt dann den Schritt aus

    Den Schnellgang kannst du dann mit einer FOR-Next-Schleife machen, da es da ja nicht auf die Genauigkeit ankommt. Oder eben auch mittels Interrupt.

    Sigo

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    08.11.2006
    Ort
    Wendeburg
    Alter
    29
    Beiträge
    96
    hi!
    thx für deine Antwort.
    hättest du vielleicht ein kleines beispiel? Ich kann mir das noch nicht so richtig vorstellen.
    Muss mich auf jeden fall nochmal mit dem Timer beschäftigen.


    mfg
    timo

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    08.11.2006
    Ort
    Wendeburg
    Alter
    29
    Beiträge
    96
    Hallo,

    Das mit dem Timer bekomme ich hin.
    Mein aktueller Code:

    Code:
    $regfile = "m8def.dat"
    $crystal = 16000000
    
    
    
    Ddrd = &B10100110
    
    
    On Timer1 Ontimer1
    Tccr1a = &B00000000
    Tccr1b = &B00000001
    Timsk.toie1 = 1
    Sreg.7 = 1
    
    Do
    Portd.7 = 1
    Portd.5 = 1
    Portd.1 = 1
    
    
    Loop
    
    
    Ontimer1:
    Timer1 = 60000
    Portd.2 = Not Portd.2
    Return
    
    End
    Nur gibt es von meiner Seitedazu noch ein paar Fragen:

    Die Timer-Interrupt Routine läuft ja sozusagen im Hintergrund, steuert die genaue, dafür aber langsame Bewegung des Motors.

    Jetzt möchte ich eine For-Next Schleife basteln, die den Motor schneller bewegt.

    Meine Frage ist, ob die for/nextschleife zu der langsamen geschw. dazuadiert wird oder ob der Timer dann automatisch ausgeschaltet wird. (was er ja müsste).?!


    Allgemein:

    Kann eine Timer-Interrupt Routine auf Tastendruck ausgelöst und wieder abgeschaltet werden? Das würde alles lösen.


    Mfg

    Timo

Berechtigungen

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