Bascom: Schrittmotorsteuerung mit Drehencoder?
Hallo Leute ich hab mal wieder eine Frage, bin lausiger Programmier-Anfänger:
Ich will einen Schrittmotor steuern, der 48 S/U hat und per A3967 getrieben wird, also mit Enable, Dir und Step. Die Hardware steht und funktioniert, hab ein kl. Testprogramm damit laufen.
Code:
' Stepper_test1.bas - Testprogramm für A3967 Platine mit Dir Step und Enable
$regfile = "attiny2313.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000 'Quarzfrequenz
$baud = 9600
Declare Sub Key_pressed
Dim I As Long
Config Timer1 = Timer , Prescale = 1
Enable Timer1
Timsk.toie1 = 1
Dim Timer1_reload As Word
Portd.4 = 1 ' Pullup Widerstand ein für Enable - ****Enable =0 bedeutet Motor On!!!! ****
Enable Interrupts
Config Pind.2 = Output
Stepper_takt Alias Portd.2
Config Pind.4 = Output
Stepper_enable Alias Portd.4
Portd.4 = 0 'sprich Motor ON
On Timer1 Isr_timer1
' Step/Takt auf PD.2 / Taster auf PD.3 / Enable auf PD4 / Richtung auf PD5 /
'***********Hauptschleife:**********
Do
Loop
End
Isr_timer1:
Timer1_reload = 45536 ' Vorgabe für 400 / sec
Timer1 = Timer1_reload
Toggle Stepper_takt
Return
Der Schrittmotor soll nun aber mittels eines Drehencoders langsamer und schneller gemacht werden, die Routine hab ich aus dem Hoffmann-Buch.
Code:
'-----Deklarationen fuer Drehimpulsgeber:
Config Portd.0 = Input : Encoder_a Alias Pind.0 'Encoder Signal B an Pin 2
Config Portd.1 = Input : Encoder_b Alias Pind.1 'Encoder Signal A an Pin 3
Config Pind.3 = Input : Taster1 Alias Pind.3
Pind.0 = 1 'Pullups für den Drehencoder
Pind.1 = 1
Pind.3 = 1
'LED-Outputs:
Config Portd.2 = Output : Portd.2 = 0 'das ist Pin 6 alles mit Pulldown
Config Portd.5 = Output : Portd.5 = 0 ' Pin 9
Config Portb.4 = Output : Portb.4 = 0 ' Pin 16
Led_gelb Alias Portd.2
Led_gruen Alias Portd.5
Led_rot Alias Portb.4
' BASCOM-Programm
' Stefan Hoffmann 2009
' Drehimpulsgeber/Encoder mit ENCODER-Befehl
'
' In: Drehimpulsgeber an d.0 und d.1 sowie Taster
Dim Wert As Word
Wert = 100
Dim Zustand As Byte
Do
Zustand = Encoder(pind.0 , Pind.1 , Linksroutine , Rechtsroutine , 1)
If Wert > 100 Then Led_rot = 1
If Wert < 100 Then Led_gruen = 1
If Taster1 = 0 Then Led_gelb = 1
'Zu Testzwecken
Loop
End
Linksroutine:
Decr Wert
Return
Rechtsroutine:
Incr Wert
Return
Ich schnall einfach nicht, wie ich diese Routine mit einer Timer-Takterzeugung verheiraten kann. Der Takt ist doch konstant, und die Encoder-Routine braucht das doch als Variable, oder?
Habt ihr eine Idee, wie man so was lösen kann?
Vielen Dank für Anregungen!
MM08
(PS: - ich hatte schon einen anderen Code in Arbeit - s. Link und wieder verworfen, weil ich da schließlich vor dem gleichen Problem stand und kein Takt rauskam. Jetzt will ich das Ganze mal abspecken und klein und möglichst einfach wieder anfangen.)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo MrMiffy08 und auch alle anderen,
ich bin auch ein Neuling bei der AVR-Programmierung und
beschaeftige mich seit ca. einem Monat mit BASCOM. Hab mir das myAVR-MK2 und das LCD-Add_on
zugelegt und probiere und lerne damit die Programmierung.
Zusätzlich habe ich den DE von Pollin gekauft und mich in den verschiedenen Foren umgesehen.
Dort habe ich auch die DE-Routinen von Screwdriver gefunden und für sehr gut befunden.
Eine dieser DE-Routinen habe ich dann übernommen und verwende diese nun immer.
Habe deine Code-Schnipsel und deine Anforderungen zusammen gewuerfelt und mal ein Prog
dafuer erstellt. Auf meiner HW funzt es einwandfrei. Im Anhang mein Code.
Wichtiger Hinweis:
Kann so nicht fuer die Ansteuerung eines Schrittmotors uebernommen werden! Es sind diverse
Aenderungen/Anpassungen noetig, aber die geforderte Funktion eine LED schnell bzw. langsam
blicken zu lassen ist gegeben. Damit man den DE nicht ständig drehen muss um etwas zu sehen,
habe ich eine Schrittweitenanpassung benutzt. So ist es jetzt moeglich in 20 Schritten
die Blinkfrequenz zu veraendern. Solltest du den Bereich erweitern, so achte darauf,
dass der neu erstellte Timer1_start-wert nicht über die Grenze von 2hoch16 überschreitet,
denn dann funzt Timer1 nicht!
Nun noch ein Hinweis an Alle die dieses lesen: Es mag sein dass man das Ergebnis dieses
Prog einfacher und schneller und besser und kuerzer hinbekommt.
Doch bedenkt bitte, ich bin, wie oben schon angemerkt, noch ein Anfaenger.
Achja, die Aussage von Searcher kann ichnur bestätigen.
So, hier nun mein Bascom-Programm:
Anhang 23505
Hoffe es hilft dir weiter.
Gruss
EF_Arcturus (Wolfgang)