Forum: Mikrocontroller und Digitale Elektronik Rampe für Schrittmotor - Idee


von Johann (Gast)


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

von Spess53 (Gast)


Lesenswert?

Hi

Schon mal die Appnote von ATMEL probiert:

http://www.atmel.com/Images/doc8017.pdf

http://www.atmel.com/Images/AVR446.zip

MfG spess

von Johann (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.