F28035 三相 SPWM程序
时间: 2024-05-07 11:19:07 浏览: 144
基于DSP28335的SPWM生成程序.zip_DSP28335 SPWM_DSP28335spwm_TMS320F28335_
5星 · 资源好评率100%
以下是一个基于F28035的三相SPWM程序示例:
```
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define PWM_FREQ 20000.0f // PWM频率为20kHz
#define PWM_TBPRD (150000000.0f / (2.0f * PWM_FREQ)) // PWM周期
#define MAX_DUTY_CYCLE 0.95f // 最大占空比为95%
#define PI 3.14159265358979323846f
float32 sin_table[256] = { 0 };
void InitEPwm1(void);
void InitEPwm2(void);
void InitEPwm3(void);
void InitSystem(void);
void InitSineTable(void);
float32 sinf(float32 x);
void main(void)
{
InitSystem();
InitEPwm1();
InitEPwm2();
InitEPwm3();
InitSineTable();
while (1)
{
// 程序主循环
}
}
void InitEPwm1(void)
{
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 计数器为上下计数模式
EPwm1Regs.TBPRD = PWM_TBPRD; // 设置PWM周期
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 不使用相位补偿
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟分频为1
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 时钟分频为1
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 当计数器等于CMPA时,EPWM1A输出高电平
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 当计数器等于CMPA时,EPWM1A输出低电平
EPwm1Regs.CMPA.half.CMPA = PWM_TBPRD / 2.0f; // 设置初始占空比为50%
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 影子寄存器模式
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 当计数器计数到0时,加载CMPA的值
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // 影子寄存器模式
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // 当计数器计数到0时,加载CMPB的值
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 开启死区时间
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 死区时间为正极性
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 死区时间应用于EPWMxA和EPWMxB端口
EPwm1Regs.DBRED = 50; // 死区时间为1.33us
EPwm1Regs.DBFED = 50; // 死区时间为1.33us
}
void InitEPwm2(void)
{
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 计数器为上下计数模式
EPwm2Regs.TBPRD = PWM_TBPRD; // 设置PWM周期
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 不使用相位补偿
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟分频为1
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 时钟分频为1
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // 当计数器等于CMPA时,EPWM2A输出高电平
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 当计数器等于CMPA时,EPWM2A输出低电平
EPwm2Regs.CMPA.half.CMPA = PWM_TBPRD / 2.0f; // 设置初始占空比为50%
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 影子寄存器模式
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 当计数器计数到0时,加载CMPA的值
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // 影子寄存器模式
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // 当计数器计数到0时,加载CMPB的值
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 开启死区时间
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 死区时间为正极性
EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 死区时间应用于EPWMxA和EPWMxB端口
EPwm2Regs.DBRED = 50; // 死区时间为1.33us
EPwm2Regs.DBFED = 50; // 死区时间为1.33us
}
void InitEPwm3(void)
{
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 计数器为上下计数模式
EPwm3Regs.TBPRD = PWM_TBPRD; // 设置PWM周期
EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 不使用相位补偿
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟分频为1
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 时钟分频为1
EPwm3Regs.AQCTLA.bit.CAU = AQ_SET; // 当计数器等于CMPA时,EPWM3A输出高电平
EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 当计数器等于CMPA时,EPWM3A输出低电平
EPwm3Regs.CMPA.half.CMPA = PWM_TBPRD / 2.0f; // 设置初始占空比为50%
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 影子寄存器模式
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 当计数器计数到0时,加载CMPA的值
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // 影子寄存器模式
EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // 当计数器计数到0时,加载CMPB的值
EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 开启死区时间
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 死区时间为正极性
EPwm3Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 死区时间应用于EPWMxA和EPWMxB端口
EPwm3Regs.DBRED = 50; // 死区时间为1.33us
EPwm3Regs.DBFED = 50; // 死区时间为1.33us
}
void InitSystem(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
}
void InitSineTable(void)
{
int i;
for (i = 0; i < 256; i++)
{
sin_table[i] = sinf(2.0f * PI * ((float32)i / 256.0f));
}
}
float32 sinf(float32 x)
{
float32 sin_value = 0.0f;
float32 x2 = x * x;
sin_value += -1.66666667e-01f * x2;
x2 *= x;
sin_value += 8.33333333e-03f * x2;
x2 *= x;
sin_value += -1.98412698e-04f * x2;
x2 *= x;
sin_value += 2.75573192e-06f * x2;
x2 *= x;
sin_value += -2.50521084e-08f * x2;
x2 *= x;
sin_value += 1.60590438e-10f * x2;
return sin_value;
}
```
此程序使用EPWM1、EPWM2、EPWM3三个模块实现三相SPWM输出。其中,PWM周期为20kHz,最大占空比为95%。程序中还定义了一个256个元素的正弦表,用于生成SPWM波形。在InitSineTable函数中,使用了泰勒级数的方法计算正弦值。在程序主循环中,可以根据具体的应用场景,调节PWM占空比,从而控制交流电机等三相负载的运转状态。
阅读全文