← 全部文章
NOTE 04Firmware · Architecture

数字电源控制循环中的中断、DMA 与状态机

让快速控制环、慢速任务和故障保护各自拥有清晰边界,避免所有逻辑挤进同一个中断。

发布于 2026/08/122 分钟阅读通用公开示例

数字电源固件容易从一个很短的控制中断开始,随后不断加入软启动、通信、校准、故障恢复和数据记录,最后变成一个无法预测执行时间的“大中断”。

三种不同节奏

可以先把任务按时间尺度拆成三组:

  • 快速路径:采样、控制器计算、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 写入当前缓冲区,后台只读取已经封闭的上一帧。

这种结构并不复杂,但能显著提高代码审查、时序测量和故障复现的确定性。