ZHCABX7A May 2020 – November 2022 TMS320F280048-Q1 , TMS320F280048C-Q1 , TMS320F280049 , TMS320F280049-Q1 , TMS320F280049C , TMS320F280049C-Q1 , TMS320F28033 , TMS320F28033-Q1 , TMS320F28035 , TMS320F28035-EP , TMS320F28035-Q1 , TMS320F28053 , TMS320F28055 , TMS320F2806-Q1 , TMS320F28065 , TMS320F28069 , TMS320F28069-Q1 , TMS320F28069F , TMS320F28069F-Q1 , TMS320F28069M , TMS320F28069M-Q1 , TMS320F28075 , TMS320F28075-Q1 , TMS320F28076 , TMS320F28374D , TMS320F28374S , TMS320F28375D , TMS320F28375S , TMS320F28375S-Q1 , TMS320F28376D , TMS320F28376S , TMS320F28377D , TMS320F28377D-EP , TMS320F28377D-Q1 , TMS320F28377S , TMS320F28377S-Q1 , TMS320F28378D , TMS320F28378S , TMS320F28379D , TMS320F28379D-Q1 , TMS320F28379S , TMS320F28384D , TMS320F28384D-Q1 , TMS320F28384S , TMS320F28384S-Q1 , TMS320F28386D , TMS320F28386D-Q1 , TMS320F28386S , TMS320F28386S-Q1 , TMS320F28388D , TMS320F28388S , TMS320F28P650DH , TMS320F28P650DK , TMS320F28P650SH , TMS320F28P650SK , TMS320F28P659DH-Q1 , TMS320F28P659DK-Q1 , TMS320F28P659SH-Q1
大多数实时控制算法用于对系统执行三个主要任务:激励、采样和控制。对系统进行激励涉及更新 PWM 寄存器,对系统进行采样涉及访问 ADC 结果寄存器,而对系统进行控制涉及控制环路数学计算。CLA 作为独立的数学处理器,还能够访问用于控制应用的所有主要外设(如 EPWM、ADC、ECAP、EQEP、CMPSS 等)的寄存器。因此,CLA 可以执行采样和驱动以及计算控制逻辑,并且能够在没有任何 C28x 参与的情况下独立执行整个控制任务。
“cla_ex4_pwm_control”示例展示了如何通过 CLA 直接控制 PWM 信号输出。此示例的方框图如图 2-1 所示。在此示例中,EPWM1 配置为以 100KHz 的固定频率在两个通道上生成互补信号,而 EPWM4 配置为以 10KHz 的频率触发周期性的 CLA 控制任务。CLA 任务 1 采用一个非常简单的逻辑来改变 EPWM1 输出的占空比,方法是针对每次迭代将其增加 0.1,同时还需要将其保持在 0.1-0.9 的范围内。下面的代码序列说明了如何在 CLA 任务中按原样使用现有的 C28x driverlib API(作为 C2000Ware 的一部分提供)来更新 EPWM 寄存器,从而避免与 CLA 相关的任何额外软件开发工作。CLA 任务也可以采用类似的方式访问其他共享外设的主要寄存器。请注意,无法在 .cla 文件的开头初始化 CLA 全局变量,因此,该示例还说明了在专用 CLA 任务(CLA 任务 8,在初始化时由 C28x 软件触发)内初始化所有 CLA 全局变量的系统方法。
__attribute__((interrupt)) void Cla1Task1 ( void )
{
//
// Uncomment this to debug the CLA while connected to the debugger
//
__mdebugstop();
//
// Write to the COMPA register to realize a particular duty value
//
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A,
(uint16_t)(duty * EPWM1_PERIOD + 0.5f));
//
// Update duty value and use the limiter
//
duty += 0.1f;
duty = (duty > 0.9f) ? 0.1f : duty;
//
// Clear EPWM4 interrupt flag so that next interrupt can come in
//
EPWM_clearEventTriggerInterruptFlag(EPWM4_BASE);
}