Hallo :)
Für ein kleines Projekt möchte ich eine Rampe für einen Schrittmotor
programmieren. Da dies mein erster Ausflug in die Mikrocontrollerwelt
(Arduinoboard mit AtMega2560) ist und ich auch vorher noch nicht mit
Schrittmotoren gearbeitet habe, möchte ich gerne von euch wissen, ob
meine Idee für eine Rampe so realisierbar ist.
Da ich eine SMC-11 von Nanotec verwende, brauche ich nur ein Taktsignal
am Ausgang. Dieses liegt am PinL3, welcher direkt vom Timer gesteuert
werden kann.
1 | void initTimerMotor (void){
|
2 | TCCR5A = 64; // Port OC5A entspricht Pin Motor_clk wird bei Compare Match auf 0 gesetzt -> negative Flanke
|
3 | TCCR5B = 0xD; // CTC-Mode: WGM52 = 1; Prescaler 1024:
|
4 | OCR5A = 15621; //15621 entspricht 1Hz // OCR5A-Wert = (16000000 / (1024* gewünschte Frequenz)) - 1
|
5 | TIMSK5 |= (1 << OCIE5A); // Timerinterrupt erlauben
|
6 | }
|
In der ISR würde ich dann die Idee meiner Rampe realisieren. Wobei mir
klar ist, dass dies nicht die optimalste Form ist, aber es soll erst
einmal nur funktionieren ;)
1 | ISR (TIMER5_COMPA_vect){
|
2 | if (PINL3 == LOW)
|
3 | stepCount--; // aktuelle Schrittzahl
|
4 | OCR5A = OCR5A - WERT; // Beschleunigen
|
5 | if (OCR5A < maxWERT) // Falls maximale Geschwindigkeit erreicht, nicht mehr Beschleunigen
|
6 | OCR5A = maxWERT;
|
7 | if (stepCount < 800) // Abbremsen
|
8 | OCR5A = OCR5A + 2*WERT;
|
9 |
|
10 | }
|
Die Zahlenwerte müssten natürlich an den Schrittmotor angepasst werden,
aber hier soll es nur darum gehen, ob es überhaupt möglich wäre.
Und zwar soll der OCR5A Wert bei jedem Aufruf kleiner werden, damit der
der Takt schneller wird. Außer es ist der maximale Takt erreicht bzw.
der Motor soll abgebremst werden, dann wird OCR5A um den zweifachen
"Wert" erhöht, da zuvor bei OCR5A ohne Bedingung immer erhöht wird.
Das ganze wird dann über folgende Funktion aufgerufen, der der Motor
über (Motor_en, LOW) eingeschalten wird. Der Timer sowie die ISR laufen
auch bei ausgeschaltenem Motor.
1 | void driveStep (uint16_t min, uint16_t max){ //nach rechts in Zufallsschritten fahren
|
2 | digitalWrite(Motor_dir, Rechtslauf);
|
3 | stepCount = random(min, max);
|
4 | while (stepCount > 0){
|
5 | digitalWrite(Motor_en, LOW);
|
6 | }
|
7 | digitalWrite(Motor_en, HIGH);
|
8 | }
|
Ich hoffe ihr könnt meine Idee nachvollziehen. Dafür und für eure
Antworten schon mal ein Dankeschön im Voraus.
Gruß
Johann