PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Geschwindigkeit für Schrittmotoren ändern



tohrr
21.02.2009, 10:27
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

tohrr
24.02.2009, 08:20
Hat wirklich keiner eine Antwort?

ThomasW
25.02.2009, 10:28
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

tohrr
25.02.2009, 17:09
Hi Thomas

sry ich versteh dein Beispiel nicht.

MFG tohrr

ThomasW
26.02.2009, 09:35
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

TomEdl
26.02.2009, 16:36
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
:)

tohrr
27.02.2009, 08:47
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

ThomasW
27.02.2009, 10:38
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

tohrr
27.02.2009, 13:44
hi Thomas

Ich habe das ausprobiert aber mit "waitus" aber es sind nur sehr sehr kleine unterschiede in der Geschwindigkeit festzustellen.

Mfg tohrr

raggy
27.02.2009, 20:28
Hallo tohrr
Schau dir mal diese PDF an,da steht alles über Schrittmotoren
http://www.wolfgang-back.com/PDF/Schrittmotor.pdf
Gruß raggy

tohrr
27.02.2009, 23:36
Ist zwar alles schön und gut aber nicht was ich brauche.
Aber trozdem danke für deine Mühe.

Mfg tohrr

TomEdl
28.02.2009, 11:05
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

ThomasW
28.02.2009, 13:04
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

tohrr
28.02.2009, 13:27
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

ThomasW
28.02.2009, 14:50
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

tohrr
28.02.2009, 21:00
das versuch ich dann morgen. Ich hab heute die Schnauze voll von Bascom^^

Mfg tohrr

tohrr
01.03.2009, 08:55
Danke Thomas hat wunderbar geklappt.

mfg tohr