Guten Tag Leute
Für meinen Laminator, welcher verschieden breite Platinen mit der
Toner-Transfermethode "bedrucken" soll, brauche ich eine
Vorschubregelung, damit die Platine homogen "bedruckt" wird. Das habe
ich mit einem Quadraturencoder (HEDL 5540) und einem Mikrocontroller
realisiert, was soweit auch funktioniert.
Der uC (c8051f330, silabs) besitzt ein PCA Modul, welches eine Capture
Funktion hat. Ich habe einen Ausgang des Encoders an den uC verbunden.
Bei jeder pos. Flanke dieses Encodersignals wird ein Interrupt
ausgelöst. Da wird jedesmal ein "Capture" des im Hintergrund laufenden
Zählers gemacht. Danach wird die Zeitdifferenz des aktuelle und des
vorhergehenden Interrupts berechnet, was mir die Zeit zwischen zwei pos.
Flanken ergibt, also den Kehrwehrt der Drehfrequenz (im code 'rpm')
meines Motors.
Das sieht so aus:
1 | void isr_capture() interrupt 11
|
2 | {
|
3 | PCA0CN &= ~0x02;
|
4 | rpm = pca0cpl - capture_old;
|
5 | capture_old = pca0cpl;
|
6 | }
|
Das scheint Ansich auch alles zu funktionieren, jedoch wenn ich diesen
Wert per UART auf dem PC in einem Diagramm anzeigen lasse, habe ich ca
alle 2-3 Sekunden Spikes, die manchmal den doppelten Wert anzeigen.
Und genau da liegt das Problem. Diese Werte machen meine Regelung
verrückt.
Ich könnte die zwar filtern, aber lieber möchte ich die Ursache dieses
Verhaltens ermitteln! Ich dachte zuerst, dass der Encoder zu viele
Interrupts generiert und der uC nicht mehr mit Abarbeiten nachkommt.
Jedoch sind diese Spikes nicht von der Drehzahl abhängig (soweit ich das
beobachten konnte). Weiter dachte ich, dass es evt. ein Overflow sein
könnte. Dies ist jedoch nur möglich, wenn sich die Werte an einer
Bereichsgrenze aufhalten würden. Das ist leider auch nicht der Fall.
Des weiteren habe ich versucht, alles anderen Interrupts abzuschalten.
Das half leider auch nichts. Hat sowas auch schon jemand gehabt? Gibt es
sonst noch Sachen, die ich austesten / beachten sollte?
Den kompletten Code könnte ich nachrücken, falls erwünscht, jedoch denke
ich, dass es etwas grundlegenderes ist, was ich noch nicht verstanden
habe.
Viele Grüsse,
yoshi