Ø 空间向量PWM(SVPWM)是指一个三相功率变换器中六个功率三极管的一种功率开关电路,是变频技术的关键核心技术之一,应用非常广泛。三相交流电动机绕组产生的电流的谐波失真最小。它还提供了比正弦波调制方式更有效的供电电压的使用。目前SVPWM量控制方法是交流伺服电机和UPS电源应用最广泛的控制方法。本应用程序实例将为网友提供一个无刷直流马达SVPWM程序实例,希望起到抛砖引玉效应,可以充分了解如何使用事件管理器来实现SVPWM的应用方法。实际量产产品应用对于SVPWM算法的推导、开关向量的选择也是是非常至关重要的关键。
Ø无刷直流马达三相功率反相换流器原理结果图:
图中A1、B1、和C1是提供给电动机绕组的电压。六个功率三极管由DTPHx和我DTPHx_(x﹦a、b和c)控制。当上部的三极管导通时(DTPHx﹦1),下部的三极管关断(DTPHx﹦0)。这样通过上部三极管的开关状态(Q1和Q5)或者等效地说,DTPHx(x﹦a、b和c)的状态,就可以算出提供给电动机的电压Uout。
//文件名: DSP281xSVPwm.c
//
//DSP281x SVPWM波形产生程序,使用事件管理器A
//
// 该程序设置EVA定时器(TIMER1,TIMER2,TIMER13 and TIMER4)
// 实现了SVPWM波形输出
#include 〝DSP281x_Device.h 〞 //DSP281x_Headerfile include file
#include 〝DSP281x_examples.h 〞 //DSP281x_examples include file
#include 〝stdio.h 〞
#include 〝math.h 〞
#include 〝float.h 〞
#define NX 404
#define PI 3.1415925
//全局变量
float M﹦0.8;
int k0﹦0,h1﹦0;
unsigned int n﹦0;
float q,l,j;
//在本例程中使用函数类型陈述
void zkb();
void int_eva(vold);
interrupt void eva_T1UFINT_ISR(void);
void main(void)
{
//系统初始化
initsysctrl();
//初始化GPAMUX
EALLOW;
// 使能PWM引脚
gpiomuxregs.GPAMUX.all ﹦0x00FF; // EVA PWM 1-6 引脚
EDIS;
//禁止全局CPU中断
DINT;
//初始化PIE控制寄存器
initpiectrl();
//初始化PIE控制向量表
initpievecttable();
eallow; //使能定时器1下益中断
pievecttable.T1UFINF﹦&eva_T1UFINT_ISR;
EDIS
IER|﹦M_INT2; //开中断2
pievctr1regs.PIEIER2.bit.INTx6﹦1; //开下益中断
while (n<﹦NX)
{
q﹦(n:+0.75) //为消除偶次谐波,减少谐波角度出发,选择从A相3/4周期进行采样
q﹦q*2*PI;
q/﹦405;
j﹦sin(q);
1﹦1875*(1+M*j); //M为调制比
if(1>﹦375&1<﹦3375 //计算占空比表达式
a[n]﹦1;
else
{
if(1>﹦3375);
a[n]﹦375;
}
n﹦n+1;
}
//初始化外设EVA
init_eva();
//用户代码
Evaregs.T1CON.all﹦evaregs.T1CON.all|0x0040; //启动定时器1
for(;;)
}
vold init_eva()
{
///初始化EVA
evaregs.ACTRA.all﹦0x0666;
evaregs.DBTCONA.all﹦0x0000; //禁止死区
evaregs.COMCONA.all﹦0xa600; //使能比较操作
//EVAIMRA(EVA的中断屏蔽寄存器A).T1UIINT(通用定时器1的下溢中断使能)
evaregs.EVAIFRA.all﹦0x0200;
evaregs.EVAIFRA.all﹦0x0000;
evaregs.EVAIFRA.all﹦0x0000;
//EVAIMRA(EVA的中断屏蔽寄存器.T1UIINT(通用定时器1的下溢中断使能)
evaregs.EVAIFRA.all﹦0xffff;
evaregs.EVAIFRB.all﹦0xffff;
evaregs.EVAIFRC.all﹦0xffff;
evaregs.CMPR1﹦0;
evaregs.CMPR2﹦0;
evaregs.CMPR3﹦0;
evaregs.GPTCONA.all﹦0x0041;
//周期必须大于最大的正弦表格值
evaregs.T1PR﹦3750; //timer1 period PWM 载波周期为65536个定标的定时器时钟周期
evaregs.T1CNT﹦937; //timer1计数器
evaregs.T1CON.all﹦0x0b4e; //选择模式产生PWM波10
EINT;
return;
}
interrupt void eva_T1UFINT_ISR(void) //EVA下溢中断
{
int h2;
int flag;
flag﹦(evaregs.EVAIFRA.all)&0x0200; //T1UFINT中断标志位置1
if(flag!﹦0x0200)
{
EINT;
return;
}
else
{
if(k0<﹦NK)
{
h1﹦k0+135; //B相标表达式
if(h1>﹦404)h1﹦h1-404;
h2﹦k0+270; //C相标表达式
if(h2>﹦404)h2﹦h2-404;
evaregs.CMPR1﹦a[k0];
evaregs.CMPR2﹦a[k1]; //更新比较寄存器2的值
evaregs.CMPR3﹦a[k2]; //更新比较寄存器3的值
k0﹦k0+1;
}
else
{
}
evaregs.EVAIMRA.bit,T1UFINT﹦1 //清除中断屏蔽标志
evaregs.EVAIMRA.bit,T1UFINT﹦1 //清除中断使能标志
piectrlregs.PIEACK.all﹦0x0002; //响应同组中断
EINI; //开全局中断
}
//﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦
//end
//﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦
用户1724555 2014-12-16 13:28
用户1687253 2013-9-27 09:41
用户413797 2012-10-16 12:07
用户377235 2012-9-22 11:34
用户593939 2012-9-21 22:53
用户593939 2012-9-21 22:47