dsp28335实现单极性spwm
时间: 2023-07-30 09:11:56 浏览: 350
DSP28335可以通过EPWM模块来实现单极性SPWM输出。下面是一个简单的DSP28335实现单极性SPWM的示例程序:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define PI 3.14159265358979323846
void InitEPwm(void);
void main(void)
{
InitSysCtrl();
InitEPwm();
float T = 1000; // PWM周期,单位为us
float f = 50; // 正弦波频率,单位为Hz
float Vdc = 24; // 直流电压,单位为V
float Vamp = Vdc / 2; // 正弦波幅值,单位为V
float theta = 0; // 正弦波相位,单位为弧度
while(1)
{
// 计算正弦波占空比
float duty = (1 + sin(theta)) * 0.5;
// 计算CMPA的值
unsigned int cmpa = (unsigned int)(duty * T);
// 设置CMPA的值
EPwm1Regs.CMPA.bit.CMPA = cmpa;
// 更新相位
theta += 2 * PI * f * T / 1000000.0;
if(theta >= 2 * PI)
{
theta -= 2 * PI;
}
}
}
void InitEPwm(void)
{
// 配置GPIO引脚
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
EDIS;
// 配置EPWM模块
EPwm1Regs.TBPRD = 1000; // 设置PWM周期为1000us
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 设置计数器为上升计数模式
EPwm1Regs.CMPA.bit.CMPA = 500; // 设置占空比为50%
EPwm1Regs.AQCTLA.bit.CAU = 2; // 当CMPA=CMPB时,EPWM输出高电平
EPwm1Regs.AQCTLA.bit.CAD = 1; // 当CMPA>CMPB时,EPWM输出低电平
EPwm1Regs.TBCTL.bit.PRDLD = 1; // 重新加载周期寄存器
EPwm1Regs.TBCTL.bit.SYNCOSEL = 0;// 不进行同步
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;// 高速时钟不分频
EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 时钟不分频
EPwm1Regs.TBCTL.bit.PHSEN = 0; // 不使用相位控制
EPwm1Regs.TBCTL.bit.PHSDIR = 0; // 不改变相位寄存器的方向
EPwm1Regs.TBCTL.bit.PRDLD = 1; // 重新加载周期寄存器
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // 禁止SOCA输出
EPwm1Regs.ETSEL.bit.SOCASEL = 0; // 不进行SOCA触发
EPwm1Regs.ETSEL.bit.INTEN = 0; // 禁止中断输出
EPwm1Regs.ETSEL.bit.INTSEL = 0; // 不进行中断触发
EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; // 立即更新CMPA寄存器
EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0; // 立即更新CMPB寄存器
EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; // 立即加载CMPA寄存器
EPwm1Regs.CMPCTL.bit.LOADBMODE = 0; // 立即加载CMPB寄存器
EPwm1Regs.CMPCTL.bit.PWMAMODE = 0; // PWM输出模式
EPwm1Regs.CMPCTL.bit.PWMBMODE = 0; // PWM输出模式
EPwm1Regs.DBCTL.bit.OUT_MODE = 3; // 死区时间保护模式
EPwm1Regs.DBCTL.bit.POLSEL = 2; // EPWM输出反相保护
EPwm1Regs.DBCTL.bit.IN_MODE = 0; // 禁止反相输入
EPwm1Regs.DBCTL.bit.HALFCYCLE = 0; // 死区时间保护模式
EPwm1Regs.DBRED = 20; // 设置死区时间
EPwm1Regs.DBFED = 20; // 设置死区时间
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 设置计数器为上升计数模式
EPwm1Regs.TBCTL.bit.SWFSYNC = 1; // 立即同步TBCTR和TBPRD
EPwm1Regs.TBCTL.bit.FREE_SOFT = 0;// EPWM停止后立即停止输出
EPwm1Regs.TBCTL.bit.PHSEN = 0; // 不使用相位控制
EPwm1Regs.TBCTL.bit.PHSDIR = 0; // 不改变相位寄存器的方向
// 使能EPWM模块
EPwm1Regs.TBCTL.bit.CTRMODE = 0x3;
}
```
在上述示例程序中,我们通过计算正弦波的占空比来实现单极性SPWM的输出。首先,我们设置PWM的周期和正弦波的频率、幅值和相位。然后,在主循环中,我们通过计算正弦波的占空比,设置CMPA的值,并更新正弦波的相位。最后,使能EPWM模块即可开始单极性SPWM输出。需要注意的是,该示例程序中的正弦波是以0度为起点的,如果需要不同的起点需要进行相应的调整。
阅读全文