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
这个提交包含在:
zhou yang
2026-09-06 19:11:10 +08:00
共同撰写人 Claude Opus 5
父节点 ceadf08345
当前提交 9eb1b39da6
共修改 13 个文件,包含 1154 行新增和 40 行删除
+18 -1
查看文件
@@ -2236,9 +2236,26 @@ ESP32 复位期间 GPIO 高阻,595 输出随之高阻,配合 P2 上每个栅
100nF 太小。
3. **VREF 不用外部基准时,要 100 nF 到地 + 上拉电阻到 VDD**。
通道分配:U6 的 OUT0/OUT1/OUT2 = VDAC1/2/3,U7 的 OUT0/OUT1 = VDAC4/5;
通道分配(**2026-09-06 按 PCB 几何重排,取代 09-03 那一版**,§26.18):
| 路 | 片 | 通道 |
|---|---|---|
| `VDAC1` | U6(0x4A) | **OUT2** |
| `VDAC2` | U6 | **OUT0** |
| `VDAC3` | **U7(0x4B)** | OUT0 |
| `VDAC4` | U6 | **OUT1** |
| `VDAC5` | U7 | OUT1 |
U6.OUT3、U7.OUT2/OUT3 未用(FB 也不接,datasheet 说未用通道保持 FB 悬空)。
> ⚠️ **「前三路在 U6、通道号 = rail−1」是旧版**,五路里有四路对不上。
> 四个通道电气上完全对等,所以接错了**板子照样正常工作,只是调 CH1 的命令去调了 CH2**,
> 功能测试完全测不出来。固件里查表不要算:`dac63204_rail_addr()` / `dac63204_rail_ch()`
> (A4 已落地,`test_rail_map_is_not_the_naive_formula` 专门拦这一手)。
>
> ⚠️ **未用通道不许上电**:FBx 悬空时电压输出模式是开环运放。
> `COMMON-CONFIG` 里 U6 = `0x1E49`(OUT3 保持 Hi-Z)、U7 = `0x1FC9`(OUT2/OUT3 保持 Hi-Z)。
> **内部基准是 1.212 V(1.1979/1.212/1.224),不是 1.25 V。**
> 增益 2× → 满量程 **2.424 V**,不是 2.5 V。§4 的公式按 0~2.5V 推的,
> 实际 Vd 上限 2.424V,所以输出下限是 **3.524 V** 而不是 3.508 V(更安全,见 §4.4)。