对B站顾卫钢老师教学视频TI C2000的ePWM中的代码进行了学习。
通过调试开发板,得到符合的结果。
特此记录,加深印象~
并未涉及PWM斩波模块PC和错误联防模块TZ的配置使用。
由于现在非电气口了,只做入门学习,并未研究SPWM,日后如有接触再进行学习。
PWM是Pulse Width Modulation的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式,其应用领域包括测量、通信、功率控制与变换、电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器。因此,学习PWM具有十分重要的现实意义。
同一桥臂上的两个开关管不能同时导通,如果同时导通,会造成电源短路。因此输入同一桥臂上的两个开关管的驱动信号必须要进行互补控制,即上臂开通,下臂须可靠截止。
确保同一桥臂上的两个管子的开通与关断的状态互补,就是确保关断的管子有效关断,一般在一个下降沿时间内,管子能够有效关断,因此同一桥臂上待开通的管子的上升沿只要滞后于另一个管子的下降沿时间即可,这个时间区域很有可能两个管子都不在导通状态,所以这个时间区域称为死区。死区的存在能够保证有效的关断管子,避免两个管子同时导通。
本文ePWM1生成用增减计数模式实现1KHz的占空比为50%的带死区时间为1us的单路PWM波。
EALLOW;
// 禁止ePWM模块同步使用时基时钟TBCLK
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
// 使能ePWM1时钟
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;
EDIS;
EALLOW;
// EPWM1A上拉
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;
// EPWM1B上拉
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;
// EPWM1A GPIO复用
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
// EPWM1B GPIO复用
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;
EDIS;
// 初始化时基模块TB
// 禁用EPWMxSYNCO信号
EPwm1Regs.TBCTL.bit.SYNCOSEL = 3;
// 禁止TBCTR加载相位
EPwm1Regs.TBCTL.bit.PHSEN = 0;
// ePWM时基计数器的相位设为0
EPwm1Regs.TBPHS.half.TBPHS = 0;
// 选择增减计数模式
EPwm1Regs.TBCTL.bit.CTRMODE = 2;
// 高速基准时钟2分频
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;
// 基准时钟不分频
EPwm1Regs.TBCTL.bit.CLKDIV = 0;
// 清零时基计数寄存器
EPwm1Regs.TBCTR = 0x0000;
// 时基周期寄存器设为37500,以满足1KHz
EPwm1Regs.TBPRD = 37500;
对于任意给定的PWM波,PRD
由HSPCLKDIV
和CLKDIV
共同决定
本例中
TBCLK=SYSCLKOUT/(HSPCLKDIV*CLKDIV)=75MHz
采用增减计数模式的计数周期为
T=2*PRD/TBCLK=10^-3
求得
PRD=T*TBCLK/2=10^-3*75*10^6/2=37500
注:如果采用增计数或者减计数,计数周期为
T=(PRD+1)/TBCLK
// 初始化比较模块CC
// CMPA寄存器选择直接模式
EPwm1Regs.CMPCTL.bit.SHDWAMODE = 1;
// CMPB寄存器选择直接模式
EPwm1Regs.CMPCTL.bit.SHDWBMODE = 1;
// CMPA值设为18750,以实现50%占空比
EPwm1Regs.CMPA.half.CMPA = 18750;
// EPwm1Regs.CMPB = 18750;
本例中并未对CMP
的值进行修改,将CMP
设置成映射模式或直接模式并不影响。
由于TBPRD
值为37500
,为实现50%占空比,需将CMPA
设为18750
。
注:本例中只使用了CMPA
,将EPWM1A
输入进行了不同处理得到两路PWM
波。故对CMPB
进行了屏蔽。
// 初始化动作限定模块AQ
// 当CTR=CMPA且增计数时,EPWM1A输出高电平
EPwm1Regs.AQCTLA.bit.CAU = 2;
// 当CTR=CMPA且减计数时,EPWM1A输出低电平
EPwm1Regs.AQCTLA.bit.CAD = 1;
// 当CTR=CMPA且增计数时,EPWM1A输出高电平
EPwm1Regs.AQCTLB.bit.CAU = 2;
// 当CTR=CMPA且减计数时,EPWM1A输出低电平
EPwm1Regs.AQCTLB.bit.CAD = 1;
注:如果采用增计数模式,可以使用如下设置
// 当CTR=0时,EPWM1A输出高电平
EPwm1Regs.AQCTLA.bit.ZRO = 2;
// 当CTR=CMPA且增计数时,EPWM1A输出低电平
EPwm1Regs.AQCTLA.bit.CAU = 1;
// 当CTR=0时,EPWM1A输出高电平
EPwm1Regs.AQCTLB.bit.ZRO = 2;
// 当CTR=CMPA且增计数时,EPWM1A输出低电平
EPwm1Regs.AQCTLB.bit.CAU = 1;
// 初始化死区控制模块DB
// EPWM1A上升沿延时,EPWM1B下降沿延时
EPwm1Regs.DBCTL.bit.IN_MODE = 2;
// EPWM1B下降沿极性反转
EPwm1Regs.DBCTL.bit.POLSEL = 2;
// 使能上升沿和下降沿信号
EPwm1Regs.DBCTL.bit.OUT_MODE = 3;
// 实现死区1us
EPwm1Regs.DBRED = 75;
EPwm1Regs.DBFED = 75;
死区时间为1us
,一般上升沿和下降沿死区一致
Tdb=DBRED*TBCLK=10^-6
求得
DBRED=10^-6*75*10^6=75
同理,DBFED
也为75
。
// 初始化事件触发模块ET
// 使能产生中断信号EPWMx_INT
EPwm1Regs.ETSEL.bit.INTEN = 1;
// CTR=0时产生EPWM1_INT
EPwm1Regs.ETSEL.bit.INTSEL = 1;
// 每发生一次事件,产生一次中断
EPwm1Regs.ETPS.bit.INTPRD = 1;
EALLOW;
// 被使能的ePWM模块同步使用时基时钟TBCLK
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
void main()
{
// 初始化系统控制寄存器
InitSysCtrl();
// 禁止中断
DINT;
// 初始化PIE控制器
InitPieCtrl();
// 禁止CPU中断
IER = 0x0000;
// 清除CPU中断标志位
IFR = 0x0000;
// 初始化PIE中断向量表
InitPieVectTable();
// 指定中断向量表ISR地址
EALLOW;
PieVectTable.EPWM1_INT = &epwm1_isr;
EDIS;
// 初始化EPWM1
EPWM1_Init();
// 使能CPU中断INT3
IER |= M_INT3;
// 使能PIE中断EPWM1_INT
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
// 使能全局中断
EINT;
// 使能实时中断
ERTM;
while(1)
{
}
}
interrupt void epwm1_isr(void)
{
... ...
// 清除中断标志位
EPwm1Regs.ETCLR.bit.INT = 1;
// 响应同组中断
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
由图知,PWM
频率为1KHz,上升沿和下降沿死区时间为1us
.
第38篇
如果三年前,我学会用DSP调死区,电赛会不会有头绪?
个人水平有限,有问题欢迎各位大神批评指正!