TI DSP 28335 ePWM实现单路带死区PWM

文章目录

  • 前言
  • 1 PWM简介
  • 2 死区简介
  • 3 ePWM模块结构原理图
  • 4 PWM 输出配置步骤:EPWM1_Init()
    • 4.1 使能ePWM外设时钟,失能时间基准TB时钟
    • 4.2 ePWM I/O 初始化配置
    • 4.3 初始化时基模块TB
    • 4.4 初始化比较模块CC
    • 4.5 初始化动作限定模块AQ
    • 4.6 初始化死区控制模块DB
    • 4.7 初始化事件触发模块ET
    • 4.8 使能时基计数器时钟
  • 5 主函数及ISR
  • 6 示波器图片
  • 总结


前言

对B站顾卫钢老师教学视频TI C2000的ePWM中的代码进行了学习。
通过调试开发板,得到符合的结果。
特此记录,加深印象~

并未涉及PWM斩波模块PC和错误联防模块TZ的配置使用。
由于现在非电气口了,只做入门学习,并未研究SPWM,日后如有接触再进行学习。


1 PWM简介

PWMPulse Width Modulation的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式,其应用领域包括测量、通信、功率控制与变换、电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器。因此,学习PWM具有十分重要的现实意义。

2 死区简介

同一桥臂上的两个开关管不能同时导通,如果同时导通,会造成电源短路。因此输入同一桥臂上的两个开关管的驱动信号必须要进行互补控制,即上臂开通,下臂须可靠截止。
确保同一桥臂上的两个管子的开通与关断的状态互补,就是确保关断的管子有效关断,一般在一个下降沿时间内,管子能够有效关断,因此同一桥臂上待开通的管子的上升沿只要滞后于另一个管子的下降沿时间即可,这个时间区域很有可能两个管子都不在导通状态,所以这个时间区域称为死区。死区的存在能够保证有效的关断管子,避免两个管子同时导通。

3 ePWM模块结构原理图

TI DSP 28335 ePWM实现单路带死区PWM_第1张图片

4 PWM 输出配置步骤:EPWM1_Init()

本文ePWM1生成用增减计数模式实现1KHz的占空比为50%的带死区时间为1us单路PWM波

4.1 使能ePWM外设时钟,失能时间基准TB时钟

	EALLOW;
	// 禁止ePWM模块同步使用时基时钟TBCLK
	SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;      
	// 使能ePWM1时钟
	SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;  
	EDIS;

4.2 ePWM I/O 初始化配置

	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;

4.3 初始化时基模块TB

	// 初始化时基模块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波,PRDHSPCLKDIVCLKDIV共同决定
本例中

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

4.4 初始化比较模块CC

	// 初始化比较模块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进行了屏蔽。

4.5 初始化动作限定模块AQ

	// 初始化动作限定模块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;          

4.6 初始化死区控制模块DB

	// 初始化死区控制模块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

死区设置示意图如下:
虚线长度即为死区TI DSP 28335 ePWM实现单路带死区PWM_第2张图片

4.7 初始化事件触发模块ET

	// 初始化事件触发模块ET
	
	// 使能产生中断信号EPWMx_INT
	EPwm1Regs.ETSEL.bit.INTEN = 1;  
	// CTR=0时产生EPWM1_INT
	EPwm1Regs.ETSEL.bit.INTSEL = 1;   
	// 每发生一次事件,产生一次中断
	EPwm1Regs.ETPS.bit.INTPRD = 1;       

4.8 使能时基计数器时钟

	EALLOW;
	// 被使能的ePWM模块同步使用时基时钟TBCLK
	SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;         
	EDIS;

5 主函数及ISR

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;
}

6 示波器图片

由图知,PWM频率为1KHz,上升沿和下降沿死区时间为1us.
TI DSP 28335 ePWM实现单路带死区PWM_第3张图片
TI DSP 28335 ePWM实现单路带死区PWM_第4张图片
TI DSP 28335 ePWM实现单路带死区PWM_第5张图片

总结

第38篇

如果三年前,我学会用DSP调死区,电赛会不会有头绪?

个人水平有限,有问题欢迎各位大神批评指正!

你可能感兴趣的:(TI,DSP,28335,个人笔记,dsp,ccs)