Forum: Compiler & IDEs Schrittmotorsteuerung mit Timer/Interrupts


von hansi (Gast)


Lesenswert?

Hallo,

ich versuche gerade einen Schrittmotoransteuerung mit Interrupts zu 
realisieren. Soweit klappt das alles auch ganz gut – eine Pin wird auf 
GND oder 5V gezogen um die Richtung zu steuern, der andere Pin wird in 
einer Frequenz (Geschwindigkeit) getoggled.
1
void timer1_init()
2
{
3
    // set up timer with prescaler = 64 and CTC mode
4
    TCCR1B |= (1 << WGM12)|(0 << CS12)|(1 << CS11)|(1 << CS10);
5
6
    // set up timer OC1A pin in toggle mode
7
    TCCR1A |= (1 << COM1A0);
8
9
    // initialize counter
10
    TCNT1 = 0;
11
    
12
  // initialize compare value
13
    OCR1A = 1022; //slow
14
}

Jetzt möchte ich aber "Schritte zählen", um einigermassen bestimmen zu 
können, wo der Motor gerade ist… in meinem alten, linearen Programm zur 
Steuerung habe ich einfach eine Variable "steps" bei jeder HIGH-LOW 
phase des Step-Pins mitzählen lassen – je nach Richtung +1 oder -1.

Das ganze würde ich gerne auch in einer ISR() Routine machen. Ich 
schaffe es aber nicht eine einzurichten… Welchen Vektor brauche ich? 
Welche Bits muss ich bei der _init() setzen, damit ein Interrupt 
ausgelöst wird (parallel zum Schalten des Pins)

Hoffe ihr könnt mir helfen!

Danke

von Rolf Magnus (Gast)


Lesenswert?

hansi schrieb:
> Welchen Vektor brauche ich? Welche Bits muss ich bei der _init() setzen,
> damit ein Interrupt ausgelöst wird (parallel zum Schalten des Pins)

Das hängt beides maßgeblich davon ab, welchen Prozessor du verwendest.

von hansi (Gast)


Lesenswert?

Ah… entschuldigung… das wichtigste vergessen: mega168

von Karl H. (kbuchegg)


Lesenswert?

Der CTC Modus löst einen Compare Match Interrupt aus. Das ist der 
Interrupt den du freigeben und an den du eine ISR hängen musst.

von Uwe (Gast)


Lesenswert?

Ich finde es eine schöne Lösung wenn man zur Steuerung der 
Geschwindigkeit den Timer 2 nimmt den Output Compare Pin von Timer 2 
nimmst du dann als Step Clock für den Schrittmotor und gleichzeitig als 
clk input für den Timer 1 (16Bit). Mit Set on Compare Match bzw. Clear 
on Compare match für Timer 1 kannst du über Gatter nun die Step Clock 
unterbrechen (in Hardware) und auch einen Interupt auslösen bzw. man 
kann auch die Direction über Logikgatter mit einbeziehen und so mit 
Endschaltern die Direktion und Clock sperren oder freigeben. Unabhängik 
von der Software. Die Motorgeschwindigkeit braucht man nur ins 
Compareregister von Timer 2 zu schreiben und kann Sie abhägig von der 
Position (in Timer 1) anpassen (jeweils bei Comparematch von Timer 2 
also bei jeder Step Clock). Bei erreichen der Endposition wirdd 
automatisch die Step Clock gesperrt (oder von den Endschaltern) und ein 
Interupt ausgelöst das der Motor angekommen ist. Alles nur Konfiguriert 
und verdrahtet und ohne ein Stück Software bewegt sich der Motor.

von STK500-Besitzer (Gast)


Lesenswert?

Uwe schrieb:
> Ich finde es eine schöne Lösung wenn man zur Steuerung der
> Geschwindigkeit den Timer 2 nimmt den Output Compare Pin von Timer 2
> nimmst du dann als Step Clock für den Schrittmotor und gleichzeitig als
> clk input für den Timer 1 (16Bit). Mit Set on Compare Match bzw. Clear
> on Compare match für Timer 1 kannst du über Gatter nun die Step Clock
> unterbrechen (in Hardware) und auch einen Interupt auslösen bzw. man
> kann auch die Direction über Logikgatter mit einbeziehen und so mit
> Endschaltern die Direktion und Clock sperren oder freigeben. Unabhängik
> von der Software. Die Motorgeschwindigkeit braucht man nur ins
> Compareregister von Timer 2 zu schreiben und kann Sie abhägig von der
> Position (in Timer 1) anpassen (jeweils bei Comparematch von Timer 2
> also bei jeder Step Clock). Bei erreichen der Endposition wirdd
> automatisch die Step Clock gesperrt (oder von den Endschaltern) und ein
> Interupt ausgelöst das der Motor angekommen ist. Alles nur Konfiguriert
> und verdrahtet und ohne ein Stück Software bewegt sich der Motor.

Ja, genau...
Ist vielleicht für den einen oder anderen "schön", aber voll am Ziel 
vorbei.
Das kann man nämlich alles in der ISR machen.

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.