设了电流测不到输出?状态机IDLE态在偷偷清零

📅 2026/8/5 10:12:48
设了电流测不到输出?状态机IDLE态在偷偷清零
一句话: 发光序列状态机在IDLE态每100ms把所有DAC清零安全设计。手动设的电流100ms内就被抹掉——串口回显设置成功不代表硬件真有输出。加个手动模式标记就解决。适合谁读遇到设置了没效果回显成功但输出端测不到的嵌入式工程师。现象100mA有输出40/80mA没有上位机设电流回显成功CRC校验通过一切正常。但拿万用表测输出端设 100mA →有输出设 40mA →没有设 80mA →没有同样的命令、同样的换算、同样的写码逻辑为什么 100mA 能测到排查先排除换算和写码40mA 对应 DAC 码 54680mA 对应 1092100mA 对应 1365——换算没问题。写码逻辑三条路径完全相同也排除了。问题不在命令本身在命令之后发生了什么。真相IDLE态每100ms清一次DAC设备有个发光序列状态机空闲 → 预热 → 运行 → 待机……设计上空闲态必须把所有 DAC 清零安全要求不点亮的时候输出必须为零防止漏电烧器件。代码长这样else { /* IDLE: 全关 */ ... Dac_Write_Code(ch, 0x0000); // 每100ms清一次! }时序是这样的t0ms 上位机设 40mADAC 输出 40mA ✓ t100ms 序列 IDLE 定时任务跑一次全部清零 ✗ t200ms 再清一次……你设完电流100ms 内就被序列的 IDLE 任务抹掉。万用表当然测不到。那为什么 100mA 能测到因为测试时发光序列恰好处于别的状态那个状态会设激光电流不清零100mA 是它设的不是你设的。40/80mA 测试时序列早已超时回到空闲态一直清零。设计冲突安全逻辑 vs 手动测试回头看这是个真实的设计矛盾IDLE 全关是必须的——防漏电、防误点亮这是安全底线不能删手动设电流是调试刚需——但它的语义被 IDLE 覆盖了设了等于没设安全逻辑本身没错错的是没有区分业务输出和手动测试输出。修复加一个手动模式标记合理的做法是让状态机知道谁在控制输出if (manual_mode) { /* 手动模式保留上位机设的值IDLE 不清零 */ } else { /* 序列模式按状态机输出 */ }上位机手动设电流 → 置手动模式标记IDLE 跳过清零退出手动模式比如启动序列→ 清除标记恢复安全逻辑这样安全底线还在调试也不再被静默覆盖。经验串口回显设置成功 ≠ 硬件实际输出——协议层和硬件之间隔着一层业务逻辑回显只证明命令收到了周期任务会静默覆盖手动操作——状态机、轮询这类后台逻辑调试时先搞清楚现在它在干什么安全逻辑是调试时的隐形敌人——禁用时全关这类兜底设计最容易让人误判设备坏了排查这类问题最快的办法禁用后台任务测一次。禁掉序列再设电流如果立刻有输出——问题就实锤了。实测对比直接设电流100ms内被IDLE清掉测不到输出 | 加手动模式标记设值保留调试一次过有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。下一篇脚本明明写对了为什么就是匹配不到\r\n 和 \n 的坑——跨平台脚本的行尾陷阱