Rampe für Schrittmotor - Idee

Gast #3189723
Lesenswert?

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
Gast #3189747
Lesenswert?

Hallo spess,

ich hab mir die Anleitung und den Code angeschaut. Hab auch versucht 
alles überflüssige rauszuschmeißen, aber irgendwie hab ich mich da 
verzettelt. Bin hald doch noch Anfänger ;)

Meinst du, dass meine Idee gar nicht funktionieren würde?
Der Motor muss nur anlaufen, ob er das jetzt schön an einer geraden 
Linie macht, ist nicht von Bedeutung.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren