-         
+ Antworten
Ergebnis 1 bis 10 von 10

Thema: Schrittmotorsteuerung per Taster

  1. #1
    Gast

    Schrittmotorsteuerung per Taster

    Hallo Profis

    Ich habe mir das RNB-FRA 1.2 mit zwei Schrittmotoren zusammengebaut, funzt auch schon ganz gut. Das Board hat seine Testprogramme erfolgreich durchgeführ. Nun zu meinem Problem ich "Anfänger" möchte nun die beiden Schrittmotoren mit Tastern steuern. Gesteuert werden sollen Geschwindigkeit und Richtung je Motor mit möglich wenig Tastern.


    mfg
    Tomcat

  2. #2
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Könnte man so machen:

    1. Taster Richtung Links/Rechts umschalten
    2. Taster Geschwindigkeit erhöhen
    3. Taster Geschwindigkeit verringern
    4. Stop/Start umschalten

    Wenn man die Schritte in einer Timerroutine ausführt, muss man das Hauptprogramm so gestalten, das durch die Taster ein Zähler im Timer entsprechend gesetzt wird. Zum Beispiel nur noch jeden dritten Timerimpuls einen Schritt ausführen. Je höher de rZähler desto langsamer wird Motor.

    Vier Taster könntest du an den Eingangsport vom RNBFRA Board anschließen. Ansonsten bekommt man es mit einem Bascom Programm relativ einfach hin.

    Gruß Frank

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    13.05.2004
    Ort
    Saarland
    Beiträge
    30
    Das höhrt sich zwar gut an aber meine programmierfähikeiten sind da schon ziemlich begrenzt. "Timerroutine" ,Tastenabfrage , Taster gegen Masse oder wie ?


    mfg
    Tomcat

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.03.2004
    Beiträge
    178
    Hier mal ein paar Zeilen auf die schnelle, die vieleicht als Anregung dienen können:
    Code:
    Config Timer2 = Timer , Prescale = 256                      'Timer für Motorsteuerung
    Config Pind.6 = Output                                      'Schrittmotoren Ein/Aus
    Config Pinc.5 = Output                                      'Schrittmotor Links Richtung
    Config Pinc.3 = Output                                      'Schrittmotor Links Step
    Config Pinc.4 = Output                                      'Schrittmotor Rechts Richtung
    Config Pinc.2 = Output                                      'Schrittmotor Rechts Step
    On Timer2 Interrupthandler                                  'Alle Interrups werden in dieser Routine behandelt
    
    Enable Interrupts                                           'Interrupts aktivieren
    Enable Timer2
    Start Timer2                                                'Motortimer starten
    Timer2 = Geschwindigkeit                                    'Geschwindigkeit initialisieren
    
    Interrupthandler:                                           'Wenn Timer überlauf wird der Interrupt ausgelöst
    If Motoraktiv = 1 Then                                      'Nur wenn die Motoren aktiv sein sollen
       Toggle Portc.2                                           'Schrittmotor Rechts Step
       Toggle Portc.3                                           'Schrittmotor Links Step
       If Beschleunigen = 1 Then
          If Geschwindigkeit < Maxgeschwindigkeit Then
             Geschwindigkeit = Geschwindigkeit + 1
          Else
             Beschleunigen = 0
          End If
       End If
       If Bremsen = 1 Then
          If Geschwindigkeit > Mingeschwindigkeit Then
             Geschwindigkeit = Geschwindigkeit - 1
          Else
             Bremsen = 0
             Motoraktiv = 0
             Portd.6 = 0
          End If
       End If
    End If
    Timer2 = Geschwindigkeit                                    'Grundwert für nächsten Interrupt setzen
    Return
    
    Vor:
    Bremsen = 1
    Waitms 500
    Beschleunigen = 1
    Portd.6 = 1                                                 'Schrittmotoren aktiv
    Portc.5 = 0                                                 'Schrittmotor Links Richtung vor
    Portc.4 = 1                                                 'Schrittmotor Rechts Richtung vor
    Motoraktiv = 1
    Return
    
    Zurueck:
    Bremsen = 1
    Waitms 500
    Beschleunigen = 1
    Portd.6 = 1                                                 'Schrittmotoren aktiv
    Portc.5 = 1                                                 'Schrittmotor Links Richtung zurück
    Portc.4 = 0                                                 'Schrittmotor Rechts Richtung zurück
    Motoraktiv = 1
    Return
    
    Halt:
    Bremsen = 1
    Return
    
    Nothalt:
    Motoraktiv = 0                                              'Kein weiterer Step
    Geschwindigkeit = Mingeschwindigkeit
    Beschleunigen = 0
    Bremsen = 0
    Waitms 200                                                  'Wartezeit um Schrittmortor auf Punkt zu halten und erst dann
    Portd.6 = 0                                                 'Schrittmotoren ausschalten
    Return
    
    
    Rechts:
    Bremsen = 1
    Waitms 500
    Beschleunigen = 1
    Portd.6 = 1                                                 'Schrittmotoren aktiv
    Portc.5 = 0                                                 'Schrittmotor Links Richtung vor
    Portc.4 = 0                                                 'Schrittmotor Rechts Richtung zurück
    Motoraktiv = 1
    Return
    
    Links:
    Bremsen = 1
    Waitms 500
    Beschleunigen = 1
    Portd.6 = 1                                                 'Schrittmotoren aktiv
    Portc.5 = 1                                                 'Schrittmotor Links Richtung zurück
    Portc.4 = 1                                                 'Schrittmotor Rechts Richtung vor
    Motoraktiv = 1
    Return
    
    Schneller:
    If Geschwindigkeit < Maxgeschwindigkeit Then                'Maximale Umdrehungszahl
       Geschwindigkeit = Geschwindigkeit + 5
    End If
    Return
    
    Langsamer:
    Geschwindigkeit = Geschwindigkeit - 5
    Return
    [/quote]

  5. #5
    Gast
    Hallo Freiheitspirat,
    habe versucht dein Programm mit Bascom zu kompilieren und bekam gleich mal eine Ladung Fehlermeldungen. Was mache ich falsch.



    mfg
    Tomcat

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.03.2004
    Beiträge
    178
    Das war eigentlich nur als Anregung gedacht.
    Ist ja nur ein Ausschnitt eines meiner Programme, es fehlen ja noch die Tasterabfragen des IO-Ports und die ganzen Deklarationen der Variablen etc...

  7. #7
    Gast
    So habe ich das auch verstanden, doch kamen Fehlermeldungen die mir etwas merkwürdig erschienen. War aber mein Fehler Entschuldigung!

    Jetzt aber zu meiner Frage, ging es mir hauptsächlich um die Tasterabfrage usw. wegen der beschaltung gegen Masse oder gegen 5V mit Widerstand ca 10K.


    mfg
    Tomcat

  8. #8
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Du brauchst keinen Widerstand. Einfach Taster an Eingangsport und Masse!

    Mit dem Demo -Prog das die Werte am Eingangsport anzeigt kannst du das gut nachvollziehen.
    Danach würde ich erst mal mit einem ganz kleinen Programm anfangen das per Timer eine Interrupt Routine aufruft.
    In der Timer Routine zählst du dann eine beliebige Variabe immer um 1 hoch. Ist z.B. 100 erreicht, dann führst du einen Schritt am Schrittmotor aus (dazu ist die das Demo mit Schrittmotoransteuerung sicher hilfreich). Nach dem Schritt setzt du wieder die Variable auf 1.

    Damit hast du schon die halbe Miete. Leider fehlt mir derzeit die Zeit um die dafür ein Demo zu zimmern, aber es ist für dich auch sicher besser wenn du es schrittweise allein hin bekommst.
    Hats du oberes erst mal geschaft, dann musst du im Hauptteil in einer Schleife die Taster abfragen. Bei einem bestimmten Taster erhöhst du dann die 100 in der Timer IF-Abfrage um 1 (also Variable nehmen) Dadurch wird der Schrittmotor langsamer.
    Denke den Rest kannst du die langsam aber sicher zusammenreimen.

    Oberes Demo demonstriert das ja schon sehr schön. Nur erfahrungsgemäß ist es besser wenn du in kleineren Schritten an die Sache ran gehst.

    Gruß Frank

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    13.05.2004
    Ort
    Saarland
    Beiträge
    30
    Na dann erst einmal Dankeschön für eure Geduld mit mir.
    Für heute muß ich erst einmal beeden zwecks größerem Umtrunk "Dorffest".


    mfg
    Tomcat

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    13.05.2004
    Ort
    Saarland
    Beiträge
    30
    Hallo Leute,
    ein dankeschön für Eure Hilfe.
    Hier mal einen ersten Vorschlag

    Code:
    '###################################################
    'Schrittmotorsteuerung mit Taster
    'für 2 Schrittmotoren
    'RoboterNetz Standard-Roboter Board RBNFRA 1.2
    '
    'Autor: Tomcat
    '###################################################
    
    Declare Sub Nachfahren1
    Declare Sub Nachfahren2
    Declare Sub Nachfahren3
    Declare Sub Nachfahren4
    Declare Sub Motorrechtsl
    Declare Sub Motorrechtsr
    Declare Sub Motorlinksl
    Declare Sub Motorlinksr
    Declare Sub Aus
    Declare Sub Hochschneller
    Declare Sub Hochlangsam
    Declare Sub Linksschneller
    Declare Sub Linkslangsam
    Declare Sub Rechtsschneller
    Declare Sub Rechtslangsam
    Declare Sub Runterschneller
    Declare Sub Runterlangsam
    
       On Timer0 Ontimer0
       Config Timer0 = Timer , Prescale = 256
    
       On Timer2 Ontimer2
       Config Timer2 = Timer , Prescale = 256
    
    Const Writepowerport_adr = &H72                             'I2C Adr PCF 2
    Const Writeeingabeport_adr = &H7E                           'I2C Adr PCF 2
    Const Readeingabeport_adr = &H7F                            'I2C Adr PCF 2
    Const Energieport_adr = &H74
    
    Dim I2cdaten As Byte                                        'Datenbyte aus PCF8574
    
    
    Dim I As Byte
    Dim A As Word
    
    $baud = 9600
    $crystal = 8000000                                          'Quarzfrequenz
    Config Scl = Portc.0                                        'Ports fuer IIC-Bus
    Config Sda = Portc.1
    
    Portd.6 = 0                                                 'Schrittmotoren erst mal ausschalten
    I2cinit
    
    Gosub Energieein
    
    Config Pind.6 = Output                                      'Schrittmotoren Ein/Aus
    Config Pinc.5 = Output                                      'Schrittmotor Links Richtung
    Config Pinc.3 = Output                                      'Schrittmotor Links Step
    
    Config Pinc.4 = Output                                      'Schrittmotor Rechts Richtung
    Config Pinc.2 = Output                                      'Schrittmotor Rechts Step
    
    Dim X As Word
    X = 1
    Dim Y As Word
    Y = 1
    Dim Verteilung As Byte
    
    Verteilung = 100                                            'Anfangseinstellung beide Motoren mit 50%
    
    Portd.6 = 1                                                 'Beide Schrittmotoren einschalten
    
    
    I = 0
    I2cdaten = 1
    
    
    I2cstart
       I2cwbyte Writepowerport_adr                              'Schreibbefehl an PCF schicken
       I2cwbyte 0                                               'Datenbyte an PCF
       I2cstop
    
    Do
       I2cstart
       I2cwbyte Readeingabeport_adr                             'Lesebefehl an PCF schicken
       I2crbyte I2cdaten , Nack                                 'Datenbyte von PCF lesen
       I2cstop
       Waitms 50
       If I2cdaten = 127 Then Aus                               'rot
       If I2cdaten = 190 Then Nachfahren1                       'grün
       If I2cdaten = 187 Then Nachfahren2                       'grün
       If I2cdaten = 183 Then Nachfahren3                       'grün
       If I2cdaten = 189 Then Nachfahren4                       'grün
       If I2cdaten = 254 Then Motorrechtsl                      'blau
       If I2cdaten = 247 Then Motorrechtsr                      'grau
       If I2cdaten = 251 Then Motorlinksl                       'orange
       If I2cdaten = 253 Then Motorlinksr                       'braun
       If I2cdaten = 219 Then Hochschneller                     'grün-weis
       If I2cdaten = 235 Then Hochlangsam                       'weis
       If I2cdaten = 222 Then Linksschneller
       If I2cdaten = 238 Then Linkslangsam
       If I2cdaten = 215 Then Rechtsschneller
       If I2cdaten = 231 Then Rechtslangsam
       If I2cdaten = 221 Then Runterschneller
       If I2cdaten = 237 Then Runterlangsam
    
    
       Incr I
    Loop
    Sub Motorrechtsl                                            'rechter Motor
       Portd.6 = 0
       Waitms 300
       Portd.6 = 1
       Portc.4 = 1
       Gosub Energieein
       'Print "Motor rechts lauf links"
       Gosub Motortimer0
    End Sub
    
    Sub Motorrechtsr                                            'rechter Motor
       Portd.6 = 0
       Waitms 300
       Portd.6 = 1
       Portc.4 = 0
       Gosub Energieein
       'Print "Motor rechts lauf rechts"
       Gosub Motortimer0
    End Sub
    
    Sub Motorlinksl                                             'rechter Motor
       Portd.6 = 0
       Waitms 300
       Portd.6 = 1
       Portc.5 = 0
       Gosub Energieein
       'Print "Motor links lauf links"
       Gosub Motortimer2
    End Sub
    
    Sub Motorlinksr                                             'rechter Motor
       Portd.6 = 0
       Waitms 300
       Portd.6 = 1
       Portc.5 = 1
       Gosub Energieein
       'Print "Motor links lauf rechts"
       Gosub Motortimer2
    End Sub
    
    
    Sub Aus()
       'Print "aus"
       Portd.6 = 0
       I2cstart
       I2cwbyte Energieport_adr                                 'Schreibbefehl an PCF3 schicken
       I2cwbyte &B11100101                                      'Datenbyte an PCF3
       Disable Timer2
       Disable Timer0
       I2cstop
       X = 50
       Y = 50
    End Sub
    
    
    
    
    
    
    Sub Nachfahren1()
       X = 1000
       Y = 1000
       Gosub Motorgoto
    End Sub
    
    Sub Nachfahren2()
       X = 1500
       Y = 1500
       Gosub Motorgoto
    End Sub
    
    Sub Nachfahren3()
       X = 50
       Y = 50
       Gosub Motorgoto
    End Sub
    
    Sub Nachfahren4()
       X = 10
       Y = 10
       Gosub Motorgoto
    End Sub
    
    Sub Hochschneller
       Y = Y + 1
       'Print "schneller"
    End Sub
    
    Sub Hochlangsam
       Y = Y - 1
       'Print "langsam"
    End Sub
    
    Sub Linksschneller
       X = X + 1
       'Print "schneller"
    End Sub
    
    Sub Linkslangsam
       X = X - 1
       'Print "langsam"
    End Sub
    
    Sub Rechtsschneller
       X = X + 1
       'Print "schneller"
    End Sub
    
    Sub Rechtslangsam
       X = X - 1
       'Print "langsam"
    End Sub
    
    Sub Runterschneller
        Y = Y + 1
        'Print "schneller"
    End Sub
    
    
    Sub Runterlangsam
        Y = Y - 1
       'Print "langsam"
    End Sub
    
    
    
    End
    
    
    
    Ontimer0:
       Timer0 = X
       Toggle Portc.2
    Return
    
    Ontimer2:
       Timer2 = Y
       Toggle Portc.3
    Return
    
    
    Motorgoto:
    
       Print "goto"
       Portd.6 = 0
       Waitms 300
       Portd.6 = 1
       Portc.4 = 0
       Gosub Energieein
       Enable Timer0
       Enable Timer2
       Enable Interrupts
    
    Return
    
    Motortimer0:
       Enable Timer0
       Enable Interrupts
    
    Return
    
    Motortimer2:
       Enable Timer2
       Enable Interrupts
    
    Return
    
    
    Energieein:
       I2cstart
       I2cwbyte Energieport_adr                                 'Schreibbefehl an PCF3 schicken
       I2cwbyte &B00000010                                      'Datenbyte an PCF3
       I2cstop
    
    Return

    mfg
    Tomcat

+ Antworten

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

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