feat(adc): 新增变比维 r 三维折算,录波段格式升 v2

采样板注入 Ua=5V/Ia=0.5A 读数偏小,根因是固件只输出引脚电压、
缺「端子→引脚」变比。折算改三维:

工程量 = (code + b) × k[µV/码] × 1e-6 × r

k 保持 ROM 引脚 LSB,b 为零点,r 为端子变比(int32 Q16)。
变比不能并进 k:UA 端子域 k 达 1.5e5 µV/码、Q16 溢出 int32;
r 单独存 Q16 不溢出。两点标定改标 r,k 仍是板级事实。

- 新开单段 [adc_cal_sec](8 键 r_ua..r_in),cfg 段数达 8/8 上限
- 一次变比复用 prot_set 四项,不新开段;r=0 表示本路不折算
- ROM 默认带台架实测变比(电压族 1000、电流族 29.4118),
  烧进固件即显二次值;VALID 仍须两点标定,两者互不派生
- eng 判据改「每路要么已配变比、要么削顶不显示」,不再看 VALID
- 104 地址 0x8050~0x8057 写 r,run_par_cal_r_set 写值与置脏同函数
- 录波 v2:通道表加 int32 r_q16,头 128→160、整段 5250→5282;
  code_to_milli 用余数分解换等价单次圆整,20 万组大整数对拍 0 不符
- 文档同步:采集与算法层/通道映射/故障录波/网络配置/配置文件/
  产品需求/内存台账,历史带日期实测数字按冻结口径不改
- 单测 13 套全绿,/keil-build 0 错误 0 警告(256024/31760/
  2080/152368),RAM 实测回填内存内容分配策略 §6.1
This commit is contained in:
2026-11-11 11:31:34 +08:00
parent 8115fb9a87
commit 3675b89e8e
35 changed files with 1653 additions and 505 deletions
+39 -22
View File
@@ -519,38 +519,55 @@ void adc_task_func(void *arg) {
wev = wave_ring_tick(now, s_frames_consumed);
if (wev == WAVE_RING_EVT_SEALED) {
uint8_t c;
/* 封存瞬间事实(交棒结构 s_wave_cal 为文件级 static,不上栈):
* eng / VALID 位图 / CLIPPED 位图 / 墙钟 / 逐路 conv+bits+avail+k+b。
* eng / VALID 位图 / CLIPPED 位图 / 墙钟 / 逐路 conv+bits+avail+k+b+r。
* eng 口径 = adc_cal.h 注③ 的 8 路量纲标签(判据源
* App/app/ui_data_feed.c feed_eng(),与 prot_blocked 的三路口径**不是**
* 一件事):8 路电气量全 VALID 才是二次值;V0.1 无 CT 变比,一次值不可达。
* 一件事):**每路要么已配变比、要么削顶(页面本来就显 "-",不参与
* 整帧量纲断言)——八路全满足即二次值,否则引脚域**。不再看 VALID:
* VALID 回答"准不准"、r 回答"什么单位",V0.1 五路削顶永远拿不到 VALID,
* 用 VALID 当量纲判据会让徽标永不解除。
* wall 未对时写 0(sys_clock_get 失败 = UINT32_MAX,不许拿上电毫秒冒充)。
* k 取 adc_cal_k_q16() int32 原值;b 的 float 回乘在本域无损
* (|b| 限幅 8192 << 2^24,float32 精确表示整数;禁用浮点只针对 k)。 */
* k / r 取 adc_cal_k_q16() / adc_cal_ratio_q16() 的 int32 原值(float 在
* 5.28e7 / 6.5e7 量级掉尾数);b 的 float 回乘在本域无损
* (|b| 限幅 8192 << 2^24,float32 精确表示整数;禁用浮点只针对 k / r)。 */
s_wave_cal.flags_seq = 0u;
s_wave_cal.clip_mask = 0u;
for (c = 0u; c < WAVE_RING_CH; c++) {
const uint32_t f = adc_cal_flags((adc_semantic_t)c);
const adc_channel_desc_t *d = adc_input_desc((adc_semantic_t)c);
/* 整帧量纲:每路要么已配变比、要么削顶不显示 → 全满足即二次值。
* 削顶通道不参与断言的理由:它们页面本来就显 "-",把它们的量纲也算进
* 整帧会把「已全部配好变比」的段误标成引脚域(V0.1 五路削顶恒成立)。
* 与逐路取数**同一遍循环**算完:adc_cal 每拍只走一遍(逐路 flags /
* ratio_configured / k_q16 / b_codes / ratio_q16 五个纯读子查询),
* 不为了一个派生量再走第二趟。 */
{
uint8_t eng_ok = 1u;
uint8_t c;
if ((f & ADC_CAL_F_VALID) != 0u) {
s_wave_cal.flags_seq |= (uint8_t)(1u << c);
for (c = 0u; c < WAVE_RING_CH; c++) {
const uint32_t f = adc_cal_flags((adc_semantic_t)c);
const adc_channel_desc_t *d = adc_input_desc((adc_semantic_t)c);
if ((f & ADC_CAL_F_VALID) != 0u) {
s_wave_cal.flags_seq |= (uint8_t)(1u << c);
}
if ((f & ADC_CAL_F_CLIPPED) != 0u) {
s_wave_cal.clip_mask |= (uint16_t)(1u << c);
} else if (adc_cal_ratio_configured((adc_semantic_t)c) == 0u) {
eng_ok = 0u;
}
s_wave_cal.ch[c].conv = (d != NULL) ? (uint8_t)d->source
: (uint8_t)ADC_SRC_STM32;
s_wave_cal.ch[c].bits = (s_wave_cal.ch[c].conv == (uint8_t)ADC_SRC_TPAFE)
? 16u : 12u;
s_wave_cal.ch[c].avail = (uint8_t)f;
s_wave_cal.ch[c].k_q16 = adc_cal_k_q16((adc_semantic_t)c);
s_wave_cal.ch[c].b_codes = (int32_t)adc_cal_b_codes((adc_semantic_t)c);
s_wave_cal.ch[c].r_q16 = adc_cal_ratio_q16((adc_semantic_t)c);
}
if ((f & ADC_CAL_F_CLIPPED) != 0u) {
s_wave_cal.clip_mask |= (uint16_t)(1u << c);
}
s_wave_cal.ch[c].conv = (d != NULL) ? (uint8_t)d->source
: (uint8_t)ADC_SRC_STM32;
s_wave_cal.ch[c].bits = (s_wave_cal.ch[c].conv == (uint8_t)ADC_SRC_TPAFE)
? 16u : 12u;
s_wave_cal.ch[c].avail = (uint8_t)f;
s_wave_cal.ch[c].k_q16 = adc_cal_k_q16((adc_semantic_t)c);
s_wave_cal.ch[c].b_codes = (int32_t)adc_cal_b_codes((adc_semantic_t)c);
s_wave_cal.eng = (eng_ok != 0u)
? (uint8_t)WAVE_ENG_SEC : (uint8_t)WAVE_ENG_PIN;
}
s_wave_cal.eng = (s_wave_cal.flags_seq == 0xFFu)
? (uint8_t)WAVE_ENG_SEC : (uint8_t)WAVE_ENG_PIN;
{
uint32_t wall = sys_clock_get();