1、硬件电路设计
采用28335开发板上的直流电机驱动模块对应的EPWM2A/B两路输出来实现电机调速功能。
为实现直接使用开发板进行调速而不使用外接H桥模块,设计为EPWM2B始终输出低电平(即占空比为0),EPWM2A输出指定占空比的10KHZ的PWM波。
为方便观察,把一个LED的阳极接在GPIO2,阴极接GND,以亮度表示PWM占空比。(也可以把直流电机接在直流电机模块的OA/OB引脚)
2、软件设计
通过配置外部中断触发函数,实现每当按键key1按下时,PWM占空比增加0.1,最大增大到1;每当按键key2按下时,PWM占空比减小0.1,最小减到0;每当按键key3按下时,PWM占空比复位置零。
(1)epwm.c代码
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "epwm.h"
#include "key.h"
float DA=0.2;//设置EPWMA初始占空比为0.2
Uint16 Direction=0;
interrupt void epwm2_isr(void);
void EPWM2_Init(void)
{
//使能ePWM2 外设时钟及失能时基模块时钟
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//禁用ePWM中的TBCLK
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;//使能ePWM2时钟
EDIS;
//开启ePWM2 对应GPIO 时钟及初始化配置
InitEPwm2Gpio();//EPWM2A对应GPIO2,EPWM2B对应GPIO3
//指定中断向量表ISR地址/
EALLOW;
PieVectTable.EPWM2_INT = &epwm2_isr;
EDIS;
//1、时基子模块设置
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;// 禁用EPWMxSYNCO信号
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁止TBCTR加载相位
EPwm2Regs.TBPHS.half.TBPHS = 0;//相位为0
EPwm2Regs.TBCTR = 0x0000; //清除计数器
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //上下计数模式///
//时基频率TBCLK=SYSCLKOUT/(HSPCLKDIV*CLKDIV)=150/(2*1)=75MHZ
EPwm2Regs.TBCTL.bit.HSPCLKDIV=TB_DIV2;//系统150MHz2分频/
EPwm2Regs.TBCTL.bit.CLKDIV=TB_DIV1;//时钟不分频/
//向上、下计数时,Fpwm=TBCLK/(TBPRD+1)
//上下计数时:Fpwm=TBCLK/(2*TBPRD)
EPwm2Regs.TBPRD = 3750;///周期
//2、比较功能子模块设置
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;// CMPA寄存器选择直接模式
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;// CMPB寄存器选择直接模式
//设置比较器值
EPwm2Regs.CMPA.half.CMPA =(1-DA)*3750; //设置比较器A值//占空比D(A)=1-CMPA/TBPRD
EPwm2Regs.CMPB=0*3750;//设置比较器B值=DB*3750,若设置为0,则翻转后EPWMB始终输出低电平/占空比D(B)=CMPB/TBPRD
//3、动作限定模块设置
EPwm2Regs.AQCTLA.bit.CAU = 2; //CTR=CMPA增计数时,EPwmA输出高电平
EPwm2Regs.AQCTLA.bit.CAD = 1; //CTR=CMPA减计数时,EPwmA输出低电平
EPwm2Regs.AQCTLB.bit.CBU = 2; //CTR=CMPB增计数时,EPwmB输出高电平
EPwm2Regs.AQCTLB.bit.CBD = 1; //CTR=CMPB减计数时,EPwmB输出低电平
//4、死区设置
EPwm2Regs.DBCTL.bit.IN_MODE = 2;//EPwmxA为上升沿延时,EPWMxB为下降沿延时
EPwm2Regs.DBCTL.bit.POLSEL = 2;//EPWMxA不翻转,EPWMxB翻转
EPwm2Regs.DBCTL.bit.OUT_MODE = 3;//使能上升沿下降沿延时
//TDCLK频率为75MHZ,时间为1/75us,5us死区时间则把DBRED和DBFED设置为5*75=375
EPwm2Regs.DBRED =375;//上升沿死区时间5us
EPwm2Regs.DBFED =375;//下降沿死区时间5us
//5、事件中断设置
EPwm2Regs.ETSEL.bit.INTSEL = 2;//EPwm中断条件为CTR=PRD
EPwm2Regs.ETSEL.bit.INTEN = 1;//EPwm中断使能
EPwm2Regs.ETPS.bit.INTPRD = 1;//事件分频寄存器,每发生一次事件,中断一次
//使能时基计数器时钟
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
///
IER |= M_INT3;//使能CPU中断INT3
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;//使能PIE中断EPWM2_INT
EINT;//使能全局中断
ERTM;//使能实时中断
}
interrupt void epwm2_isr(void)//中断服务函数:通过key1/2/3按键控制EPWM2A的占空比
{
static unsigned char key=0;
key=KEY_Scan(0);
if(key==KEY1_PRESS)//key1按下,EPWMA占空比+0.1
{
DA+=0.1;
if(DA>=1)//设置占空比上限为1
DA=1;
}
if(key==KEY2_PRESS)//key2按下,EPWMA占空比-0.1
{
DA=DA-0.1;
if(DA<=0)//设置占空比下限为0
DA=0;
}
if(key==KEY3_PRESS)//key3按下,EPWMA占空比复位置0
{
DA=0;
}
EPwm2Regs.CMPA.half.CMPA = (1-DA)*3750;
EPwm2Regs.CMPB =0;
EPwm2Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
(2)epwm.h代码
#ifndef EPWM_H_
#define EPWM_H_
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
void EPWM2_Init(void);
#endif
(3)main.c代码
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "leds.h"
#include "CpuTimers.h"
#include "epwm.h"
#include "key.h"
void main()
{
InitSysCtrl();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
KEY_Init();
EPWM2_Init();
while(1)
{
}
}