A4:DAC63204 驱动 + rail_set_mv()
调压是**反向**的(DAC 码越大输出越低),所以整块换算只在 rail_mv_to_code() 里出现一次那个减法,除 rail.c 外任何地方都不许碰 dac63204_write_code()。 范围 3524~4010 mV,越界即拒(SR-13,第四道限制),4010 = Vd 0。 通道映射按 §26.18 重排过,五路里四路对不上「前三路在 U6、通道号 = rail−1」: CH1→U6.OUT2 / CH2→U6.OUT0 / CH3→U7.OUT0 / CH4→U6.OUT1 / CH5→U7.OUT1。 四通道电气对等 ⇒ 接错了板子照样正常工作,只是调错了路。设计文档 §17.2 那张 过期的通道表一并改掉了。 驱动只经 hal_i2c_*:认件(DEVICE-ID=01h,53204/43204 当 BUS 错拒掉)、 开内部基准 → 写增益 2× → 写安全码 → 才给用到的通道上电(COMMON-CONFIG 因此写两次: 复位码 0 就是输出上限 4.010 V),未用通道 FBx 悬空一律保持 Hi-Z。 三个「一定会被写出来的错」逐个改进去验过测试拦得住:反向关系写反 → test_rail 红; 忘了码左对齐、通道按 rail−1 算 → test_dac63204 红。 留给下次的两条:越界请求还没记事件(TODO(A11));两点标定还没做, 现在走理论公式,将来顶替的是 RAIL_VOUT0_UV / RAIL_DAC_SPAN_UV 两个常量。 Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01QYuExfgyYa6DzRRcUso8M8
这个提交包含在:
@@ -434,6 +434,21 @@ typedef struct {
|
||||
3. **出厂标定**:分压网络与 DAC 基准都有 ±1 % 级的容差,用该路 INA226 读回实际输出,
|
||||
做一次两点线性标定存进 NVS。标定值缺失时退回理论公式(误差约 ±40 mV,可用)。
|
||||
|
||||
> **A4 已落地**:换算与设定在 `firmware/main/rail.c`,唯一入口 `rail_set_mv(rail, mv)`
|
||||
> (rail 是 **1~5**)。三个验收点各有一条测试:4020 mV 被拒、码大电压低、3900 mV ↔ Vd 0.548 V。
|
||||
> 标定(本节规矩 3)**还没做**,现在走的是理论公式;`RAIL_VOUT0_UV` / `RAIL_DAC_SPAN_UV`
|
||||
> 两个常量就是将来要被标定值顶替的地方。
|
||||
>
|
||||
> 同处记下三条 DAC63204 的实现约定(出处 SLASEX3A):
|
||||
> - **12 位码在 `DAC-X-DATA`(19h~1Ch) 里是左对齐的**(bit15-4)。忘了 `<< 4` 不报错,
|
||||
> 只让输出变成 1/16 —— 而在本板上那表现为「五路都是 4.010 V 满电」,看不出异常。
|
||||
> - **`EN-INT-REF` 要先于增益设定写**,且**上电安全码要写在通道上电之前**:
|
||||
> 复位码是 0,而 Vd = 0 就是输出上限 4.010 V。`dac63204_init()` 因此把
|
||||
> `COMMON-CONFIG` 写两次(先按住输出,写完码再上电)。
|
||||
> - **通道分配不是 `rail−1`**(设计文档 §26.18 重排过,五路里四路对不上):
|
||||
> CH1→U6.OUT2 / CH2→U6.OUT0 / CH3→**U7**.OUT0 / CH4→U6.OUT1 / CH5→U7.OUT1。
|
||||
> 四通道电气对等 ⇒ 接错了照样工作,只是调错路,功能测试测不出来。
|
||||
|
||||
### 10.6 执行器:三个状态机 + 一个影子寄存器
|
||||
|
||||
**每路三个序列,彼此互斥、不可重入**(同一路上同时只能跑一个):
|
||||
|
||||
在新工单中引用
屏蔽一个用户