tms320f28335三相逆变程序
时间: 2023-10-25 07:10:10 浏览: 196
tms320f28335是德州仪器(TI)公司推出的一款数字信号处理器(DSP),常用于控制系统的设计和实现。
下面是一个简单的三相逆变程序,可以作为参考:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
// 定义三相逆变电路的引脚
#define INV_PWM1 0x0001
#define INV_PWM2 0x0002
#define INV_PWM3 0x0004
// 定义三相电压和电流的ADC通道
#define INV_ADC_VA 0
#define INV_ADC_VB 1
#define INV_ADC_VC 2
#define INV_ADC_IA 3
#define INV_ADC_IB 4
#define INV_ADC_IC 5
// 定义三相逆变器的PWM频率和周期
#define INV_PWM_FREQ 20000 // 20kHz
#define INV_PWM_PERIOD (SYSCLK_FREQ / (2 * INV_PWM_FREQ))
// 定义PI控制器的参数
#define INV_KP 0.5
#define INV_KI 0.1
// 定义相位延迟
#define INV_PHASE_DELAY (INV_PWM_PERIOD / 6)
// 定义三相电压和电流的结构体
typedef struct {
int16 Va;
int16 Vb;
int16 Vc;
int16 Ia;
int16 Ib;
int16 Ic;
} INV_ADC_DATA;
// 定义PI控制器的结构体
typedef struct {
float Kp;
float Ki;
float Ref;
float Fdb;
float Err;
float PreErr;
float Integ;
float Out;
} INV_PI;
// 声明三相逆变器的函数
void inv_init(void);
void inv_run(void);
void inv_pwm(uint16 pwm1, uint16 pwm2, uint16 pwm3);
void inv_adc_read(INV_ADC_DATA *data);
void inv_pi_init(INV_PI *pi, float kp, float ki);
void inv_pi_run(INV_PI *pi);
// 初始化三相逆变器
void inv_init(void)
{
// 初始化PWM引脚
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // PWM1
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // PWM2
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // PWM3
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
// 初始化ADC模块
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // 内部参考电压
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // 打开内部参考电压缓冲区
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // 打开内部参考电压缓冲区
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // 打开ADC电源
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // 打开ADC模块
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; // 转换完成后立即触发中断
AdcRegs.ADCCTL1.bit.TEMPCONV = 0; // 关闭温度传感器
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 0; // 关闭ADC时钟分频
AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1; // 打开ADC同步采样
AdcRegs.ADCCTL2.bit.SIGNALMODE = 0; // 单次采样模式
AdcRegs.ADCCTL2.bit.EPWM_SOCA_SEQ1 = 1; // EPWMxSOCA触发SEQ1
AdcRegs.ADCSOC0CTL.bit.CHSEL = INV_ADC_VA;
AdcRegs.ADCSOC1CTL.bit.CHSEL = INV_ADC_VB;
AdcRegs.ADCSOC2CTL.bit.CHSEL = INV_ADC_VC;
AdcRegs.ADCSOC3CTL.bit.CHSEL = INV_ADC_IA;
AdcRegs.ADCSOC4CTL.bit.CHSEL = INV_ADC_IB;
AdcRegs.ADCSOC5CTL.bit.CHSEL = INV_ADC_IC;
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // EPWM1SOCA触发
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5; // EPWM1SOCA触发
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5; // EPWM1SOCA触发
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 5; // EPWM1SOCA触发
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 5; // EPWM1SOCA触发
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = 5; // EPWM1SOCA触发
AdcRegs.ADCSOC0CTL.bit.ACQPS = 14; // ACQPS = 15个ADC时钟周期
AdcRegs.ADCSOC1CTL.bit.ACQPS = 14; // ACQPS = 15个ADC时钟周期
AdcRegs.ADCSOC2CTL.bit.ACQPS = 14; // ACQPS = 15个ADC时钟周期
AdcRegs.ADCSOC3CTL.bit.ACQPS = 14; // ACQPS = 15个ADC时钟周期
AdcRegs.ADCSOC4CTL.bit.ACQPS = 14; // ACQPS = 15个ADC时钟周期
AdcRegs.ADCSOC5CTL.bit.ACQPS = 14; // ACQPS = 15个ADC时钟周期
// 初始化PI控制器
inv_pi_init(&inv_pi_va, INV_KP, INV_KI);
inv_pi_init(&inv_pi_vb, INV_KP, INV_KI);
inv_pi_init(&inv_pi_vc, INV_KP, INV_KI);
inv_pi_init(&inv_pi_ia, INV_KP, INV_KI);
inv_pi_init(&inv_pi_ib, INV_KP, INV_KI);
inv_pi_init(&inv_pi_ic, INV_KP, INV_KI);
}
// 运行三相逆变器
void inv_run(void)
{
INV_ADC_DATA data;
// 读取ADC采样值
inv_adc_read(&data);
// 计算电压和电流的PI控制器输出
inv_pi_va.Ref = 0;
inv_pi_va.Fdb = data.Va;
inv_pi_vb.Ref = 0;
inv_pi_vb.Fdb = data.Vb;
inv_pi_vc.Ref = 0;
inv_pi_vc.Fdb = data.Vc;
inv_pi_ia.Ref = 0;
inv_pi_ia.Fdb = data.Ia;
inv_pi_ib.Ref = 0;
inv_pi_ib.Fdb = data.Ib;
inv_pi_ic.Ref = 0;
inv_pi_ic.Fdb = data.Ic;
inv_pi_run(&inv_pi_va);
inv_pi_run(&inv_pi_vb);
inv_pi_run(&inv_pi_vc);
inv_pi_run(&inv_pi_ia);
inv_pi_run(&inv_pi_ib);
inv_pi_run(&inv_pi_ic);
// 计算PWM输出
inv_pwm(inv_pi_va.Out, inv_pi_vb.Out, inv_pi_vc.Out);
}
// 生成三相逆变器的PWM输出
void inv_pwm(uint16 pwm1, uint16 pwm2, uint16 pwm3)
{
static uint16 cnt1 = 0, cnt2 = 0, cnt3 = 0;
// 生成PWM1
if (cnt1 < pwm1) {
GpioDataRegs.GPASET.bit.GPIO0 = 1;
} else {
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
}
cnt1 += INV_PWM_PERIOD;
if (cnt1 >= INV_PWM_PERIOD * 2) {
cnt1 -= INV_PWM_PERIOD * 2;
}
// 生成PWM2
if (cnt2 < pwm2) {
GpioDataRegs.GPASET.bit.GPIO1 = 1;
} else {
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
}
cnt2 += INV_PWM_PERIOD;
if (cnt2 >= INV_PWM_PERIOD * 2) {
cnt2 -= INV_PWM_PERIOD * 2;
}
// 生成PWM3
if (cnt3 < pwm3) {
GpioDataRegs.GPASET.bit.GPIO2 = 1;
} else {
GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;
}
cnt3 += INV_PWM_PERIOD;
if (cnt3 >= INV_PWM_PERIOD * 2) {
cnt3 -= INV_PWM_PERIOD * 2;
}
}
// 读取三相电压和电流的ADC采样值
void inv_adc_read(INV_ADC_DATA *data)
{
AdcRegs.ADCSOCFRC1.all = 0x3F; // 启动ADC采样
while (AdcRegs.ADCINTFLG.bit.ADCINT1 == 0); // 等待ADC采样完成
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除ADC中断标志位
data->Va = AdcResult.ADCRESULT0;
data->Vb = AdcResult.ADCRESULT1;
data->Vc = AdcResult.ADCRESULT2;
data->Ia = AdcResult.ADCRESULT3;
data->Ib = AdcResult.ADCRESULT4;
data->Ic = AdcResult.ADCRESULT5;
}
// 初始化PI控制器
void inv_pi_init(INV_PI *pi, float kp, float ki)
{
pi->Kp = kp;
pi->Ki = ki;
pi->Ref = 0;
pi->Fdb = 0;
pi->Err = 0;
pi->PreErr = 0;
pi->Integ = 0;
pi->Out = 0;
}
// 运行PI控制器
void inv_pi_run(INV_PI *pi)
{
pi->Err = pi->Ref - pi->Fdb;
pi->Integ += pi->Err;
pi->Out = pi->Kp * pi->Err + pi->Ki * pi->Integ;
pi->PreErr = pi->Err;
}
```
注意:上述代码仅作为参考,具体实现需要根据具体的硬件平台和应用场景进行调整。
阅读全文