different PID

This commit is contained in:
Alessandro Mauri 2026-05-11 02:12:42 +02:00
parent b395e77117
commit 3a6e6bdcea

View File

@ -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));