Hallo m.a.r.v.in,
nichts leichter als das:
Besser so? Auf jeden Fall deutlich besser kommentiert als das Lib-OrginalCode:/****************************************************************************/ /* \brief Interrupt-Funktion fuer den AD-Wandler. Kann ueber autoencode gesteuert\n die Odometrie-Zaehler in encoder hochzaehlen. \param keine \return nichts \see Die globale Variable autoencode wird hier ausgewertet. Ist sie nicht FALSE,\n dann wird der AD-Wandler-Wert zum Zaehlen der Odometriewerte in der globalen\n Variablen encoder benutzt.\n Es wird auch der AD-Wandler-Kanal auf die 'andere' Seite der Odometrie\n umgeschaltete und der AD-Wandler neu gestartet.\n Somit wird erreicht, dass zumindest die Odometriemessung automatisch erfolgt. \par Beispiel: int main(void) { int lSoll=60, rSoll=30, lPwm=lSoll, rPwm=rSoll, delta=50; Init(); EncoderInit(); EncoderStart(); while(1) { int lIst=encoder[LEFT], rIst=encoder[RIGHT]; EncoderSet(0, 0); lPwm+=(delta*lSoll - 1000*lIst)/300; rPwm+=(delta*rSoll - 1000*rIst)/300; SetMotorPower(lPwm, rPwm); Msleep(delta); } } *****************************************************************************/ SIGNAL (SIG_ADC) { const static unsigned char admux[]={ (1 << ADLAR) | (1 << REFS0) | WHEEL_LEFT, (1 << ADLAR) | (1 << REFS0) | WHEEL_RIGHT}; static int tmp [2], flag [2]={1,1}; static unsigned char toggle = 0; if (autoencode) { // Aktuellen Sensorwert vom AD-Wandler entnehmen (hier nur high-order-byte). int sensor = ADCH; // Der AD-Wandler wird schon mal auf den übernächsten Analogkanal eingestellt. ADMUX = admux[toggle]; // In tmp wird ein gleitender Mittelwert mitgeführt. tmp[toggle] += (sensor-tmp[toggle])>>2; // Weicht der aktuelle Sensorwert um mehr als +/- 2 vom gleitenden Mittel ab? if (flag[toggle]*(sensor-tmp[toggle]) > 2) { // Dann zähle einen Tick weiter. // Und nächster Tick erst wieder bei -/+ 2 Abweichung vom gleitenden Mittel. encoder[toggle]++; flag[toggle] = -flag [toggle]; } toggle ^= 1; } }![]()







Zitieren

Lesezeichen