Archiv verlassen und diese Seite im Standarddesign anzeigen : 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
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
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
Freiheitspirat
28.07.2004, 14:28
Hier mal ein paar Zeilen auf die schnelle, die vieleicht als Anregung dienen können:
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]
Hallo Freiheitspirat,
habe versucht dein Programm mit Bascom zu kompilieren und bekam gleich mal eine Ladung Fehlermeldungen. Was mache ich falsch.
mfg
Tomcat
Freiheitspirat
30.07.2004, 14:54
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...
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
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
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
Hallo Leute,
ein dankeschön für Eure Hilfe.
Hier mal einen ersten Vorschlag
'################################################# ##
'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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.