F280025C-EPWM

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还是有优势。(希望国产越来越好)

TI界面

在这里插入图片描述

F280025C - EPWM应用

EPWM用于电机控制、电源控制,通过发波可以方便进行控制mos管。下图使用LTSPICE,进行逆变器仿真其中逆变所需的SPWM通过比较器和门电路产生。DSP就可以通过计算三角载波与正弦波进行调制,使用epwm模块很方便产生SPWM波产生逆变器所需的spwm波。
在这里插入图片描述

F280025C - EPWM结构

TI的DSP的EPWM外设由8个子模块构成。

  1. Time-Base (TB) Submodule ,时基模块用于提供EPWM的“心跳”,管理计数模式,设置事件触发的频率,管理和其他EPWM同步触发与相位,后接CC模块;
  2. Counter-Compare (CC) Submodule,比较模块设置多通道比较值用于和计数值进行比较,后接AQ模块用于触发比较事件,后接ET模块用于触发中断;
  3. Action-Qualifier (AQ) Submodule,用于设置EPWM输出状态,触发源有CC模块,T1,T2,软件触发;
  4. Dead-Band Generator (DB) Submodule ,死区模块,用于控制OUTX的死区;
  5. PWM Chopper (PC) Submodule,对第一个脉冲宽度的设置和后续占空比的调整
  6. Trip-Zone (TZ) Submodule ,用于在系统异常和特殊事件关断EPWM输出;
  7. Event-Trigger (ET) Submodule, 用于接收TB和CC和DC事件,去触发中断和ADC;
  8. Digital Compare Submodule ,用于接收COMP,GPIO,interrupt controller signals,TZ1~3,ECC。触发TZ,TB,ET模块;
    以下为F280025-EPWM模块的结构框图。
    EPWM结构框图

TB模块

TB模块结构如下图所示。
时基模块
从图中可以知道:

  1. EPWM的时钟源为SYSCLK可以通过TBCTL寄存器配置HSPCLKDIV和CLKDIV对系统时钟进行分频操作产生TBCLK

  2. EPWM触发信号可以为SWSYNC和EPWMXSYNCI和DC模块产生的信号。SWSYNC为软件触发信号源,EPWMXSYNCI为其他epwm模块SYNCO信号源。即EPWM可以软件触发和用其他EPWM去同步触发。

  3. TB模块在计算要配置TBCTL的MODE和PHSEN来配置计算模式开始计数

  4. 向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;     
}

待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咕咕鸟bird

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值