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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.