generated from hulk/gd32f4xx_template_cmake_vscode
Heater: PID v0.1.14 - banded controller + sensor glitch guards
Rebuild PID as three-zone banded controller: far field P/D full power,
This commit is contained in:
@@ -97,11 +97,43 @@ float ntc_read_temperature(void) {
|
||||
static float s_ntc_last_temp = -273.15f; /* 最新温度(初值 = 开路标记) */
|
||||
static uint16_t s_ntc_sample_divider = 0; /* 主循环 10ms 圈分频计数 */
|
||||
|
||||
/* 滑动中值滤波(V0.1.11):真机读数毛刺可持续 1.4s+(曾抓到 14 帧连续
|
||||
OPEN),会穿透控制环的斜率限幅并触发猛拉。最近 NTC_MEDIAN_N 个样本取
|
||||
中值——单点/短串毛刺被完全剔除,滞后仅 ~0.2s(远小于低通滤波)。
|
||||
故障标记值(-273/-274)参与排序:偶发 OPEN 被中值滤掉,连续 >=3 帧才
|
||||
成为中值(等效又一层去抖),故障判定语义不变。 */
|
||||
#define NTC_MEDIAN_N 5U
|
||||
static float s_ntc_win[NTC_MEDIAN_N];
|
||||
static uint8_t s_ntc_win_idx = 0;
|
||||
static uint8_t s_ntc_win_fill = 0;
|
||||
|
||||
void ntc_sample_task(void) {
|
||||
/* 主循环周期 10ms:按 NTC_SAMPLE_PERIOD_MS 分频触发一次采样 */
|
||||
if (++s_ntc_sample_divider >= (NTC_SAMPLE_PERIOD_MS / 10U)) {
|
||||
s_ntc_sample_divider = 0;
|
||||
s_ntc_last_temp = ntc_read_temperature();
|
||||
|
||||
float v = ntc_read_temperature();
|
||||
s_ntc_win[s_ntc_win_idx] = v;
|
||||
s_ntc_win_idx = (uint8_t)((s_ntc_win_idx + 1U) % NTC_MEDIAN_N);
|
||||
if (s_ntc_win_fill < NTC_MEDIAN_N) {
|
||||
s_ntc_win_fill++;
|
||||
}
|
||||
|
||||
/* 插入排序后取中值(5 点,开销可忽略) */
|
||||
float tmp[NTC_MEDIAN_N];
|
||||
for (uint8_t i = 0; i < s_ntc_win_fill; i++) {
|
||||
tmp[i] = s_ntc_win[i];
|
||||
}
|
||||
for (uint8_t i = 1; i < s_ntc_win_fill; i++) {
|
||||
float key = tmp[i];
|
||||
int8_t j = (int8_t)(i - 1);
|
||||
while (j >= 0 && tmp[j] > key) {
|
||||
tmp[j + 1] = tmp[j];
|
||||
j--;
|
||||
}
|
||||
tmp[j + 1] = key;
|
||||
}
|
||||
s_ntc_last_temp = tmp[s_ntc_win_fill / 2U];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user