文章目录
- 8.1 PWM控制基本原理
- 8.2 PWM结构及组成单位
- 8.3 时基模块TB
- 8.3.1 ePWM时基模块作用
- 8.3.2 时基模块的关键信号和寄存器
- 8.5 动作模块 AC
- 8.5.1 动作模块的作用
- 8.5.2 动作模块关键信号与寄存器
- 8.11 PWM模块输出
- 8.11.1 单边非对称波形
- 8.11.2 单边非对称脉冲波形
8.1 PWM控制基本原理
PWM简称脉冲宽度调制。作用在于通过脉冲宽度调制,等效获得期望波形。
- 按照正弦规律变化和正弦波等效的PWM波形,也成SPWM(sinusoidal)波形。
8.2 PWM结构及组成单位
F28335中每个ePWM都是一个独立的小模块。
- 每个ePWM模块由两路ePWM输出组成,分别为ePWMxA何ePWMxB。
这一对PWM输出可以配置成三种
- 两路独立的单边沿PWM输出(相同)
- 两路独立的但互相对称的双边沿PWM输出(相反)
- 一对双边沿非对称的PWM输出(互相独立)
共有6对这样的ePWM模块。每对PWM模块中的两个输出可以单独使用,所以可以认为有12路单独的ePWM。
此外,F28335还有6个APWM,通过CAP模块扩展配置,可以独立使用,因此F28335最多可以有18路PWM输出。
每组ePWM模块都包含一下7个模块:
- 时基模块TB
- 计数比较模块CC
- 动作模块AQ
- 死去产生模块DB
- PWM斩波模块PC
- 错误联防模块TZ
- 时间触发模块ET
PWM模块的输入输出框图如下:
- PWM的输出引脚和GPIO引脚复用。
同步信号分为时间基础同步输入ePWMxSYNCI和ePWMxSYNCO。
- 同步信号可以将ePWM各个模块的所有单元联系在一起。
- 每个ePWM模块都可以根据需要被配置为使用同步信号或者忽略它。
- 时钟同步输入和输出信号仅由ePWM1引脚产生。
- ePWM1的同步输出也与第一个捕获模块eCAP1的同步信号相连接。
错误联防信号TZ1-TZ6。
- 当过流等发生时,TZ信号可以触发故障。
- 每个模块都可以被配置为使用或者忽略错误联防信号。
ADC启动信号。
- ePWMSOCA和ePWMSOCB
- 每个ePWM模块都有两个ADC转换启动信号。
- 任何一个ePWM模块都可以启动ADC
外设总线:
- 外设总线宽度为32位
- 允许16位和32位的数据通过外设总线写入ePWM模块寄存器。
8.3 时基模块TB
8.3.1 ePWM时基模块作用
8.3.2 时基模块的关键信号和寄存器
下表为时基模块相关寄存器
CTR为TBCTR时基计数寄存器的值。
PRD为TBPRD时基周期寄存器的值。
8.5 动作模块 AC
指定在发生时基和比较事件时 PWM 输出引脚的动作:
- 不采取任何动作【输出信号保持为当前设置值。但该事件仍然可以触发中断和 ADC 开始转换】
- ePWMxA 和/或 ePWMxB 输出信号变为高电平
- ePWMxA 和/或 ePWMxB 输出信号变为低电平
- ePWMxA 和/或 ePWMxB 输出信号来回切换(Toggle)
通过软件控制来强制改变 PWM 输出信号的状态【由 AQSFRC 和 AQCSFRC 两个寄存器控制】
通过软件来配置和控制 PWM 死区
8.5.1 动作模块的作用
1、AQ 模块根据下列事件来产生动作(置高、拉低、翻转):
CTR = PRD :时基模块来的信号,时基计数器的值等于周期寄存器的值;
CTR = ZERO :时基模块来的信号,时基计数器的值等于 0 ;
CTR = CMPA :计数器-比较模块(CC)来的信号,时基计数器的值等于比较寄存器 A 的值;
CTR = CMPB :计数器-比较模块(CC)来的信号,时基计数器的值等于比较寄存器 B 的值。
2、管理以上事件发生后 PWM 的输出极性;
3、针对时基计数器递增或递减时提供独立的动作控制。
8.5.2 动作模块关键信号与寄存器
8.11 PWM模块输出
8.11.1 单边非对称波形
ePWMxA和ePWMxB独立调制,高电平有效。
// Initialization Time
// = = = = = = = = = = = = = = = = = = = = = = = =
EPwm1Regs.TBPRD = 600; // 设定PWM周期为601个TBCLK时钟周期 Period = 601 TBCLK counts
EPwm1Regs.CMPA.half.CMPA = 350; // 比较器A为350个TBCLK Compare A = 350 TBCLK counts
EPwm1Regs.CMPB = 200; // 比较器A为200个TBCLK Compare B = 200 TBCLK counts
EPwm1Regs.TBPHS = 0; // 相位寄存器清零 Set Phase register to zero
EPwm1Regs.TBCTR = 0; // 时基计数器清零 clear TB counter
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //递增计数模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁止相位控制 Phase loading disabled
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; //禁止同步信号
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLK
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zero
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; //当CTR = ZERO 时,将 ePWMA 拉高
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; //当CTR = CAU 时,将 ePWMA 置低
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; //当CTR = ZERO 时,将 ePWMB 拉高
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; //当CTR = CBU 时,将 ePWMB 置低
//
// Run Time
// = = = = = = = = = = = = = = = = = = = = = = = =
EPwm1Regs.CMPA.half.CMPA = Duty1A; // adjust duty for output EPWM1A
EPwm1Regs.CMPB = Duty1B; //调整ePWMB的占空比
8.11.2 单边非对称脉冲波形
递增计数,单边非对称波形,(ePWMxA 和 ePWMxB 独立调制,低电平有效):
// Initialization Time
// = = = = = = = = = = = = = = = = = = = = = = = =
EPwm1Regs.TBPRD = 600; // Period = 601 TBCLK counts
EPwm1Regs.CMPA.half.CMPA = 350; // Compare A = 350 TBCLK counts
EPwm1Regs.CMPB = 200; // Compare B = 200 TBCLK counts
EPwm1Regs.TBPHS = 0; // Set Phase register to zero
EPwm1Regs.TBCTR = 0; // clear TB counter
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Phase loading disabled
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on TBCTR = Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on TBCTR = Zero
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR; //CTR = PRD 时,将 ePWMA 置低
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; //CTR = CAU 时,将 ePWMA 拉高
EPwm1Regs.AQCTLB.bit.PRD = AQ_CLEAR; //CTR = PRD 时,将 ePWMB 置低
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; //CTR = CBU 时,将 ePWMB 拉高
//
// Run Time
// = = = = = = = = = = = = = = = = = = = = = = = =
EPwm1Regs.CMPA.half.CMPA = Duty1A; // adjust duty for output EPWM1A
EPwm1Regs.CMPB = Duty1B; // adjust duty for output EPWM1B
与11.1不一样的地方只有在初始化的最后部分。