DSP28335配置输出两路互补的带死区的PWM

1、硬件电路设计

EPWM2的两路PWM对应EPWM2A/EPWM2B,分别对应GPIO2/GPIO3。将两个LED的阳极分别接在GPIO2、GPIO3,阴极均接地。

2、EPWM原理(精简)

(1)定时器时间基准TBCLK=SYSCLKOUT/(HSPCLKDIV*CLKDIV)=150/(2*1)=75MHZ

(2)时基周期寄存器TBPRD

(3)“上下计数模式”的周期为“向上”或“向下”计数模式的2倍

(4)选择上下计数模式:2*TBPRD/(75*10^6)=1/Fpwm

(5)当pwm频率设置为10KHZ时,由上式计算得TBPRD=3750

(6)上下计数模式生成PWM的原理如图

(7)TBPRD已经设置好,故通过设置CMPA的值来设置占空比

(8)死区原理:先断后通,故配置EPWMA上升沿延时,EPWMB下降沿延时

(9)死区时间计算:上升沿延时时间DBRED,下降沿延时时间DBFED

DBRED/(75*10^6)=延时时间。DBFED同理。

当设置死区时间为5us时,计算得DBRED=375

3、程序设计

(1)epwm.c代码

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

void EPWM2_Init(float DA)
{
    //使能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、D(B)=1-D(A)

    //3、动作限定模块设置
    EPwm2Regs.AQCTLA.bit.CAU = 2; //CTR=CMPA增计数时,EPwmA输出高电平
    EPwm2Regs.AQCTLA.bit.CAD = 1; //CTR=CMPA减计数时,EPwmA输出低电平
    EPwm2Regs.AQCTLB.bit.CAU = 2; //CTR=CMPA增计数时,EPwmB输出高电平
    EPwm2Regs.AQCTLB.bit.CAD = 1; //CTR=CMPA减计数时,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;
}

 (2)epwm.h代码

#ifndef EPWM_H_
#define EPWM_H_

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

void EPWM2_Init(float DA);

#endif

(3)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.9);//括号中的数DA为EPwmA的占空比,EPwmB的占空比=1-DA

}

  • 9
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
在STM32F103上实现两路死区互补PWM输出的方法如下: 1. 首先,根据引用和引用,你可以使用STM32的高级定时器来实现死区PWM输出。高级定时器是专门用于生成PWM波的定时器,并且支持互补输出死区控制。 2. 配置PWM波的频率和占空比。通过设置高级定时器的预分频器和重载值,可以确定PWM波的频率。通过设置占空比寄存器,可以控制PWM波的占空比。引用中提到了配置PWM寄存器的步骤。 3. 配置PWM波的互补输出死区时间。对于互补输出,你可以通过设置高级定时器的互补输出模式来实现。对于死区时间,你可以通过设置死区寄存器来控制。 4. 配置GPIO引脚使能PWM输出。根据引用中的说明,你需要将互补输出通道的GPIO配置为复用推挽输出模式,以确保PWM波能够从相应的引脚输出。 总结起来,你需要使用STM32的高级定时器来配置和控制死区互补PWM输出,并且需要设置相应的PWM寄存器、互补输出模式和死区寄存器来实现所需的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32F103输出两路PWM波并死区](https://download.csdn.net/download/wzainyu/10729525)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [stm32 高级定时器-PWM互补输出死区时间](https://download.csdn.net/download/qq_37108937/10362359)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [[标准库]STM32F103R8T6 高级定时器--PWM输出死区互补PWM输出](https://blog.csdn.net/qq_36415628/article/details/128919371)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

狸花.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值