基于TMS320F2812的永磁同步电动机控制.docx
- 文档编号:29824166
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:20
- 大小:39.88KB
基于TMS320F2812的永磁同步电动机控制.docx
《基于TMS320F2812的永磁同步电动机控制.docx》由会员分享,可在线阅读,更多相关《基于TMS320F2812的永磁同步电动机控制.docx(20页珍藏版)》请在冰豆网上搜索。
基于TMS320F2812的永磁同步电动机控制
第7章基于TMS320F2812的永磁同步电动机控制
例1、空间矢量算法实现
SVGEN_DQ对象结构体定义
typedefstruct{
_iqUalpha;//输入:
轴参考电压
_iqUbeta;//输入:
轴参考电压
_iqTa;//输出:
参考相位a开关函数
_iqTb;//输出:
参考相位b开关函数
_iqTc;//输出:
参考相位c开关函数
void(*calc)();//函数指针
}SVGENDQ;
typedefSVGENDQ*SVGENDQ_handle;
SVGEN_DQ模块调用方法:
main()
{
}
voidinterruptperiodic_interrupt_isr()
{
svgen_dq1.Ualpha=Ualpha1;//提供输入参数:
svgen_dq1
svgen_dq1.Ubeta=Ubeta1;//提供输入参数:
svgen_dq1
svgen_dq2.Ualpha=Ualpha2;//提供输入参数:
vgen_dq2
svgen_dq2.Ubeta=Ubeta2;//提供输入参数:
svgen_dq2
svgen_dq1.calc(&svgen_dq1);//调用函数模块svgen_dq1
svgen_dq2.calc(&svgen_dq2);//调用函数模块svgen_dq2
Ta1=svgen_dq1.Ta;//访问运算结果svgen_dq1
Tb1=svgen_dq1.Tb;//访问运算结果svgen_dq1
Tc1=svgen_dq1.Tc;//访问运算结果svgen_dq1
Ta2=svgen_dq2.Ta;//访问运算结果svgen_dq2
Tb2=svgen_dq2.Tb;//访问运算结果svgen_dq2
Tc2=svgen_dq2.Tc;//访问运算结果svgen_dq2
}
为进一步了解空间矢量算法的基本原理,下面给出空间矢量模块的源代码:
voidsvgendq_calc(SVGENDQ*v)
{
_iqVa,Vb,Vc,t1,t2;
_iqsector=0;/*设相位置(sector)等于Q0*/
/*逆clarke变换*/
Va=v->Ubeta;
Vb=_IQmpy(_IQ(-0.5),v->Ubeta)+_IQmpy(_IQ(0.8660254),v->Ualfa);/*0.8660254=sqrt(3)/2*/
Vc=_IQmpy(_IQ(-0.5),v->Ubeta)-_IQmpy(_IQ(0.8660254),v->Ualfa);/*0.8660254=sqrt(3)/2*/
/*60度sector的确定*/
if(Va>_IQ(0))
sector=1;
if(Vb>_IQ(0))
sector=sector+2;
if(Vc>_IQ(0))
sector=sector+4;
/*X,Y,Z(Va,Vb,Vc)的计算*/
Va=v->Ubeta;/*X=Va*/
Vb=_IQmpy(_IQ(0.5),v->Ubeta)+_IQmpy(_IQ(0.8660254),v->Ualfa);/*Y=Vb*/
Vc=_IQmpy(_IQ(0.5),v->Ubeta)-_IQmpy(_IQ(0.8660254),v->Ualfa);/*Z=Vc*/
if(sector==1)/*sector1:
t1=Zandt2=Y(abc--->Tb,Ta,Tc)*/
{
t1=Vc;
t2=Vb;
v->Tb=_IQmpy(_IQ(0.5),(_IQ
(1)-t1-t2));/*tbon=(1-t1-t2)/2*/
v->Ta=v->Tb+t1;/*taon=tbon+t1*/
v->Tc=v->Ta+t2;/*tcon=taon+t2*/
}
elseif(sector==2)/*sector2:
t1=Yandt2=-X(abc--->Ta,Tc,Tb)*/
{
t1=Vb;
t2=-Va;
v->Ta=_IQmpy(_IQ(0.5),(_IQ
(1)-t1-t2));/*taon=(1-t1-t2)/2*/
v->Tc=v->Ta+t1;/*tcon=taon+t1*/
v->Tb=v->Tc+t2;/*tbon=tcon+t2*/
}
elseif(sector==3)/*sector3:
t1=-Zandt2=X(abc--->Ta,Tb,Tc)*/
{
t1=-Vc;
t2=Va;
v->Ta=_IQmpy(_IQ(0.5),(_IQ
(1)-t1-t2));/*taon=(1-t1-t2)/2*/
v->Tb=v->Ta+t1;/*tbon=taon+t1*/
v->Tc=v->Tb+t2;/*tcon=tbon+t2*/
}
elseif(sector==4)/*sector4:
t1=-Xandt2=Z(abc--->Tc,Tb,Ta)*/
{
t1=-Va;
t2=Vc;
v->Tc=_IQmpy(_IQ(0.5),(_IQ
(1)-t1-t2));/*tcon=(1-t1-t2)/2*/
v->Tb=v->Tc+t1;/*tbon=tcon+t1*/
v->Ta=v->Tb+t2;/*taon=tbon+t2*/
}
elseif(sector==5)/*sector5:
t1=Xandt2=-Y(abc--->Tb,Tc,Ta)*/
{
t1=Va;
t2=-Vb;
v->Tb=_IQmpy(_IQ(0.5),(_IQ
(1)-t1-t2));/*tbon=(1-t1-t2)/2*/
v->Tc=v->Tb+t1;/*tcon=tbon+t1*/
v->Ta=v->Tc+t2;/*taon=tcon+t2*/
}
elseif(sector==6)/*sector6:
t1=-Yandt2=-Z(abc--->Tc,Ta,Tb)*/
{
t1=-Vb;
t2=-Vc;
v->Tc=_IQmpy(_IQ(0.5),(_IQ
(1)-t1-t2));/*tcon=(1-t1-t2)/2*/
v->Ta=v->Tc+t1;/*taon=tcon+t1*/
v->Tb=v->Ta+t2;/*tbon=taon+t2*/
}
v->Ta=_IQmpy(_IQ
(2),(v->Ta-_IQ(0.5)));
v->Tb=_IQmpy(_IQ
(2),(v->Tb-_IQ(0.5)));
v->Tc=_IQmpy(_IQ
(2),(v->Tc-_IQ(0.5)));
}
在相位置(sector)3中的一个矢量的例子:
图相位置(sector)PWM实例及其占空比
例2、事件管理器配置
EvaRegs.T1PR=p->n_period;/*SYSTEM_FREQUENCY*1000000*T/2*/
/*初始化Timer1周期寄存器*/
/*预定标器X1(T1),ISR周期=Tx1*/
EvaRegs.T1CON.all=PWM_INIT_STATE;/*对称操作模式*/
EvaRegs.DBTCONA.all=DBTCON_INIT_STATE;
EvaRegs.ACTRA.all=ACTR_INIT_STATE;
EvaRegs.COMCONA.all=0xA200;
EvaRegs.CMPR1=p->n_period;
EvaRegs.CMPR2=p->n_period;
EvaRegs.CMPR3=p->n_period;
EALLOW;
GpioMuxRegs.GPAMUX.all|=0x003F;
例3、TMS320F2812电流及DC母线电压检测
//******************************************************************************
//TMS320F2812电流及DC母线电压检测
//文件名称:
F28XILEG_VDC.C
//******************************************************************************
#include"DSP28_Device.h"
#include"f28xileg_vdc.h"
#include"f28xbmsk.h"
#defineCPU_CLOCK_SPEED6.6667L//CPU时钟速度150MHz
#defineADC_usDELAY5000L
#defineDELAY_US(A)DSP28x_usDelay(((((longdouble)A*1000.0L)
/(longdouble)CPU_CLOCK_SPEED)-9.0L)/5.0L)
externvoidDSP28x_usDelay(unsignedlongCount);
voidF28X_ileg2_dcbus_drv_init(ILEG2DCBUSMEAS*p)
{
DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL1.all=ADC_RESET_FLAG;/*复位ADC模块*/
asm("NOP");
asm("NOP");
AdcRegs.ADCTRL3.bit.ADCBGRFDN=0x3;/*为bandgap和参考电路供电*/
DELAY_US(ADC_usDELAY);/*为ADC其他单元上电前延时*/
AdcRegs.ADCTRL3.bit.ADCPWDN=1;/*为ADC其他单元上电*/
AdcRegs.ADCTRL3.bit.ADCCLKPS=3;/*设置ADCTRL3寄存器*/
DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL1.all=ADCTRL1_INIT_STATE;/*设置ADCTRL1寄存器*/
AdcRegs.ADCTRL2.all=ADCTRL2_INIT_STATE;/*设置ADCTRL2寄存器*/
AdcRegs.ADCMAXCONV.bit.MAX_CONV=2;/*确定3个转换*/
AdcRegs.ADCCHSELSEQ1.all=p->Ch_sel;/*配置通道选择*/
EvaRegs.GPTCONA.bit.T1TOADC=1;/*设置采用Timer1UF触发ADC转换*/
}
voidF28X_ileg2_dcbus_drv_read(ILEG2DCBUSMEAS*p)
{
intdat_q15;
longtmp;
/*等待ADC转换结束*/
while(AdcRegs.ADCST.bit.SEQ1_BSY==1)
{};
dat_q15=AdcRegs.ADCRESULT0^0x8000;/*将转换结果变成Q15格式双极性数据*/
tmp=(long)(p->Imeas_a_gain*dat_q15);
p->Imeas_a=(int)(tmp>>13);
p->Imeas_a+=p->Imeas_a_offset;
p->Imeas_a*=-1;/*正向,电流流向电动机*/
dat_q15=AdcRegs.ADCRESULT1^0x8000;/*将转换结果变成Q15格式双极性数据*/
tmp=(long)(p->Imeas_b_gain*dat_q15);
p->Imeas_b=(int)(tmp>>13);
p->Imeas_b+=p->Imeas_b_offset;
p->Imeas_b*=-1;/*正向,电流流向电动机*/
dat_q15=(AdcRegs.ADCRESULT2>>1)&0x7FFF;/*将转换结果变成Q15格式双极性数据*/
tmp=(long)(p->Vdc_meas_gain*dat_q15);
p->Vdc_meas=(int)(tmp>>13);
p->Vdc_meas+=p->Vdc_meas_offset;
p->Imeas_c=-(p->Imeas_a+p->Imeas_b);
AdcRegs.ADCTRL2.all|=0x4040;/*复位排序器*/
}
例4、电动机位置检测
/******************************************************************************
//TMS320F2812电动机位置检测QEP电路初始化及应用
//文件名称:
F28XQEP.C
//******************************************************************************
#include"DSP28_Device.h"
#include"f28xqep.h"
#include"f28xbmsk.h"
voidF28X_EV1_QEP_Init(QEP*p)
{
EvaRegs.CAPCON.all=QEP_CAP_INIT_STATE;/*设置捕捉单元*/
EvaRegs.T2CON.all=QEP_TIMER_INIT_STATE;/*设置捕捉定时器*/
EvaRegs.T2PR=0xFFFF;
EvaRegs.EVAIFRC.bit.CAP3INT=1;/*清除CAP3标志*/
EvaRegs.EVAIMRC.bit.CAP3INT=1;/*使能CAP3中断*/
GpioMuxRegs.GPAMUX.all|=0x0700;/*配置捕捉单元的引脚*/
}
voidF28X_EV1_QEP_Calc(QEP*p)
{
longtmp;
p->dir_QEP=0x4000&EvaRegs.GPTCONA.all;
p->dir_QEP=p->dir_QEP>>14;
p->theta_raw=EvaRegs.T2CNT+p->cal_angle;
tmp=(long)(p->theta_raw*p->mech_scaler);/*Q0*Q26=Q26*/
tmp&=0x03FFF000;
p->theta_mech=(int)(tmp>>11);/*Q26->Q15*/
p->theta_mech&=0x7FFF;
p->theta_elec=p->pole_pairs*p->theta_mech;/*Q0*Q15=Q15*/
p->theta_elec&=0x7FFF;
}
voidF28X_EV1_QEP_Isr(QEP*p)
{
p->QEP_cnt_idx=EvaRegs.T2CNT;
EvaRegs.T2CNT=0;
p->index_sync_flag=0x00F0;
}
//******************************************************************************
//TMS320F2812电动机位置检测QEP电路初始化参数及函数定义
//文件名称:
F28XQEP.H
//******************************************************************************
#ifndef__F28X_QEP_H__
#define__F28X_QEP_H__
#include"f28xbmsk.h"
/*初始化T2CON和CAPCON*/
#defineQEP_CAP_INIT_STATE0x9004
#defineQEP_TIMER_INIT_STATE(FREE_RUN_FLAG+\
TIMER_DIR_UPDN+\
TIMER_CLK_PRESCALE_X_1+\
TIMER_ENABLE_BY_OWN+\
TIMER_ENABLE+\
TIMER_CLOCK_SRC_QEP+\
TIMER_COMPARE_LD_ON_ZERO)
/*定义QEP(正交编码电路)驱动的对象*/
typedefstruct{inttheta_elec;/*输出:
电动机电角度(Q15)*/
inttheta_mech;/*输出:
电动机机械角度(Q15)*/
intdir_QEP;/*输出:
电动机转动方向(Q0)*/
intQEP_cnt_idx;/*变量:
编码器计数(Q0)*/
inttheta_raw;/*变量:
定时器2得出的角度(Q0)*/
intmech_scaler;/*参数:
0.9999/计数最大值,计数最大值=4000(Q26)*/
intpole_pairs;/*参数:
极对数(Q0)*/
intcal_angle;/*参数:
编码器和相之间的角度偏移量(Q0)*/
intindex_sync_flag;/*输出:
Indexsyncstatus(Q0)*/
void(*init)();/*初始化函数指针*/
void(*calc)();/*计算函数指针*/
void(*isr)();/*中断程序指针*/
}QEP;
/*定义一个QEP_handle*/
typedefQEP*QEP_handle;
#defineQEP_DEFAULTS{0x0,0x0,0x0,0x0,0x0,16776,2,-2365,0x0,\
(void(*)(long))F28X_EV1_QEP_Init,\
(void(*)(long))F28X_EV1_QEP_Calc,\
(void(*)(long))F28X_EV1_QEP_Isr}
voidF28X_EV1_QEP_Init(QEP_handle);
voidF28X_EV1_QEP_Calc(QEP_handle);
voidF28X_EV1_QEP_Isr(QEP_handle);
#endif/*__F28X_QEP_H__*/
例5、TMS320F2812实现三相永磁同步电动机的磁场定向控制
//******************************************************************************
//采用TMS320F2812实现三相永磁同步电动机的磁场定向控制
//文件名称:
PMSM3_1.C
//******************************************************************************
#include"IQmathLib.h"/*包含IQmath库函数的头文件*/
#include"DSP28_Device.h"
#include"pmsm3_1.h"
#include"parameter.h"
#include"build.h"
//函数声明
interruptvoidEvaTimer1(void);
interruptvoidEvaTimer2(void);
//全局变量定义
floatVd_testing=0;/*Vdtesting(pu)*/
floatVq_testing=0.25;/*Vqtesting(pu)*/
floatId_ref=0;/*Idreference(pu)*/
floatIq_ref=0.4;/*Iqreference(pu)*/
floatspeed_ref=0.2;/*Speedreference(pu)*/
floatT=0.001/ISR_FREQUENCY;/*Sampingperiod(sec),seeparameter.h*/
intisr_ticker=0;
intpwmdac_ch1=0;
intpwmdac_ch2=0;
intpwmdac_ch3=0;
volatileintenable_flg=0;
intlockrtr_flg=1;
intspeed_loop_ps=10;//速度环定标器
intspeed_loop_count=1;//速度环计数器
CLARKEclarke1=CLARKE_DEFAULTS;
PARKpark1=PARK_DEFAULTS;
IPARKipark1=IPARK_DEFAULTS;
PIDREG3pid1_id=PIDREG3_DEFAULTS;
PIDREG3pid1_iq=PIDREG3_DEFAULTS;
PIDREG3pid1_spd=PIDREG3_DEFAULTS;
PWMGENpwm1=PWMGEN_DEFAULTS;
PWMDACpwmdac1=PWMDAC_DEFAULTS;
SVGENDQsvgen_dq1=SVGENDQ_DEFAULTS;
QEPqep1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 TMS320F2812 永磁 同步电动机 控制