Archiv verlassen und diese Seite im Standarddesign anzeigen : Geschwindigkeit für Schrittmotoren ändern
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
Hat wirklich keiner eine Antwort?
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
Hi Thomas
sry ich versteh dein Beispiel nicht.
MFG tohrr
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
https://www.roboternetz.de/wissen/index.php/Bascom_und_Timer
Mfg Thomas
Um welchen Schrittmotor handelt sich eigentlich, dabei?
Ich habe bei meinem Schrittmotor (5 Anschlüsse) das ganze so gelöst:
$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
:)
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
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 )
$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
hi Thomas
Ich habe das ausprobiert aber mit "waitus" aber es sind nur sehr sehr kleine unterschiede in der Geschwindigkeit festzustellen.
Mfg tohrr
Hallo tohrr
Schau dir mal diese PDF an,da steht alles über Schrittmotoren
http://www.wolfgang-back.com/PDF/Schrittmotor.pdf
Gruß raggy
Ist zwar alles schön und gut aber nicht was ich brauche.
Aber trozdem danke für deine Mühe.
Mfg tohrr
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 :(.
So wie ich das verstanden habe, benötigst du einfach einen Takt mit veränderlichre Frequenz.
Config Timer0 = Timer , Prescale = 8
Start Timer0
Enable Timer0
On Timer0 Timer0_isr
Enable Interrupts
Dim laden as Byte
Do
If Taster1 = 0 then Decr laden
If Taster2 = 0 then Incr laden
Loop
Timer0_isr:
Timer0 = laden
Toggle Porta.0
Return
End
Grüße
Thomas
Hallo tohrr
wer lesen kann ist klar im Vorteil waitus habe ich nicht geschrieben
waitus wartet us = 1000 = 1 ms
waitms wartet ms = 1000 = 1 Sek
Ich weiß nicht was du da machst und was das werden soll, aber einen kleinen Tip, viel lesen hier und testen auch wenn's nur eine LED ist die an einem Portpin hängt.
Thomas
ich weiß auch was mikrosek. und millisek. sind aber ich muss mit us arbeiten weil die Frequenz sonst zu niedrig wäre wenn ich ms nehme.
Mfg tohrr
Ja dann waitus
for count = 1 to Lo
waitus 1 oder 10 oder 100 oder was weiß ich
next count
und so kannst das ausweiten -- 1us x 100 counts = 100 us oder 10us x 100 counts = 1000us
mfg
das versuch ich dann morgen. Ich hab heute die Schnauze voll von Bascom^^
Mfg tohrr
Danke Thomas hat wunderbar geklappt.
mfg tohr
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.