Hallo,
ich versuche über einen PIC32 und einen Schrittmotor-Controller
(RN-Stepp297) einen Schrittmotor-Antrieb zu steuern. Es handelt sich um
einen Roboter, der beim Anfahren mit linear ansteigender Geschwindigkeit
loslegen soll (Beschl. konstant).
Die Rampe will ich imAugenblick dadurch erreichen, dass die Delay-Zeit
zwischen den Schritten, die der Schrittmotor macht, von einem Startwert
bis zu einem Endwert immer um den selben Faktor verringert wird.
Ich habe folgenden Code um die "Rampenfunktion" zu realisieren:
1 | #define DELAY (4000) // Wert fuer pause; 0.1 msec bei Timer mit 40 MHz
|
2 | #define MAX_SPEED (10) // ist der kleinste Wert fuer pause(arg), mit der sich der SM noch gut verhaelt
|
3 | #define START_SPEED (100) // Wert fuer pause(arg) zum Anfahren, wird dekrementiert
|
4 |
|
5 | void pause(float uAnz)
|
6 | {
|
7 | unsigned int uDelay = (unsigned int)uAnz * DELAY;
|
8 | TMR23 = 0;
|
9 | while(TMR23 < uDelay)
|
10 | { /* do nothing */ }
|
11 | }
|
12 |
|
13 | void drive(int iAnzSteps)
|
14 | {
|
15 | unsigned short fPause = START_SPEED;
|
16 | // Drehrichtung festlegen
|
17 | [...]
|
18 | // Toggle zwischen GND und High-Level
|
19 | // Rampe indem fPause immer um den selben Faktor verringert wird
|
20 | while( (--iAnzSteps >= 0) && (fPause > MAX_SPEED) )
|
21 | {
|
22 | TRISG |= 0x0002; // Pin RG1 als Eingang -> high-Pegel +5V
|
23 | pause(fPause);
|
24 | TRISG &= 0xFFFD; // Pin RG1 als Ausgang -> low-Pegel GND
|
25 | pause(fPause);
|
26 |
|
27 | fPause = (fPause * 4) / 5; // Rampe
|
28 | }
|
29 | // Toggle zwischen GND und High-Level , max. Speed
|
30 | while(--iAnzSteps >= 0) // mit max Speed fahren
|
31 | {
|
32 | TRISG |= 0x0002;
|
33 | pause(MAX_SPEED);
|
34 | TRISG &= 0xFFFD;
|
35 | pause(MAX_SPEED);
|
36 | }
|
37 | } // drive()
|
38 |
|
39 | int main()
|
40 | {
|
41 | // Bsp: 400 Vollschritte = 2 Umdrehungen
|
42 | drive(400);
|
43 | }
|
Im Prinzip sollte
fPause = (fPause * 4) / 5; // Rampe
die Geschwindigkeit gleichmäßig ansteigen lassen. Die
Multiplikation/Division würde ich später durch ganzzahlige Werte in
einem Array ersetzen.
Aber wenn ich den Motor betrachten scheint er eher langsam anzufahren
und dann plötzlich sehr schnell zu beschleunigen.
Kann mir jemand einen Tipp geben was ich da falsch mache?
Stephan