Die Zähl ISR sehen zB so aus:
Code:
ISR(INT6_vect) // Odo_li
{
odo_li++;
odo_speed_li++;
status_motor_li_count=0;
Motor_Fehler_Status_links= Motor_ok;
}
Einzig die Timer ISR ist länger da hier zum Teil die PID Regler berechnet werden. Muss am Abend das durch den Simu lassen, glaube es waren um die 700 Takte. Sind alles Festkomma Berechnungen.
3x das gleiche Schema, teilweise wird Anfangs von volatile auf lokale Variablen kopiert da damit der Ablauf schneller sein soll:
Code:
if (tasktimer==TASKmessermotor)
{
drehtemp=(short)60*(short)odo_messer;
drehzahl_ist=(unsigned short)drehtemp;
odo_messer=0;
if (drehzahl_soll>drehzahl_max) drehzahl_soll=drehzahl_max;
v = ((short)drehzahl_soll-drehtemp);
v=v/10;
i_summe = i_summe + v;
if (i_summe < 0) i_summe = 0;
if (i_summe > 1280) i_summe = 1280;
// PI Regler 0,3*(v/100+1/1,2*i_summe)
temp_mower=(10*i_summe)/12;
mowersp= (v+temp_mower)*3;
mowersp=mowersp/10;
if (mowersp < 100) mowersp = 100; //Begrenzung Stellgröße
if (mowersp >= 240) mowersp = 240;
mowerspeed=(unsigned char)(mowersp);
Mower=mowerspeed;
}
LG!
Lesezeichen