PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie steuert ihr eure Schrittmotoren GENAU an?



timo1105
29.05.2007, 13:00
Hallo,

Ich habe jetzt schon ein wenig mit Schrittmotoren rumexperimentiert.
Nur irgendwie habe ich das Gefühl, dabei nicht sonderlich genau zu arbeiten.

Wie ich bemerkt habe, gibt es mehrere Möglichkeiten einen Puls für die Steuerung in Bascom zu erzeugen.

Beispiel 1:

Angefangen habe ich mit einer Timerfunktion mit dem 16bit Timer.Nur besteht dort noch ein kleines Verständnisproblem. Kann ich das Timerinterrupt auch nach einem Tastendruck erst auslösen?

Beispiel 2:

For/Next Schleife.

Diese kann auch als Subroutine geschrieben werden und bei einem Tastendruck ausgelöst werden. Nur finde ich diese Variante zu ungenau...
Um dort einen Takt zu erzeugen baut man zwischen Port-High und Port-Low immer ein "waitms x" ein. Ist das nicht ziemlich ungenau?


Mich würde jetzt interessieren, wie ihr das in Bascom so macht?
Also z.B bei gedrücktem Taster den Motor in irgendeiner Geschwindigkeit zu bewegen.


Timo

zumgwadrad
29.05.2007, 13:10
Hi,
was soll bei dir genau sein?
Die Postition oder die Geschwindigkeit!
Bei meinem Schrittmotor war die Position das wichtigste, deswegen gebe ich den Takt in einer for-Schleife mit wait-funktion vor.
Da jetzt die Geschwindigkeit über die wartefunktion gestellt wird ist die halt nichtmehr so genau, aber immer noch tolerierbar.

timo1105
29.05.2007, 13:30
Hallo,

Da das ganze später für eine teleskopsteuerung genutzt werden soll ist beides wichtig:-)

Im Hintergrund soll der SM immer in einer ganz genau best. Gewschw. fahren.

Wenn jetzt ein Taster gedrückt wird, soll sich die Geschw. erheblich erhöhen.Dabei sollte aber auch die Position stimmen!

Was muss jezt bei mir genau sein? Kann man es schaffen, dass beides genau ist?

Timo

zumgwadrad
29.05.2007, 13:37
HI,
naja, damit die Geschwindigkeit auch wirklich stimmt muss halt die Taktfrequenz von deinem Atmega stimmen. Da die interne Takterzeugung net so genau ist solltest du auf extern umbauen.
Wenn die dann stimmt und die wartezeiten richtig berechnet wurden dann lässt sich die Geschwindigkeit auch genau einstellen.
Die ungenauigkeiten bei meiner Geschwindigkeiten liegen zu einem großen Anteil an dem ungenauen Takt. Sind aber wie gesagt zu vernachlässigende Fehler.

timo1105
29.05.2007, 14:33
Hi,

Ich benutze als externe taktquelle einen 16MHZ Quarz. Darauf muss ich mich verlassen, dass der genau ist...

Ich habe mal meinen bisherigen Code reingestellt:


$regfile = "m8def.dat"
$crystal = 16000000



Declare Sub Fuenf()
Declare Function Tastenabfrage() As Byte




Dim A As Byte
Dim B As Byte
Dim Taste As Byte
Dim Ws As Word
Dim Adc_ohne_taste As Word


Motorport Alias Portd




Config Adc = Single , Prescaler = Auto , Reference = Off

Ddrd = &B10100110
Ddrc = &B00000000
Portc.0 = 1
Portd.1 = 0 'Enable
Portd.7 = 0 'CW
Portd.5 = 1 'Halbschritt

start adc


Adc_ohne_taste = Getadc(0) 'Messe Spannung wenn keine Taste gedrückt ist
Adc_ohne_taste = Adc_ohne_taste - 2

Do

Taste = Tastenabfrage()


If Taste <> 0 Then

Select Case Taste
Case 1
Call Fuenf
End Select
End If
Waitms 100

Loop

End

Function Tastenabfrage() As Byte
Tastenabfrage = 0
Ws = Getadc(0)

If Ws < Adc_ohne_taste Then
Select Case Ws
Case 330 To 370
Tastenabfrage = 1
End Select
End If
End Function




Sub Fuenf()

For B = 1 To 5
For A = 1 To 96
Portd.1 = 1
Portd.2 = 1
Waitms 10
Portd.2 = 0

Next A
Waitms 500
Next B



Motorport = 0
End Sub

Kann man das so durchgehen lassen?

Timo

sigo
29.05.2007, 15:22
Hi Timo,
für eine Teleskopanwendung würde ich evtl. mit Microschrittsteuerung arbeiten, da Schittmotore sonst ja eben Schritte machen und entsprechend hackeln, zumindest aber mit Halbschritten.

Für genaue Ergebnisse würde ich mit Timer und Interrupts arbeiten.

* ausrechnen, in welchen Abständen du einen Schritt brauchst. * Timer 1 initialisieren, dass er nach der Zeit einen Interrupt auslöst.
* Interrupt-Service Routine setzt als erstes den Timer zurück und führt dann den Schritt aus

Den Schnellgang kannst du dann mit einer FOR-Next-Schleife machen, da es da ja nicht auf die Genauigkeit ankommt. Oder eben auch mittels Interrupt.

Sigo

timo1105
29.05.2007, 20:38
hi!
thx für deine Antwort.
hättest du vielleicht ein kleines beispiel? Ich kann mir das noch nicht so richtig vorstellen.
Muss mich auf jeden fall nochmal mit dem Timer beschäftigen.


mfg
timo

timo1105
30.05.2007, 12:53
Hallo,

Das mit dem Timer bekomme ich hin.
Mein aktueller Code:


$regfile = "m8def.dat"
$crystal = 16000000



Ddrd = &B10100110


On Timer1 Ontimer1
Tccr1a = &B00000000
Tccr1b = &B00000001
Timsk.toie1 = 1
Sreg.7 = 1

Do
Portd.7 = 1
Portd.5 = 1
Portd.1 = 1


Loop


Ontimer1:
Timer1 = 60000
Portd.2 = Not Portd.2
Return

End

Nur gibt es von meiner Seitedazu noch ein paar Fragen:

Die Timer-Interrupt Routine läuft ja sozusagen im Hintergrund, steuert die genaue, dafür aber langsame Bewegung des Motors.

Jetzt möchte ich eine For-Next Schleife basteln, die den Motor schneller bewegt.

Meine Frage ist, ob die for/nextschleife zu der langsamen geschw. dazuadiert wird oder ob der Timer dann automatisch ausgeschaltet wird. (was er ja müsste).?!


Allgemein:

Kann eine Timer-Interrupt Routine auf Tastendruck ausgelöst und wieder abgeschaltet werden? Das würde alles lösen.


Mfg

Timo