F28035 SPWM能运行的程序
时间: 2024-05-28 16:11:01 浏览: 20
F28035是德州仪器(Texas Instruments)推出的一个基于C28x内核的数字信号控制器(DSC),可用于实现电机控制、逆变器控制、电源管理等应用。
SPWM即正弦波PWM调制技术,可以实现三相交流电机驱动控制和逆变器控制等应用。在F28035上实现SPWM的程序,需要采取以下步骤:
1. 配置GPIO口,用于控制三相电压输出的开关管的开关状态;
2. 配置EPWM模块,用于产生PWM波形,控制开关管的开关状态;
3. 实现SPWM算法,计算出三相电压的PWM占空比;
4. 将计算出的PWM占空比赋值给EPWM模块的寄存器,控制PWM波形的输出。
需要注意的是,在实现SPWM算法时,需要考虑到电机的特性以及控制策略,如电机的电感、电阻、自感等参数,以及控制方式(如FOC、DTC等)。
具体的SPWM程序实现细节可以参考TI官方提供的F28035控制器SPWM编程指南以及TI的代码库。
相关问题
F28035 SPWM程序
F28035是德州仪器(Texas Instruments)推出的一款32位微控制器,支持实时控制以及数字信号处理。SPWM(正弦PWM)是一种常用于交流电机驱动的PWM技术,它可以将直流电转换为交流电,实现电机的转速控制。
下面是一个简单的F28035 SPWM程序示例:
```c
#include "DSP28x_Project.h"
#define PWM_FREQ 20000 // PWM频率为20kHz
#define PWM_DUTY_CYCLE 0.5 // PWM占空比为50%
void InitEPwm(void);
void main(void)
{
InitSysCtrl(); // 初始化系统控制
InitGpio(); // 初始化GPIO
InitEPwm(); // 初始化EPwm
while(1)
{
}
}
void InitEPwm(void)
{
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 设置EPwm1计数器模式为向上/向下计数
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 设置EPwm1时钟分频系数为1
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 设置EPwm1高速时钟分频系数为1
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 使能EPwm1周期寄存器影子寄存器
EPwm1Regs.TBPRD = (Uint16)(SYSCLKOUT / (PWM_FREQ * 2)); // 设置EPwm1周期寄存器值,注意要乘以2
EPwm1Regs.CMPA.half.CMPA = (Uint16)(EPwm1Regs.TBPRD * PWM_DUTY_CYCLE); // 设置EPwm1比较器A的值
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 设置EPwm1上升沿事件动作为设置输出
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 设置EPwm1下降沿事件动作为清除输出
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; // 设置EPwm1上升沿事件动作为设置输出
EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR; // 设置EPwm1下降沿事件动作为清除输出
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 使能EPwm1死区发生器
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 设置EPwm1死区发生器输出极性为正极性
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 设置EPwm1死区发生器输入模式为DBA模式
EPwm1Regs.DBRED = 10; // 设置EPwm1死区发生器上升沿延时时间
EPwm1Regs.DBFED = 10; // 设置EPwm1死区发生器下降沿延时时间
}
```
上述程序中,我们初始化了EPwm1,并将其配置为SPWM模式。具体来说,我们设置了EPwm1的计数器模式、时钟分频系数、周期寄存器值、比较器A的值,以及上升沿/下降沿事件动作和死区发生器等参数。最后,在主函数中添加一个死循环,让程序一直运行下去,以保持EPwm1输出。
需要注意的是,上述程序只是一个简单的示例,实际应用中可能需要根据具体的需求进行修改。同时,为了使EPwm1输出正弦波形,我们还需要使用一些数学函数来生成正弦波的PWM波形,这里不再赘述。
F28035 三相 SPWM程序
以下是一个基于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占空比,从而控制交流电机等三相负载的运转状态。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)