2. C2000架构与实时控制关键路径

C2000系列(以TMS320F28379D为例)之所以能在电机控制、数字电源、光伏逆变等场景中把控制环路压到微秒级,关键不在于某一个模块特别快,而在于CPU、CLA、TMU、FPU、VCU、DMA、ePWM、ADC这八个角色被组织成了一条"采样—计算—输出"的确定性通路。理解这条通路,比记住各模块主频更重要。

一、八个角色在环路中的分工

先建立整体图景。ADC负责把模拟反馈量(相电流、母线电压、旋变信号)转成数字量;ePWM既产生驱动波形,又通过SOC(Start of Conversion)信号触发ADC,是整条环路的时间基准;DMA在ADC结果寄存器与RAM之间搬运数据,让CPU不必为搬运中断;CPU承担主控制算法与系统调度;CLA是可独立编程的协处理器,专门跑电流环这类高频、短小的任务;FPU、TMU、VCU则是CPU/CLA可调用的加速单元——FPU做单精度浮点,TMU做三角函数与除法,VCU做Park/Clarke变换、锁相环等复数运算。

C2000 控制环路关键路径与模块协同 ePWM 时间基准 / SOC触发 ADC 采样 + 转换 DMA 结果搬运至RAM CLA 电流环协处理器 SOC EOC 触发 加速单元(CPU / CLA 可调用) FPU 浮点 TMU 三角/除法 VCU 变换/PLL CRC/复数 CPU (C28x) 主算法 / 系统调度 CLA 结果 写回 ePWM 比较值 更新占空比 → 下一周期生效 共享 RAM / 消息寄存器 时间轴: SOC EOC DMA完成 CLA完成 PWM更新

二、控制环路延迟由哪几段构成

设ePWM周期为T_pwm,一个完整电流环的延迟T_loop大致由五段相加:

  • 采样与转换延迟T_adc:从SOC触发到ADC结果可用。F28379D的12位ADC在200MHz ADCCLK下,采样窗+转换约十余个ADCCLK,典型量级0.1~0.3μs,取决于采样窗设置。
  • 搬运延迟T_dma:DMA把结果寄存器搬到RAM,通常几个周期到几十个周期,可忽略但不可省。
  • 计算延迟T_calc:Clarke/Park、PI、反Park、SVPWM,这是最大头。用FPU+TMU+VCU后,一个电流环可压到1~2μs;若全用软件浮点或查表,可能到5μs以上。
  • 输出延迟T_out:CLA/CPU把新比较值写入ePWM影子寄存器,到下一个周期生效,存在一个PWM周期的固有延迟。
  • 调度抖动T_jitter:中断响应、优先级抢占带来的不确定性,是实时性最隐蔽的敌人。

因此T_loop ≈ T_adc + T_dma + T_calc + T_out + T_jitter。要压低环路延迟,必须逐段量化,而不是笼统地说"优化算法"。

三、协同工作机制:谁触发谁

典型配置是:ePWM1在计数器过零(或下溢)时产生SOCA,触发ADC-A采样相电流;ADC转换结束产生EOC,触发DMA把结果搬到CLA数据RAM;DMA完成触发CLA任务1;CLA执行电流环,把结果写入ePWM比较影子寄存器;下一个PWM周期开始时新占空比生效。CPU此时只处理速度环、状态机和通信,不参与高频电流环。

这种"ePWM→ADC→DMA→CLA→ePWM"的硬件触发链,把延迟从"软件轮询+中断"的不可预测,变成由硬件事件驱动的确定性通路。CPU被解放出来,抖动主要来自CLA任务本身是否超时。

四、加速单元怎么用才有效

FPU让C28x能直接做单精度浮点,省去定点Q格式的定标与溢出处理;TMU在几个周期内完成sin/cos/div/sqrt,Park变换里的三角函数不再查表;VCU提供VCRC、复数乘加、Park/Clarke的硬件辅助,配合CLA可把变换类运算进一步压缩。实践中的经验是:先让CLA独立跑电流环,再在CLA代码里显式调用TMU/VCU指令,而不是把加速单元当成"自动加速"。

判断加速是否生效,最直接的方法是看CLA任务执行时间:在CLA任务入口拉高一个GPIO、出口拉低,用示波器测脉宽。若脉宽没有随TMU/VCU的启用而下降,说明编译器没有生成对应指令,或数据未按加速单元要求对齐。

五、一个可复现的延迟测量示例

下面给出一个用于教学演示的测量配置(参数为示例值,非实测结果)。目标:测出从ePWM SOC到CLA写回比较值的端到端延迟。

// 示例:用GPIO翻转标记环路关键点(F28379D,参数为示例)
// GPIO0: SOC触发时置高
// GPIO1: CLA任务入口置高,出口置低
// GPIO2: ePWM比较值更新时置高

EPwm1Regs.TBPRD = 500;          // 示例:100MHz下 5us 周期
EPwm1Regs.ETSEL.bit.SOCASEL = 1; // 过零触发SOCA
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // 由ePWM1 SOCA触发
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 15;  // 示例采样窗

// CLA任务1:电流环
__interrupt void Cla1Task1(void){
    GpioDataRegs.GPASET.bit.GPIO1 = 1;   // 入口标记
    // Clarke / Park / PI / 反Park / SVPWM
    // 结果写入 EPwm1Regs.CMPA
    GpioDataRegs.GPACLEAR.bit.GPIO1 = 1; // 出口标记
}

用示波器同时观察GPIO0上升沿到GPIO2上升沿的时间差,即为T_adc+T_dma+T_calc+T_out的近似值;GPIO1脉宽即CLA任务执行时间。若该脉宽接近或超过PWM周期,说明电流环已无法在本周期内完成,必须降低算法复杂度或提高CLA时钟。

六、影响环路延迟的关键判断

观察现象可能原因处理方向
CLA任务脉宽接近T_pwm算法过重或未用TMU/VCU拆分任务、启用加速指令
占空比更新滞后一个周期以上影子寄存器加载时机错误检查CMPA影子加载与TBCTR同步
电流波形有低频抖动中断抖动或DMA与CLA竞争固定优先级、错开访问窗口
加速后延迟未下降编译器未生成TMU/VCU指令检查编译选项与数据对齐

把这条通路量化之后,优化就有了明确靶点:ADC采样窗、DMA搬运、CLA任务时间、ePWM影子加载,每一段都可以单独测量、单独压缩。C2000的实时性优势,正是建立在这种"每一段都可观测、可确定性触发"的架构之上。