Schrittmotorsteuerung mit Timer/Interrupts

Gast #2428752
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
Gast #2432476
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.
Gast #2432932
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.

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