From 3a6e6bdcea9f664346f8031f1a223b18af5c9970 Mon Sep 17 00:00:00 2001 From: Alessandro Mauri Date: Mon, 11 May 2026 02:12:42 +0200 Subject: [PATCH] different PID --- fw/main.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/fw/main.c b/fw/main.c index efd4b6d..96c5446 100644 --- a/fw/main.c +++ b/fw/main.c @@ -466,7 +466,7 @@ __attribute__((noreturn)) int main(void) u8g2_DrawStr(u8g2, x_off+45, y_off+15, "D:"); u8g2_DrawStr(u8g2, x_off+55, y_off+15, u8g2_u16toa(pd_profile.max_duty, 3)); u8g2_SendBuffer(u8g2); - Delay_Ms(5000); + // Delay_Ms(5000); } @@ -490,7 +490,7 @@ __attribute__((noreturn)) int main(void) if (has_pd) { static uint16_t vbus_mv, current_ma; - static int16_t temp_c, tip_temp_c; + static volatile int16_t temp_c, tip_temp_c; static uint16_t power; static s32 e; vbus_mv = U16_FP_EMA_K4(vbus_mv, ((u32)adc_buffer[0]*VCC_MV*11)/4096); @@ -539,8 +539,10 @@ __attribute__((noreturn)) int main(void) FR_printNumF(buf_putc, e, R, 0, 3); u8g2_DrawStr(u8g2, x_off+0, y_off+15, buf_get()); // Display current - u8g2_DrawStr(u8g2, x_off+45, y_off+15, "A:"); - u8g2_DrawStr(u8g2, x_off+55, y_off+15, u16toa(current_ma)); + // u8g2_DrawStr(u8g2, x_off+45, y_off+15, "A:"); + // u8g2_DrawStr(u8g2, x_off+55, y_off+15, u16toa(current_ma)); + u8g2_DrawStr(u8g2, x_off+45, y_off+15, "W:"); + u8g2_DrawStr(u8g2, x_off+55, y_off+15, u16toa(power)); if (enabled) { @@ -569,19 +571,26 @@ __attribute__((noreturn)) int main(void) if (pwm) { const uint16_t tim_max = FUNCONF_SYSTEM_CORE_CLOCK / PWM_FREQ_HZ - 1; - static s32 err_p, err_i, err_d, prev_err; + static s32 err_p, err_i, err_d, dt, fpt, prev_fpt; + static u32 t, prev_t; uint16_t duty; // absolute temperature error s32 err = I2FR(delta, R); + fpt = I2FR(tip_temp_c, R); + t = funSysTick32(); + dt = FR_DIV(I2FR((t-prev_t)/DELAY_MS_TIME, R), R, I2FR(1000, R), R); err_p = err; - err_i = FR_CLAMP(FR_FixAddSat(err_i, err), I2FR(-1000, R), I2FR(1000, R)); - err_d = FR_SUB(err, R, prev_err, R); - prev_err = err; + // Conditional integration + if (delta > 40 && delta < -40) err_i = FR_CLAMP(FR_FixAddSat(err_i, FR_FixMulSat(err, dt)), I2FR(-1000, R), I2FR(1000, R)); + err_d = FR_DIV(FR_FixAddSat(prev_fpt, -fpt), R, dt, R); + prev_t = t; + prev_fpt = fpt; - const s32 kp = FR_numstr("0.00700", R); - const s32 ki = FR_numstr("0.00001", R); + const s32 kp = FR_numstr("1.2000", R); + const s32 ki = FR_numstr("0.05000", R); const s32 kd = FR_numstr("0.00000", R); + e = 0; e = FR_FixAddSat(e, FR_FixMulSat(err_p, kp)); e = FR_FixAddSat(e, FR_FixMulSat(err_i, ki)); e = FR_FixAddSat(e, FR_FixMulSat(err_d, kd));