PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Schrittmotorsteuerung per Taster



28.07.2004, 12:22
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

Frank
28.07.2004, 12:43
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

tomcat
28.07.2004, 12:56
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]

30.07.2004, 07:32
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...

30.07.2004, 18:04
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

Frank
30.07.2004, 18:37
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

tomcat
30.07.2004, 18:59
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

tomcat
04.08.2004, 20:56
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