DSP28335实现两路PWM输出,可调占空比及频率

1、硬件电路设计

采用28335开发板上的直流电机驱动模块对应的EPWM2A/B两路输出来实现电机调速功能。

为实现直接使用开发板进行调速而不使用外接H桥模块,设计为EPWM2B始终输出低电平(即占空比为0),EPWM2A输出指定占空比的10KHZ的PWM波。

 2、程序设计(计算原理见本人之前的文章),通过在主函数中调用EPWM初始化函数,并写入入口参数(即EPWMA/B的占空比)来实现直流电机的调速。

epwm.c代码

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "epwm.h"

void EPWM2_Init(float DA,float DB)
{
    //使能ePWM 外设时钟及失能时基模块时钟
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//禁用ePWM中的TBCLK
    SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;//使能ePWM2时钟
    EDIS;

    //开启ePWM 对应GPIO 时钟及初始化配置
    InitEPwm2Gpio();//EPWM2A对应GPIO2,EPWM2B对应GPIO3

    //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=DB*3750;//设置比较器B值,若设置为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.ETSEL.bit.INTSEL = 2;//EPwm中断条件为CTR=PRD
    EPwm2Regs.ETSEL.bit.INTEN = 1;//EPwm中断使能
    EPwm2Regs.ETPS.bit.INTPRD = 1;//事件分频寄存器,每发生一次事件,中断一次

    //5、死区设置
    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

    //6、使能时基计数器时钟
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;
}

 epwm.h代码

#ifndef EPWM_H_
#define EPWM_H_

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"

void EPWM2_Init(float DA,float DB);

#endif

main.c代码

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"

#include "leds.h"
#include "CpuTimers.h"
#include "epwm.h"

void main()
{

    InitSysCtrl();
    DINT;

    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    EPWM2_Init(0.8,0);//括号中的数分别为EPwmA、B的占空比

}

3、完整工程

  • 5
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现按键可比固定频率PWM输出,可以结合定时器和外部中断来实现。下面是一个示例代码: ```c #include <reg51.h> sbit PWM_OUT = P1^0; // PWM输出口 sbit KEY = P3^2; // 按键口 unsigned int duty_cycle = 32768; // 比,初始值为50% unsigned int period = 65536; // PWM周期,固定为1秒 void init_timer() { TMOD |= 0x01; // 设置定时器0为模式1 TH0 = 0xFC; // 设置定时器0的初始值 TL0 = 0x00; TR0 = 1; // 启动定时器0 } void init_interrupt() { IT0 = 1; // 设置外部中断0为下降沿触发 EX0 = 1; // 允许外部中断0 EA = 1; // 全局中断使能 } void pwm_output() { CCAP0H = CCAP0L = duty_cycle >> 8; // 设置比 while(1) { if(TF0 == 1) // 定时器0溢出,需要重新设置计数器 { TF0 = 0; TH0 = 0xFC; TL0 = 0x00; PWM_OUT = ~PWM_OUT; // 反转PWM输出口的电平 } } } void main() { init_timer(); init_interrupt(); while(1) { pwm_output(); } } void key_interrupt() interrupt 0 { if(KEY == 0) // 按键按下 { duty_cycle += 8192; // 增加比 if(duty_cycle > period) duty_cycle = period; // 比不能大于周期 } } ``` 在上面的代码中,我们使用定时器0来实现PWM输出,可以通过修改TL0的值来PWM输出频率,同时使用外部中断0来实现按键可比。当按键按下时,我们会增加比的值,如果比大于PWM周期,就将比设置为PWM周期。在PWM输出的过程中,我们不断检测定时器0是否溢出,如果溢出就重新设置计数器并反转PWM输出口的电平,从而实现PWM输出。需要注意的是,如果比太小,可能会导致PWM输出无法观测到,因此建议比不要小于50%。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狸花.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值