写一个基于F28335的单极性SPWM的c语言代码
时间: 2024-05-10 13:18:39 浏览: 215
单相单极性SPWM逆变电路simulink仿真.rar
以下是一个基于F28335的单极性SPWM的C语言代码示例:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define PWM_FREQ 20000 // PWM频率为20kHz
#define PWM_TBPRD ((float)SYSCLK / (PWM_FREQ * 2)) // 计算PWM周期
void InitEPwm1(void)
{
EPwm1Regs.TBPRD = (int)(PWM_TBPRD - 1); // 设置PWM周期
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上下计数模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁止相位补偿
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟不分频
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 正常时钟不分频
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 禁止同步输出
EPwm1Regs.CMPA.bit.CMPA = (int)(PWM_TBPRD / 2); // 设置占空比为50%
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 影子寄存器模式
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 寄存器加载计数器为0
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 当计数器计数到CMPA时,EPWMxA引脚输出高电平
EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR; // 当计数器计数到0时,EPWMxA引脚输出低电平
}
void InitEPwm2(void)
{
EPwm2Regs.TBPRD = (int)(PWM_TBPRD - 1); // 设置PWM周期
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上下计数模式
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁止相位补偿
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟不分频
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 正常时钟不分频
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 禁止同步输出
EPwm2Regs.CMPA.bit.CMPA = (int)(PWM_TBPRD / 2); // 设置占空比为50%
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 影子寄存器模式
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 寄存器加载计数器为0
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // 当计数器计数到CMPA时,EPWMxA引脚输出高电平
EPwm2Regs.AQCTLA.bit.ZRO = AQ_CLEAR; // 当计数器计数到0时,EPWMxA引脚输出低电平
}
void SPWM(float Vref)
{
float Vmax = 3.3; // 电压最大值为3.3V
float theta = 0; // 定义相位角theta
float delta_theta = 2 * M_PI / 360; // 定义相位差delta_theta
float Va, Vb, Vc;
Va = Vmax * sin(theta);
Vb = Vmax * sin(theta - 120 * M_PI / 180);
Vc = Vmax * sin(theta + 120 * M_PI / 180);
EPwm1Regs.CMPA.bit.CMPA = (int)(PWM_TBPRD * (Va / Vref) / 2); // 设置EPWM1的占空比
EPwm2Regs.CMPA.bit.CMPA = (int)(PWM_TBPRD * (Vb / Vref) / 2); // 设置EPWM2的占空比
EPwm3Regs.CMPA.bit.CMPA = (int)(PWM_TBPRD * (Vc / Vref) / 2); // 设置EPWM3的占空比
theta += delta_theta; // 更新相位角theta
if (theta >= 2 * M_PI) { // 判断是否超过360度
theta = 0;
}
}
void main(void)
{
InitSysCtrl(); // 初始化系统时钟
InitEPwm1(); // 初始化EPWM1
InitEPwm2(); // 初始化EPWM2
InitEPwm3(); // 初始化EPWM3
while (1) {
SPWM(2); // 以2V的参考电压进行SPWM
}
}
```
这个代码示例中,三个EPWM模块分别控制三个电路开关管的开关状态,以实现单极性SPWM。`SPWM()`函数根据当前相位角计算出三相电压,并将其转换为三个EPWM模块的占空比。主函数中不断调用`SPWM()`函数,以实现SPWM的连续输出。需要注意的是,该代码示例中的所有参数均为理论值,实际应用时需要根据具体的硬件参数进行调整。
阅读全文