Hat wirklich keiner eine Antwort?
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/in...scom_und_Timer
Mfg Thomas
Um welchen Schrittmotor handelt sich eigentlich, dabei?
Ich habe bei meinem Schrittmotor (5 Anschlüsse) das ganze so gelöst:
GrüßeCode:$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
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 )
Code:$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
Lesezeichen