Forum: Mikrocontroller und Digitale Elektronik Schrittmotor mit opt. Encoder TimerCompare Problem


von Yorom (Gast)


Lesenswert?

Hallo liebe µC-Freunde,

ich hoffe hier nicht gleich auf andere Beiträge verwiesen zu werden weil 
das Thema schon so oft durchgekaut wurde aber ich bin leider nicht 
fündig geworden.

Also versuch ich´s mal.

Für eine Projektarbeit soll ein Schrittmotor (1,8°) über ein Joystick 
angesteuert werden welcher eine Lineareinheit über einen Zahnriemen 
antreibt. Zur Positionserfassung ist auf dem Stepper ein Encoder 
(500Imp/U) montiert.

Als Ansteuerung des Leistungsteils kommt ein Freescale (Motorola) HCS12 
(16Mhz) zum Einsatz.
Dieser besitzt einen 16bit Timer mit 8 Kanälen den Kanal 0 benutzen wir 
zur Takterzeugung für den Treiber über den entsprechenden Timerausgang 
(Toggle) und den Kanal 1 zur Erfassung des Encoders mit dem Code vom 
Herrn Dannegger.

Beide Kanäle lösen einen Compare Interrupt aus, wobei der für die 
Erfassung immer min. doppelt so schnell als der für den Treiber ist.

Wenn wir nun die Referenzfahrt starten und die Impulse der gesammten 
Strecke aufnehmen, bei ca. 300Hz, läuft alles nach "Plan" doch sobald 
wir die Mittenpos. mit normaler Geschwindigkeit ca.6khz anfahren wollen 
werden die Takte zwar ausgegeben aber der Timer-Ausgang bleibt in 
unregelmäßigen Abständen entweder auf High oder Low (Oszi).

Die Zeit der Ausetzer bewegt sich so um die 66ms.

Ich kann ja nachvollziehen das der ein oder andere Interrupt verschluckt 
wird da die aufaddierten Comparewerte mit dem aktuellen Timer zufällig 
mal aufeinander treffen aber gehen mir dann gleich 66ms flöten???

Ich hoffe ich konnte es einigermaßen nachvollziehbar rüber bringen wenn 
nicht werde ich es ja an der nicht folgenden Reaktion merken ;) .
Ansonsten einfach nochmal nachfragen.

Wäre echt nett wenn sich jemand erbarmen würde und uns evtl ein Tipp 
geben kann.

Vielen Dank im Vorraus Yorom

von holger (Gast)


Lesenswert?

>Die Zeit der Ausetzer bewegt sich so um die 66ms.

Timer mit falschen Daten gefüttert?
Überlauf über 16Bit nicht beachtet?

von Yorom (Gast)


Lesenswert?

Hallo,

also der Timerkanal 0 für die Impulse läuft soweit.
Sobald ich aber die Interrupts für den Kanal 1 enable kommt dieser 
Effekt zustande.
Der Überlauf spielt keine Rolle da der Comparewert immer zum aktuellen 
Timerwert dazuaddiert wird und keine Int´s für Überlauf aktiv sind.

Ich hab keine Idee mehr...

von MaWin (Gast)


Lesenswert?

> und den Kanal 1 zur Erfassung des Encoders mit dem Code vom
> Herrn Dannegger.

Stell mal um:

  if( GRAY_A )
    graycode |= 0x10;                   // new state to bit 3, 2
  if( GRAY_B )
    graycode |= 0x20;

in

  p=P1;
  if( p&1 )
    graycode |= 0x10;                   // new state to bit 3, 2
  if( p&2 )
    graycode |= 0x20;

von Yorom (Gast)


Lesenswert?

Mahlzeit,

also es sieht wohl so aus als würde wirklich der Interrupt für die 
Treiber Pulserzeugung veschluckt werden d.h. der Comparewert wird 
einfach überlaufen während sich der µC in der Interruptroutine für die 
Enc-Kanalabfrabe befindet. Ich dachte das nach dieser ISR der nächste 
Int hinten ansteht würde und danach abgearbeitet wird.
Sieht aber nicht danach aus, die Pausen sind exakt 1/Prescaler*FCPU * 
2^16 s lang also genau ein gesammter Zähldurchlauf bis er wieder den 
Comparewert erreicht hat.

Kennt sich jemand mit dem Freescalesystem aus?
Kann es sein das der Timerinterrupt nur eine Interruptanfrage speichert 
und die unterschiedlichen Kanäle einfach ignoriert?
Egal welcher Kanal kam, timer ISR is immer das gleiche?

Gruß aus der Hauptstadt

von Yorom (Gast)


Lesenswert?

Problem erkannt, Gefahr gebannt

um das Int-Flag der Kanäle zurück zu setzen muss eine "1" in das 
entsprechende Register geschrieben werden also bei
TimerChannel 0 = 0x01 und beim Channel 1 = 0x02
das haben wir in der ISR mit
TFLG1 |= 0x01;      //ISR-Flag zurücksetzen und
TFLG1 |= 0x02;      //ISR-Flag zurücksetzen

gemacht.
Doch die veroderung ist in diesem Fall nicht richtig da, wenn beide 
Flags gekommen sind, (TFLG1 = 0x03) verodert mit 0x01 immernoch eine 
0x03 ins TFLG1 geschrieben wird und somit auch das Flag des Channel 1 
zurückgesetzt würde. Somit liegt auch kein weiterer Int mehr an und der 
Timer zählt fröhlich weiter...

Also TFLG1 = 0x01 und TFLG1 = 0x02 sind an dieser Stelle besser 
geeignet.

Trotzdem vielen Dank all denen die sich die die Mühe machten und 
versucht haben den Fehler in Gedanken zu reproduzieren.

Bis demnächst Yorom

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.