// Konstanten für pwmCapladung const I_BATT_SOLL = 630; // entspricht 10 A const U_CAP_VOLL = 908; // entspricht 40 V const TN_CAP = 6.5; const KR_CAP = 0.053; thread pwmCapladung { // Prioritätsvergabe run 32; // Variablendefinition int I_Batt_ist, U_Cap; int uk, uk_alt; float hilf; float xd, xd_alt; long time_alt, delta_time, time; // PWM Porteinstellung plm.settimebase(1,ZEITBASIS); // PWM Port 1 mit einer Zeitbasis von 400ns plm.setmode(1,0); // Hardwaremodus, digitaler Ausgangspegel plm.setperiod(1,PERIODENLAENGE); // Setzen der Peridenlänge in Ticks, hier für // 5 kHz (Periodenlänge = 1/(f * timebase)) // Batteriestrom I_Batt_ist = ports.adc(1); U_Cap = ports.adc(2); if I_Batt_ist < I_BATT_SOLL { time_alt = system.timer(); uk_alt = UK_START; xd_alt = 0; do { time = system.timer(); delta_time = time - time_alt; // Überlaufkontrolle if delta_time < 0 delta_time = system.timer() + (2147483647 - time_alt); xd = I_BATT_SOLL - I_Batt_ist; // ticks_high ist die Stellgröße !!!! hilf = (1 + delta_time/(TN_CAP)); uk = uk_alt + KR_CAP * hilf * xd - KR_CAP * xd_alt; if uk > 325 uk = 325; // Begrenzung der Stellgröße auf 65% if uk < 0 uk = 0; plm.out(1,uk); // Ausgabe 0..500 taus gleich 0..100% uk_alt = uk; xd_alt = xd; time_alt = time; //U_cap = ports.adc(konstanten.PAD_U_CAP); I_Batt_ist = ports.adc(konstanten.PAD_U_I_BATT); //U_Cap = ports.adc(konstanten.PAD_U_CAP); //if U_Cap > U_CAP_VOLL // halt; sleep 10; }while I_Batt_ist < 700; } // Stoppen der PWM Erzeugung halt; }