NOTE 04Firmware · Architecture
数字电源控制循环中的中断、DMA 与状态机
让快速控制环、慢速任务和故障保护各自拥有清晰边界,避免所有逻辑挤进同一个中断。
数字电源固件容易从一个很短的控制中断开始,随后不断加入软启动、通信、校准、故障恢复和数据记录,最后变成一个无法预测执行时间的“大中断”。
三种不同节奏
可以先把任务按时间尺度拆成三组:
- 快速路径:采样、控制器计算、PWM 更新;
- 慢速路径:软启动斜坡、温度处理、运行统计;
- 异步路径:硬件故障、通信事件、外部唤醒。
快速路径只保留必须在当前开关周期内完成的工作。慢速任务由分频计数器或独立定时器调度,异步故障则优先把功率级带到安全状态,再交给状态机解释原因。
状态机只负责“允许什么”
typedef enum {
POWER_OFF,
POWER_PRECHECK,
POWER_SOFTSTART,
POWER_RUN,
POWER_FAULT
} power_state_t;
void power_state_step(void)
{
switch (state) {
case POWER_PRECHECK:
if (inputs_are_valid()) state = POWER_SOFTSTART;
break;
case POWER_SOFTSTART:
if (softstart_done()) state = POWER_RUN;
break;
case POWER_RUN:
if (fault_latched()) state = POWER_FAULT;
break;
default:
break;
}
}
状态机不直接承担高频控制计算。它决定某一阶段允许哪些动作、目标值如何变化,以及出现异常后能否恢复。
避免共享数据失控
ISR 与后台任务之间交换数据时,优先使用固定大小的快照、双缓冲或单向消息。不要让多个执行上下文同时修改同一个大型结构体。
对于配置参数,可以在后台完成校验后一次性切换指针;对于测量数据,可以由 ISR 写入当前缓冲区,后台只读取已经封闭的上一帧。
这种结构并不复杂,但能显著提高代码审查、时序测量和故障复现的确定性。