Compare commits

..

2 Commits

Author SHA1 Message Date
3a6e6bdcea different PID 2026-05-11 02:12:42 +02:00
b395e77117 fix encoder 2026-05-11 02:12:25 +02:00

View File

@ -1,4 +1,3 @@
#include "fr_math/FR_math.h"
#include <ch32fun.h>
#include <stdint.h>
#include <stdio.h>
@ -88,6 +87,7 @@ void update_encoder(void)
{
// 0 = 00, 1 = 01, 2 = 10, 3 = 11
static uint8_t last_state = 0;
static int8_t count;
// Lookup table: state_table[last_state][current_state]
// 0 = invalid move or bounce (ignore)
// 1 = valid forward step
@ -111,7 +111,9 @@ void update_encoder(void)
uint8_t current_state = (a << 1) | b;
// Find the movement direction based on transition
encoder += state_table[last_state][current_state];
count += state_table[last_state][current_state];
if (count == 4) encoder++, count = 0;
if (count == -4) encoder--, count = 0;
// Save current state for the next interrupt
last_state = current_state;
@ -464,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);
}
@ -488,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);
@ -537,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) {
@ -567,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));