-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Geschwindigkeit für Schrittmotoren ändern

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.10.2008
    Beiträge
    16

    Geschwindigkeit für Schrittmotoren ändern

    Anzeige

    Hi Leute,

    Ich habe ein kleines Problem. Ich möchte gerne zwei Schrittmotoren mit zwei Atmega 16 ansteuern. Befehle über Docklight nimmt er an (z.B. Motoridentifikationsnummer, Schrittzahl und Drehrichtung) doch mit der Geschwindigkeit habe ich noch Probleme.
    Hier ist mein Programm für einen Motor:

    $regfile = "m16def.dat"
    $crystal = 7372800
    $baud = 19200


    Config Portb = Output

    Const True = 1
    Const False = 0

    Dim M As Byte , M1 As Byte , D As Byte , S As Byte , S1 As Long , S2 As Long
    Dim Hi As Byte , Lo As Byte , Phase As Bit

    Config Timer0 = Timer , Prescale = 8

    Step1 Alias Portb.1
    D1 Alias Portb.0


    Enable Timer0
    Enable Interrupts

    Phase = True

    Motornummer:

    S2 = 0

    Inputbin M

    If M = 001 Then Goto Befehl

    Goto Motornummer

    Befehl:

    Print "Motor 1: Warte auf Befehl"
    Inputbin D , S , Lo

    If D = 000 Then D1 = 0
    If D = 001 Then D1 = 1

    Gobefehl:

    Inputbin M1

    If M1 = 001 Then Goto Ausfuehrung

    Goto Gobefehl


    Ausfuehrung:

    S1 = S * 628

    Hi = 255 - Lo

    If Phase = True Then
    Step1 = 1
    Timer0 = Lo
    Phase = False
    Else
    Step1 = 0
    Timer0 = Hi
    Phase = True
    End If

    S2 = S2 + 1

    If S2 = S1 Then Goto Motornummer

    Goto Ausfuehrung

    Mir wurde geraten einen Timer zu benutzen, doch ich weiß nicht wie ich nun die Geschwindigkeit ändern kann. Ich hoffe dass ich eine schnelle Antwort bekomme.

    Danke im voraus

    MFG tohrr

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    10.10.2008
    Beiträge
    16
    Hat wirklich keiner eine Antwort?

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    08.03.2005
    Ort
    Bayern
    Alter
    48
    Beiträge
    14
    Hallo tohrr

    Dein Programm verwirrt mich ein wenig, ich würde das auch über einen Timer machen.

    Du benutzt ja den Timer0 aber der läuft immer von 0 bis 255 und dann fängt er wieder von vorne an, wenn du jetzt den Timer0 interrupt nimmst dann wird dieser immer beim Überlauf ausgelöst also bei 255 zu 0.

    Schreib deine Motor move Befehle in den Timer Interrupt und wenn man dann den Timer nicht von 0 - 255 laufen lässt sondern von 150 - 255 dann springt er schneller in den Timer da der Überlauf ja schneller erreicht wird.

    Beispiel

    On Timer0 Timer0_isr
    Enable Timer0
    Timer0 = 150
    '##################

    Timer0_isr:
    Timer0 = 150 ' kleiner Wert = Langsamer
    If ...... Motor move...
    Return

    Nimm mal zum Testen den Timer1 der läuft bis 65535 oder Prescaler von Timer0 raufsetzen und eine Led die dann im Interrupt blinken soll, damit kannst du das sehr gut testen.

    Mfg Thomas

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    10.10.2008
    Beiträge
    16
    Hi Thomas

    sry ich versteh dein Beispiel nicht.

    MFG tohrr

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    08.03.2005
    Ort
    Bayern
    Alter
    48
    Beiträge
    14
    Hallo tohrr

    Was verstehst du nicht ?

    In deinem Programm benutzt du den Timer0 aber ohne richtige Funktion

    Timer0 = Hi ------> du setzt den Zähler vom Timer auf den Hi wert und von da läuft er wieder bis 255 und fängt dann wieder bei 0 an, der Timer läuft in deinem fall immer im Kreis und du setzt den Zähler nur immer wo anderes hin, auch bei Timer0 = LO bringt nix

    also nochmal :
    '##############################################
    Config Timer0 = Timer, Prescale= 8 ---> Konfiguriere Timer0
    Enanable Timer 0 -----> schalte den Timer0 ein
    On Timer0 Timer0_isr ---> verzweige bei Timer0 überlauf zu Timer0_isr
    Enable Interrupts ---> generell Interrupts zulassen

    Do
    ....Hauptprogramm
    Loop
    End

    Timer0_isr: ------> Unterprogramm von Timer0
    Toggle Portb.1 ---- > Portb.1 wird z.b auf 1 geschalten und beim nächst mal auf 0
    Return ----> springt mit Return wieder zurück, zum Hauptprogramm
    '###############################################

    Hier gibts doch tolle Beschreibungen z.B

    http://www.roboternetz.de/wissen/ind...scom_und_Timer

    Mfg Thomas

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.11.2008
    Ort
    Kapfenberg
    Beiträge
    628
    Um welchen Schrittmotor handelt sich eigentlich, dabei?

    Ich habe bei meinem Schrittmotor (5 Anschlüsse) das ganze so gelöst:
    Code:
    $regfile = "m32def.dat"
    $crystal = 1000000
    
    
    'KONFIGURATION AUSGÄNGE
    Config Portd.0 = Output
    Config Portd.1 = Output
    Config Portd.2 = Output
    Config Portd.3 = Output
    Config Portd.4 = Output
    Config Portb.0 = Output
    
    'KONFIGURATION EINGÄNGE
    Config Pinb.1 = Input
    
    'PULLUPS EINSCHALTEN
    Portb.1 = 1
    
    'VERGABE ALIAS-ADRESSEN
    Led Alias Portd.0
    S1 Alias Portd.1
    S2 Alias Portd.2
    S3 Alias Portd.3
    S4 Alias Portd.4
    T1 Alias Pinb.1
    
    'KONFIGURATION ENTPRELL-ROUTINE
    Config Debounce = 20
    
    'KONFIGURATION TIMER0
    Config Timer0 = Timer , Prescale = 8
    On Timer0 Timer0_isr
    Enable Timer0
    Start Timer0
    
    'VARIABLEN
    Dim A_schritte As Byte
    Dim B_ausgabe As Byte
    Dim C_led As Bit
    Dim D_timer0 As Byte
    Dim E_modus As Byte
    Dim F_speicher As Byte
    
    'INTERRUPTS GLOBAL ZULASSEN
    Enable Interrupts
    
    'EEPROM AUSLESEN
    Readeeprom F_speicher , 5
    E_modus = F_speicher
    
    
    '### HAUPTSCHLEIFE ###
    
    Do
    
       'Taster abfragen
       Debounce T1 , 1 , T1_isr , Sub
    
       'Erzeugung Schritte
       If E_modus = 0 Then
          Select Case A_schritte
             Case 1 : B_ausgabe = Lookup(0 , Schritte1)
             Case 2 : B_ausgabe = Lookup(1 , Schritte1)
             Case 3 : B_ausgabe = Lookup(2 , Schritte1)
             Case 4 : B_ausgabe = Lookup(3 , Schritte1)
          End Select
       Else
          E_modus = 1
          Select Case A_schritte
             Case 1 : B_ausgabe = Lookup(0 , Schritte2)
             Case 2 : B_ausgabe = Lookup(1 , Schritte2)
             Case 3 : B_ausgabe = Lookup(2 , Schritte2)
             Case 4 : B_ausgabe = Lookup(3 , Schritte2)
          End Select
       End If
    
       'Differenzieren LED
       B_ausgabe = B_ausgabe Or C_led
    
       'Ausgabe Schrittfolge & LED
       Portd = B_ausgabe
    
       'Abfragen & zurücksetzen A_schritte
       If A_schritte = 5 Then A_schritte = 1
    
       'LED bei Modus 1 setzen
       If E_modus = 1 Then C_led = 1 Else C_led = 0
    
    
    Loop
    
    
    '### SUBS, ISR, TABELLEN ###
    
    Timer0_isr:
       Incr A_schritte
       Timer0 = D_timer0
    Return
    
    T1_isr:
       If E_modus = 0 Then E_modus = 1 Else E_modus = 0
       F_speicher = E_modus
       Writeeeprom F_speicher , 5
    Return
    
    
    End
    
    
    'Tabellen
    Schritte1:
       Data &B00000010
       Data &B00000100
       Data &B00001000
       Data &B00010000
    
    Schritte2:
       Data &B00000110
       Data &B00001100
       Data &B00011000
       Data &B00010010
    Grüße
    Thomas

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    10.10.2008
    Beiträge
    16
    Ich habe zwei Schrittmotoren (4 Anschlüsse) und einen Easydriver der mir die Sache ein bisschen vereinfacht. Ich gebe also einen Takt auf den Easydriver und dann dreht sich der Motor. Ich habe nur das Problem dass ich die Frequenz dieses Taktes nicht geändert bekommen .

    Mfg tohrr

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    08.03.2005
    Ort
    Bayern
    Alter
    48
    Beiträge
    14
    Hallo tohrr

    in deinem Fall ändere mal Timer0 = Lo/Hi auf Waitms Lo

    If Phase = True Then
    Step1 = 1
    Waitms Lo
    Phase = False
    Else
    Step1 = 0
    Waitms Lo
    Phase = True
    End If

    '###########################################

    und das kleine Programm lässt deinen Motor 100 Step's rechts laufen macht dann 2 Sek Pause und dann wieder 100 Step's links, mit Timer1 = 55000 kannst du die Geschwindigkeit ändern z.B Timer1 = 40000 ( Langsamer )


    Code:
    $regfile = "m16def.dat"
    $crystal = 7372800
    $baud = 19200
    
    Config Portb = Output
    
    Const True = 1
    Const False = 0
    
    Dim M As Byte , M1 As Byte , D As Byte , S As Byte , S1 As Long , S2 As Long
    Dim Hi As Byte , Lo As Byte , Phase As Bit
    
    Config Timer1 = Timer , Prescale = 64
    
    Step1 Alias Portb.1
    D1 Alias Portb.0
    
    Enable Timer1
    Enable Interrupts
    On Timer1 Timer1_isr
    
    S = 100
    M1 = 1
    D = 0
    
    '##################################################################################### ' Hauptschleife
    Do
    
    If S = 0 Then
       Wait 2
       Toggle Portb.0
       S = 100
    End If
    
    Loop
    '###################################################################################### 'timer1 interrupt
    
    Timer1_isr:
    
    Timer1 = 55000
    
        If S > 0 Then
             Toggle Portb.1
             S = S - 1
        End If
    
    Return

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    10.10.2008
    Beiträge
    16
    hi Thomas

    Ich habe das ausprobiert aber mit "waitus" aber es sind nur sehr sehr kleine unterschiede in der Geschwindigkeit festzustellen.

    Mfg tohrr

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    10.06.2006
    Ort
    Duisburg-Rheinhausen
    Alter
    71
    Beiträge
    80
    Hallo tohrr
    Schau dir mal diese PDF an,da steht alles über Schrittmotoren
    http://www.wolfgang-back.com/PDF/Schrittmotor.pdf
    Gruß raggy

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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