-
So, ich hoffe der Timer0 ist jetzt in Ordnung;-)
Allerdings dreht sich der Schrittmotor immer noch nicht.
Wahrscheinlich ist die Frequenz zu hoch, sollte nach meinen Erkenntnissen z.Z. bei 62500 Hz liegen, oder? Laut einem Beitrag, ziemlich am Anfang meines Problems, sollte der Schrittmotor 200 Hz vertragen können, d.h. ich lasse den Timer0 von 62300 an zählen und habe somit eine Frequenz von 200 Hz. So meine Annahme, aber trotzdem dreht sich der Schrittmotor immer noch nichtL
Was läuft falsch?
Hier noch einmal das geänderte Programm:
Code:
' Stepper Testprogram
$prog , 255 , &B11011001,
$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44
$crystal = 16000000 'Quarzfrequenz
$baud = 19200
Config Pind.5 = Output
Led Alias Portd.5
Config Pinc.0 = Output ' Stiftleiste JP 2; Pin 3; PC0
Stepper1_reset Alias Portc.0
Config Pinc.1 = Output ' Stiftleiste JP 2; Pin 4; PC1
Stepper1_direction Alias Portc.1
Config Pinc.2 = Output ' Stiftleiste JP 2, Pin 5; PC2
Stepper1_enable Alias Pinc.2
Config Pinc.3 = Output ' Stiftleiste JP 2, Pin 6; PC3
Stepper1_step Alias Pinc.3
Dim I1 As Integer
Echo Off
Led = 0 ' LED einschalten
Stepper1_enable = 1 ' Stepper1 off
I1 = 0
Do
Toggle Led
Waitms 75
I1 = I1 + 1
Loop Until I1 = 20
Wait 5
Stepper1_direction = 1
Stepper1_enable = 0 ' Stepper1 on
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Config Timer0 = Timer , Prescale = 256 ' Stiftleiste JP 1; Pin 26
Enable Timer0
On Timer0 Timer_irq
Enable Interrupts
Timer0 = 62300
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Do
Toggle Led
Waitms 70
Loop
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End
'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
Timer0 = 62300.
Stepper1_step = 0 : Waitus 1 : Stepper1_step = 1
Return
Hat jemand einen Tipp?
Vielen Dank.
-
Ich glaub, da hast du was durcheinandergebracht.
Den Timer0 kannst du nur bis 255 einstellen, Timer1 geht bis 65535.
Wenn du dann den Timer auf 62300 stellst, zählt er von da an bis 65535 und läuft dann über. Macht 3236 Zeiteinheiten. Bei 16Mhz Taktfrequenz hast du eine Taktzeit von 0,0625µs, multipliziert mit dem Prescaler ist eine Zeiteinheit des Timers 16µs. 3236*16µs ergibt einen Takt von 51,776ms, ergo eine Frequenz von eta 19,3 Hz. Eigentlich müsste der Schrittmotor damit schon langsam laufen. Ich schätze mal, wenn du Timer1 verwendest, sollte das laufen, vorrausgesetzt natürlich, du hast den Treiber richtig angeschlossen ;)
-
Aha, gut. Dann stell ich morgen früh mal auf Timer1 um. Kannst du mir noch einmal erklären wie du auf folgende Werte kommst:
Taktzeit 0,0625µs
Zeiteinheit des Timers 16µs
von 51,776 ms auf 19,3 Hz
Vielen Dank für deine Mühe ;-)
-
Controllertakt: 16000000 Hz -> 1/Takt=0,0625 µs
0,0625 µs * 265 (Prescaler) = 16 µs
Alternativ kannst du auch den Controllertakt durch den Prescaler Teilen und dann das Reziproke daraus bilden, kommt aufs selbe hinaus.
1/51,776ms = 19,3 Hz
-
Vielen Dank!
Ich habe den Timer1 eingebaut und jeweils ein 20 Hz und 200 Hz starkes Signal erzeugt.
Leider dreht sich der Schrittmotor immer noch nicht :(
Hier noch einmal das Programm mit 200 Hz, ein Fehler erkenn ich nicht. Wenn ich an dem Ausgangspin Pin 6 eine LED anschließe blinkt sie wunderbar.
Code:
' Stepper Testprogram
$prog , 255 , &B11011001,
$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44
$crystal = 16000000 'Quarzfrequenz
$baud = 19200
Config Pind.5 = Output
Led Alias Portd.5
Config Pinc.0 = Output ' Stiftleiste JP 2; Pin 3; PC0
Stepper1_reset Alias Portc.0
Config Pinc.1 = Output ' Stiftleiste JP 2; Pin 4; PC1
Stepper1_direction Alias Portc.1
Config Pinc.2 = Output ' Stiftleiste JP 2, Pin 5; PC2
Stepper1_enable Alias Pinc.2
Config Pinc.3 = Output ' Stiftleiste JP 2, Pin 6; PC3
Stepper1_step Alias Pinc.3
Dim I1 As Integer
Echo Off
Led = 0 ' LED einschalten
Stepper1_enable = 1 ' Stepper1 off
I1 = 0
Do
Toggle Led
Waitms 75
I1 = I1 + 1
Loop Until I1 = 20
Wait 5
Stepper1_direction = 1
Stepper1_enable = 0 ' Stepper1 on
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Config Timer1 = Timer , Prescale = 64 ' Stiftleiste JP 1; Pin 26
Enable Timer1
On Timer1 Timer_irq
Enable Interrupts
Timer1 = 64286
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Do
Toggle Led
Waitms 200
Loop
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End
'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
Timer1 = 64286.
Stepper1_step = 0 : Waitus 1 : Stepper1_step = 1
Return
Sollte das Programm in Ordnung sein, kann der Fehler an folgender Stelle liegen:
Falsche Frequenz bei der Schrittmotoransteuerung
Falscher Kabelanschluss
Defekt beim Schrittmotor
Defekt beim Treiber
Hat jemand noch einmal eine Idee, vielleicht hat jemand den gleichen Schrittmotor?
Mercury Motor
SM-42BYG011-25
48/2011
http://www.sparkfun.com/products/9238
-
Hast du den Treiber schonmal getestet? Reicht ja ein einfacher Taktgeber für Step und ein Schalter für Direction. Dann kann man da schonmal die Fehler ausschließen.
Outputs werden übrigens so konfiguriert:
Config Portc.0 = Output
aber
Config Pinc.0 = Input
So kann man da zumindest nichts falsch machen.
Solche Sachen wie Stepper1_enable und Stepper1_reset würde ich erstmal auch aus dem Code nehmen, um es übersichtlicher zu halten. Zum Testen ist es dann meist einfacher, diese Anschlüsse mit Kabel auf High oder Low zu legen. Weißt du denn schon, welche Pegel an diesen Anschlüssen die Richtigen sind?
An der Frequenz kann es jedenfalls nicht liegen. Wäre die zu hoch, würde er zumindest Geräusche machen.
Ich kann wirklich nur raten, sich erstmal mit dem Treiber vertraut zu machen, bevor man mit dem µC da ran geht. Wenn man zu viel auf einmal macht, findet man die Stelle mit dem Problem nicht mehr so leicht. Musst versuchen, den Fehler systematisch einzukreisen.
Jetzt, wo ich es sehe: Pin 6 ist das Äquivalent zu Stepper1_step, richtig? Wenn der richtig umgeschaltet wird, kann das Problem schonmal nicht da liegen. Ich tippe mal auf Reset (kommt das im Code überhaupt irgendwo vor, außer in der Definition?) oder Enable. Oder mal ne ganz banale Frage: Am Treiber ist auch die Leistugsversorgung angeschlossen?
-
Übrigens, für wenig Geld gibt es die Platine StepRocker von Trinamic. Ich habe mich für Ics dieses deutschen fabless Herstellers entschieden. Mit der kostenlosen IDE kann man man sehr einfach testen, durch Eingabe der Schrittezahl. Lässt man also nur einen Schritt jeweils machen, so kann man die Pegel an den Leitungen zum Motor messen und so sehen ob man den Motor richtig versorgt. Die Platine ist so klein, dass ihr Einsatz auch als Alternative zu den Produkten von Robotikhardware.de gesehen werden kann, bzw. sollten die es ins Programm aufnehmen. Das Bauteil besitzt neben der Unterstützung von Mikroschritten auch Logik zur Erkennung von Schrittfehlern. Hier der Link bei Conrad.