8 增强型脉宽调制模块ePWM

文章目录

  • 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

8 增强型脉宽调制模块ePWM_第1张图片PWM模块的输入输出框图如下:
8 增强型脉宽调制模块ePWM_第2张图片

  • 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 时基模块的关键信号和寄存器

下表为时基模块相关寄存器
8 增强型脉宽调制模块ePWM_第3张图片CTR为TBCTR时基计数寄存器的值。
PRD为TBPRD时基周期寄存器的值。

8 增强型脉宽调制模块ePWM_第4张图片

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 增强型脉宽调制模块ePWM_第5张图片

8.11 PWM模块输出

8.11.1 单边非对称波形

ePWMxA和ePWMxB独立调制,高电平有效。

8 增强型脉宽调制模块ePWM_第6张图片

// 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 独立调制,低电平有效):
8 增强型脉宽调制模块ePWM_第7张图片

// 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不一样的地方只有在初始化的最后部分。

你可能感兴趣的:(嵌入式开发,嵌入式硬件)