Hallo Gerhard
Zitat von
oderlachs
... aus zwei Gabellichtschranken .. Sensor für die Lochscheiben auf den Achsen ...
Na prima, damit kann man ja schon ne ganze Menge anfangen. Hier mal kurz skizziert wie ich meine Geschwindigkeiten und Wege messe.
1. Ein Timer mit 50 µs - bei meinen 20 MHz-Controllern habe ich also satte 1000 Maschinenzyklen zwischen den Timer-Interrupts. Der Timer zählt diese Zeitscheiben (timer units) hoch bis zu - sagen wir 20 000 - danach wird er auf "Eins" gesetzt. Der Timer wird mit dieser Interruptserviceroutine "ausgelesen".
Code:
// ============================================================================== =
// === Nicht unterbrechbare ISR für timer2 ===================================== =
// Routine zählt hoch im Takt 20 kHz = 50 µs. Der Zählerwert wird von den ISR für
// EXT_INT0 und -INT1 ausgelesen und den Werten Iz_yseci zugewiesen.
ISR(TIMER2_COMPA_vect) // Vektor 7
{
if (Izeit_1 < Izthrznt) //Interrupt-Timer = 0 ... 19 999 ... (1 sec blink)
// Izthrznt ist der Zeithorizont, meist 19 999
// entsprechend einer Sekunde
// Izeit_1 ist die "Bordzeit" als Teil einer Sek
{ //
Izeit_1 ++; // ###>>> Izeit_1 ist aktuell int16_t ==>>
// Izeit_1 bleibt bis 32000 in der int16-Grenze
} //
else //
{ //
Izeit_1 = 1; // ansonsten: Rückstellen auf Eins
} // Ende if (Izeit_1 < Izthrznt)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
return;
} //
// ============================================================================== =
2. Ein Interrupt (hier bei steigender Flanke der Gabellichtschranke) ausgelöst am Eingang EXT_INT1 (und für den anderen Motor auf EXT_INT0. Die Zeitscheiben zwischen zwei Interrupts werden notiert z.B. als Iz_ysec1 => Istzeit_für_mot_1. Ausserdem wird gleich die Zeitdifferenz zwischen zwei Interrupts berechnet, damit kann schnell die Drehzahl berechnet werden. Beachte: die vierflügelige Encoderscheibe wird nur bei jedem zweiten Schlitz ausgewertet => das ist die Zeit für eine halbe Motorumdrehung. Diese Zeitscheiben nenne ich in meinem Programm tupsi (t imer u nits p er s ensor i nterrupt) - das ist also eine inverse Geschwindigkeit. Und die Vorgabe dazu sind die stupsi - Soll-tupsi.
Anmerkung: Es gibt alle Sekunden einen Rechenfehler durch den Zeitüberlauf von Izeit_1. Der wird aus Gründen der Rechengeschwindigkeit vernachlässigt, der dadurch entstehende Fehler stört in der Praxis nicht. Fehlerhäufigkeit ist dabei durchschnittlich 0,5% der Encoderzeit-Messungen.
Code:
// ============================================================================== =
// === Nicht unterbrechbare ISR für EXT_INT1 auf Pin 5/PD3/mega168 ============ =
// Routine setzt einfach einen Zähler hoch.
// Diese Encoderroutine schreibt die verstrichenen Zeiteinheiten zu 50µs auf,
// die seit dem letzten Encoder-Interrupt verstrichen sind.
ISR(INT1_vect) // hiess mal: ISR(SIG_INTERRUPT1)
{ //
if (nenc1 < mxnc1) // mxnc1 ist eine Art "Divisor" für die
// Encoderscheibe => es wird nur jeder
// mxnc1-te (hier 2) Scheibentick gezählt
{
nenc1 = nenc1 + 1; // Interrupt hochzählen (4-Flügel-Encoder)
Lncdrges1 ++; // Gesamte Encoderticks einfach hochzählen
}
else
{ // Zähle NUR jeden vierten Interrupt
nenc1 = 1;
Iencdr1 ++; //zähle Counter/encoder1 hoch
Ienc1alt = Iencdr1;
Iz_yseci1 = Izeit_1; //Weise Iz_ysec1 dem akt. Timerwert zu
Iz_diff1 = Iz_yseci1-Iz_ysecv1; //Neue Zeit-Differenz1 ausrechnen
Iz_ysecv1 = Iz_yseci1; //der aktuelle Zeitwert wird "Alter"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Es werden jetzt die aktuellen Daten festgehalten für Messfahrt
}
}
// ============================================================================= =
Nun habe ich manchmal in einem kurzen Testlauf at runtime in der ISR (zu Punkt 2) die Encoderzeiten = Zeitbedarf für eine halbe Motorumdrehung, in einem hundertelementigen Feld festgehalten, dazu die fortlaufende Bordzeit (wegen der späteren Diagramm-Zeitachse) und nach dem Testlauf die Daten über UART ausgegeben. Damit kann ich prächtig die beiden Motoren auf Gleichlauf und sonstige dynamisch interessante Eigenschaften prüfen.
In diesen Messfahrten (klick für Beschreibung und Diagramme) habe ich das simultane Anfahren meiner Motörchen getestet, Fehler festgestellt und behoben *ggg*.
Und hier (klick mal) habe ich beschreiben, wie ich die Reifen für meinen WALL R so griffig mache, das ich Rutschen verhindern kann (seit diesem Postings fahren die Formel1-Piloten mit Soft, Supersoft, Inter etc *ggg*).
Natürlich kann ich mit alle dem NUR die Umfangsgeschwindigkeit der Antriebsräder berechnen/messen. Der Schlupf verhindert, dass diese Geschwindigkeit auch zu 100,000 % die wahre Fahrgeschwindigkeit des zugehörigen Rades ist :-/
Viel Erfolg
Lesezeichen