DSP学习笔记之EPWM
EPWM模块介绍
F28335最多有18路PWM输出,其中有6个ePWM模块由两路ePWM输出组成,分为ePWMxA和ePWMxB,这一对 PWM输出,可以配置成两路独立的单边沿 PWM 输出,或者两路独立的但互相相对称的双边沿 PWM 输出,或者一对双边沿非对称的 PWM 输出,因为每对 PWM 模块中的两个 PWM 输出均可以单独使用,所以也可以认为有12 路单路 ePWM,除此之外还有 6 个 APWM,这 6 个 APWM 通过 CAP 模块扩展配置,可以独立使用。每一组 ePWM 模块都包含以下 7 个模块:时基模块 TB、计数比较模块 CC、动作模块 AQ、死区产生模块DB、PWM 斩波模块 PC、错误联防模块 TZ、时间触发模块 ET。
子模块介绍
简单说一下PWM的生成原理,其中需要有三个寄存器:周期计算器TPR(下文也称为PRD)、计数器寄存器TCNT(下文也称为CTR)和比较寄存器CMPR。TPR决定了一个周期计数的最大值,也就决定了PWM的周期。TCNT按照时钟信号来计数,图中为增减计数模式,即从0增计数到TPR,然后再从TPR减到0,不断重复。当TCNT的值与CMPR的值相等时,PWM的电平发生变化,从而产生PWM波。改变TPR可以改变PWM的周期或者频率,改变CMPR可以改变PWM的占空比。
时基模块TB
-
功能:确定TBCLK,即与载波的周期有关(计数器为CTR)
-
工作模式:增,减,增减
-
产生事件:CTR=PRD;CTR=0
-
计数时钟:\(TBCLK = \frac{SYSCLKOUT}{2x\times2^{y}}\);其中寄存器HSPCLKDIV的值为x,分配系数为\(2x\);寄存器CLKDIV的值为y,分配系数为\(2^y\)。
对于F28335而言,SYSCLKOUT为150MHz,如果HSPCLKDIV = 0,CLKDIV = 2,则TBCLK = 37.5MHz。
-
计数模式:
-
增计数:TBCTR从0每次加1,到达TBPRD时变为0。(PWM周期 = (TBPRD+1)*TBCLK的周期)
-
减计数:TBCTR从TBPRD每次减1,到达0时变为TBPRD。(同上)
-
增减计数:TBCTR先从0增加到TBPRD,再从TBPRF减到0。(PWM周期 = 2*TBPRD*TBCLK的周期)
-
比较功能模块CC
-
输入为TB模块的值,将其与CMPA和CMPB比较,主要是影子寄存器和活动寄存器的使用。一种是直接加载,一种是CTR=PRD,CTR=ZERO加载。
-
比较寄存器CMPA和CMPB都有相应的映射寄存器,CMPA是否启用映射寄存器是由CMPCTL[SHADOWAMODE],CMP是否启用映射寄存器是由CMPCTL[SHADOWBMODE]决定,如果启用映射寄存器,可以通过通过以上寄存器选择何时将映射寄存器中的内容装在进当前寄存器。通过CMPCTL[LOADAMODE]和CMPCTL[LOADBMODE]选择何时将映射寄存器中的内容装入当前寄存器中。
动作限定模块AQ
-
关键寄存器:
寄存器名 功能 AQCTLA ePWMA动作模块控制寄存器 AQCTLB ePWMB动作模块控制寄存器 AQSFRC 动作模块软件强制寄存器 AQCSFRC 动作模块软件模拟持续 -
动作限定模块事件优先级
死区控制模块 DB
PWM 斩波模块 PC
错误联防模块 TZ
代码分析
代码配置
//1.关时基时钟(配置前一定要这么做)
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
//2.初始化GPIO引脚(选择EPWM的输出IO口)
InitEPwm2Gpio();
//3.设置同步输入脉冲触发条件(为了做后续的移相pwm控制)
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; //在Epwm2的计数器到0的时候就发一次时基同步脉冲
//4.初始化相位寄存器
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//Epwm2相位寄存器失能
EPwm2Regs.TBPHS.half.TBPHS = 0;
EPwm2Regs.TBCTR = 0x0000; // Clear counter
EPwm2Regs.TBPRD = tbprd;
//5.选择计数模式(此处选择向上计数模式)
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up向上计数模式
//6.设定时基时钟
EPwm2Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1;//0x00
EPwm2Regs.TBCTL.bit.CLKDIV=TB_DIV2;//0x01
// 7.设置寄存器操作模式(缓冲模式)
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//8.设置比较点(A和B都是在零点进行比较)
EPwm2Regs.CMPA.half.CMPA = 0; // Set compare A value
EPwm2Regs.CMPB = 0; // Set Compare B value
//9.动作模块使用
EPwm2Regs.AQCTLA.bit.ZRO = AQ_CLEAR; // Set PWM1A on Zero
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // Clear PWM1A on event A, up count
EPwm2Regs.AQCTLB.bit.ZRO = AQ_SET; // Set PWM1B on Zero
EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR; // Clear PWM1B on event B, up count
//10.最后不要忘记,把时钟再打开!!!
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Start all the timers synced
标签:EPwm2Regs,笔记,学习,计数,DSP,模块,寄存器,bit,PWM
From: https://www.cnblogs.com/filosefer/p/18163808