C2000-F280025C
C2000™ 微控制器专为实时控制而设计,TI提供适合不同应用各个性能等级和价位的低延迟实时控制。您可以将 C2000 实时 MCU 与氮化镓 (GaN) IC 和碳化硅 (SiC) 功率器件配合使用,从而发挥其全部功能。适当搭配使用可帮助您攻克高开关频率、高功率密度等设计难题(以上抄自TIC2000官网)。
以前接触信息叫TI-C2000为DSP,认为DSP运算相比ARM在计算上更快。仔细了解TI已经把C2000归为MCU了。C2000入门款F280025C DMIPS为100主频100M相比之下STM32 专门为数字电源设计的G系列的入门款 G431已经做到了DMIPS为213主频170M,ST-G431应该在价格上相比TI还是有优势。(希望国产越来越好)
F280025C - EPWM应用
EPWM用于电机控制、电源控制,通过发波可以方便进行控制mos管。下图使用LTSPICE,进行逆变器仿真其中逆变所需的SPWM通过比较器和门电路产生。DSP就可以通过计算三角载波与正弦波进行调制,使用epwm模块很方便产生SPWM波产生逆变器所需的spwm波。
F280025C - EPWM结构
TI的DSP的EPWM外设由8个子模块构成。
- Time-Base (TB) Submodule ,时基模块用于提供EPWM的“心跳”,管理计数模式,设置事件触发的频率,管理和其他EPWM同步触发与相位,后接CC模块;
- Counter-Compare (CC) Submodule,比较模块设置多通道比较值用于和计数值进行比较,后接AQ模块用于触发比较事件,后接ET模块用于触发中断;
- Action-Qualifier (AQ) Submodule,用于设置EPWM输出状态,触发源有CC模块,T1,T2,软件触发;
- Dead-Band Generator (DB) Submodule ,死区模块,用于控制OUTX的死区;
- PWM Chopper (PC) Submodule,对第一个脉冲宽度的设置和后续占空比的调整
- Trip-Zone (TZ) Submodule ,用于在系统异常和特殊事件关断EPWM输出;
- Event-Trigger (ET) Submodule, 用于接收TB和CC和DC事件,去触发中断和ADC;
- Digital Compare Submodule ,用于接收COMP,GPIO,interrupt controller signals,TZ1~3,ECC。触发TZ,TB,ET模块;
以下为F280025-EPWM模块的结构框图。
TB模块
TB模块结构如下图所示。
从图中可以知道:
-
EPWM的时钟源为SYSCLK可以通过TBCTL寄存器配置HSPCLKDIV和CLKDIV对系统时钟进行分频操作产生TBCLK
-
EPWM触发信号可以为SWSYNC和EPWMXSYNCI和DC模块产生的信号。SWSYNC为软件触发信号源,EPWMXSYNCI为其他epwm模块SYNCO信号源。即EPWM可以软件触发和用其他EPWM去同步触发。
-
TB模块在计算要配置TBCTL的MODE和PHSEN来配置计算模式开始计数
-
向TBRO影子寄存器写值当TBCTR与TBRO相等时产生这个信号到AQ模块。
PWM产生的三种模式 ,PWM产生的三种模式分别为:up模式、down模式、up-down模式 。以up-down为例,PWM频率计算如图所示。
TB主要配置EPWM频率,设计了excel表格可以快速计算TBRO值。
excel下载连接
基本的TB配置如下图所示,设置时钟分频,设置计算模式,设置TBRO来设置PWM频率。
//EPWM1 function Init
//EPWM TB module
EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); //选择EPWM外设,设置EPWM时钟:TBCLK = SYSCLK/(EPWM_CLOCK_DIV+HSCLOCK_DIV)
EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN); //设置EPWM计数模式
EPWM_setTimeBasePeriod(EPWM1_BASE, 1000); //设置EPWM频率
EPWM_setTimeBaseCounter(EPWM1_BASE, 0); //设置计数值为0
看看TI的库函数怎么写的,是不是如结构图所示写相应的寄存器。设置时钟频率,写了EPWMX的外设基地址,还写了TBCTL的CLKDIV位和HSPCLK位和之前结构图所示相同。
static inline void
EPWM_setClockPrescaler(uint32_t base, EPWM_ClockDivider prescaler,
EPWM_HSClockDivider highSpeedPrescaler)
{
//
// Check the arguments
//
ASSERT(EPWM_isBaseValid(base));
//
// Write to CLKDIV and HSPCLKDIV bit
//
HWREGH(base + EPWM_O_TBCTL) =
((HWREGH(base + EPWM_O_TBCTL) &
~(EPWM_TBCTL_CLKDIV_M | EPWM_TBCTL_HSPCLKDIV_M)) |
(((uint16_t)prescaler << EPWM_TBCTL_CLKDIV_S) |
((uint16_t)highSpeedPrescaler << EPWM_TBCTL_HSPCLKDIV_S)));
}
设置计数模式,写了EPWMX的外设基地址,和CTRMODE位
static inline void
EPWM_setTimeBaseCounterMode(uint32_t base, EPWM_TimeBaseCountMode counterMode)
{
//
// Check the arguments
//
ASSERT(EPWM_isBaseValid(base));
//
// Write to CTRMODE bit
//
HWREGH(base + EPWM_O_TBCTL) =
((HWREGH(base + EPWM_O_TBCTL) & ~(EPWM_TBCTL_CTRMODE_M)) |
((uint16_t)counterMode));
}
向TBRO寄存器写TBRO,这里设置TBRO没有写TBCTL的PRDLD,而默认PRDLD为0,这个TBRO值是向影子寄存器写值,直接向寄存器写值有先后顺序导致可能不同步,写影子寄存器保证多通道时序不会出错。
static inline void
EPWM_setTimeBasePeriod(uint32_t base, uint16_t periodCount)
{
//
// Check the arguments
//
ASSERT(EPWM_isBaseValid(base));
//
// Write to TBPRD bit
//
HWREGH(base + EPWM_O_TBPRD) = periodCount;
}