TI公司官网源代码基于TMS320F2812的永磁同步电动机空间矢量控制的算法实现.docx

上传人:牧羊曲112 文档编号:3167022 上传时间:2023-03-11 格式:DOCX 页数:21 大小:43.44KB
返回 下载 相关 举报
TI公司官网源代码基于TMS320F2812的永磁同步电动机空间矢量控制的算法实现.docx_第1页
第1页 / 共21页
TI公司官网源代码基于TMS320F2812的永磁同步电动机空间矢量控制的算法实现.docx_第2页
第2页 / 共21页
TI公司官网源代码基于TMS320F2812的永磁同步电动机空间矢量控制的算法实现.docx_第3页
第3页 / 共21页
TI公司官网源代码基于TMS320F2812的永磁同步电动机空间矢量控制的算法实现.docx_第4页
第4页 / 共21页
TI公司官网源代码基于TMS320F2812的永磁同步电动机空间矢量控制的算法实现.docx_第5页
第5页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《TI公司官网源代码基于TMS320F2812的永磁同步电动机空间矢量控制的算法实现.docx》由会员分享,可在线阅读,更多相关《TI公司官网源代码基于TMS320F2812的永磁同步电动机空间矢量控制的算法实现.docx(21页珍藏版)》请在三一办公上搜索。

1、TI公司官网源代码基于TMS320F2812的永磁同步电动机空间矢量控制的算法实现往链点点通共享资源,了解更多请登录www.WL 第7章 基于TMS320F2812的永磁同步电动机控制 例1、空间矢量算法实现 SVGEN_DQ对象结构体定义 typedef struct _iq Ualpha; / 输入:a轴参考电压 _iq Ubeta; / 输入:b轴参考电压 _iq Ta; / 输出:参考相位a开关函数 _iq Tb; / 输出:参考相位b开关函数 _iq Tc; / 输出:参考相位c开关函数 void (*calc); / 函数指针 SVGENDQ; typedef SVGENDQ *S

2、VGENDQ_handle; SVGEN_DQ模块调用方法: main void interrupt periodic_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_d

3、q1 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 为进一步了解空间矢量算法的基本原理,下面给出

4、空间矢量模块的源代码: void svgendq_calc(SVGENDQ *v) _iq Va,Vb,Vc,t1,t2; 1 _iq sector = 0; /*设相位置等于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

5、(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.86602

6、54),v-Ualfa); /* Z = Vc */ if (sector=1) /* sector 1: t1=Z and t2=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 */ else if (sector=2) /* sector 2: t1=Y and t2=-X (abc - Ta

7、,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 */ else if (sector=3) /* sector 3: t1=-Z and t2=X (abc - Ta,Tb,Tc) */ t1 = -Vc; t2 = Va; v-Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2); /* taon

8、 = (1-t1-t2)/2 */ v-Tb = v-Ta+t1; /* tbon = taon+t1 */ v-Tc = v-Tb+t2; /* tcon = tbon+t2 */ else if (sector=4) /* sector 4: t1=-X and t2=Z (abc - Tc,Tb,Ta) */ 2 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; /*

9、taon = tbon+t2 */ else if (sector=5) /* sector 5: t1=X and t2=-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 */ else if (sector=6) /* sector 6: t1=-Y and t2=-Z (abc - Tc,

10、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中的一个矢量的例

11、子: CMPR3tconCMPR2tbonCMPR1taontPWM1tPWM3tPWM5T0/4T6/2T6/2T0/4T0/4T6/4T4/4T0/4tV0V6V4V7V7V6V4V0T 图 相位置(sector)PWM 实例及其占空比 3 例2、事件管理器配置 EvaRegs.T1PR = p-n_period; /* SYSTEM_FREQUENCY*1000000*T/2 /*初始化Timer 1周期寄存器 /* 预定标器X1 (T1),ISR周期= T x 1 EvaRegs.T1CON.all = PWM_INIT_STATE; /* 对称操作模式 EvaRegs.DBTCONA

12、.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

13、_VDC.C /* #include DSP28_Device.h #include f28xileg_vdc.h #include f28xbmsk.h #define CPU_CLOCK_SPEED 6.6667L / CPU时钟速度150MHz #define ADC_usDELAY 5000L #define DELAY_US(A) DSP28x_usDelay(long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) - 9.0L) / 5.0L) extern void DSP28x_usDelay(unsigned lon

14、g Count); void F28X_ileg2_dcbus_drv_init(ILEG2DCBUSMEAS *p) DELAY_US(ADC_usDELAY); asm( NOP ); asm( NOP ); AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; DELAY_US(ADC_usDELAY); AdcRegs.ADCTRL3.bit.ADCPWDN = 1; AdcRegs.ADCTRL3.bit.ADCCLKPS = 3; DELAY_US(ADC_usDELAY); AdcRegs.ADCTRL1.all = ADCTRL1_INIT_STATE; 4

15、 /*设置ADCTRL1寄存器 */ /*为ADC其他单元上电 */ /* 设置ADCTRL3寄存器 */ /* 为bandgap和参考电路供电*/ /*为ADC其他单元上电前延时 */ /*复位ADC模块 */ AdcRegs.ADCTRL1.all = ADC_RESET_FLAG; AdcRegs.ADCTRL2.all = ADCTRL2_INIT_STATE; AdcRegs.ADCMAXCONV.bit.MAX_CONV = 2; AdcRegs.ADCCHSELSEQ1.all = p-Ch_sel; EvaRegs.GPTCONA.bit.T1TOADC = 1; void F

16、28X_ileg2_dcbus_drv_read(ILEG2DCBUSMEAS *p) int dat_q15; long tmp; /* 等待ADC转换结束*/ while (AdcRegs.ADCST.bit.SEQ1_BSY = 1) ; /*设置ADCTRL2寄存器 */ /* 确定3个转换 /* 配置通道选择 */ */ /*设置采用Timer1 UF触发ADC转换 */ dat_q15 = AdcRegs.ADCRESULT00x8000; /*将转换结果变成Q15格式双极性数据*/ tmp = (long)(p-Imeas_a_gain*dat_q15); p-Imeas_a =

17、 (int)(tmp13); p-Imeas_a += p-Imeas_a_offset; p-Imeas_a *= -1; dat_q15 = AdcRegs.ADCRESULT10x8000; /*将转换结果变成Q15格式双极性数据*/ tmp = (long)(p-Imeas_b_gain*dat_q15); p-Imeas_b = (int)(tmp13); p-Imeas_b += p-Imeas_b_offset; p-Imeas_b *= -1; dat_q15 = (AdcRegs.ADCRESULT21)&0x7FFF; /*将转换结果变成Q15格式双极性数据*/ tmp =

18、 (long)(p-Vdc_meas_gain*dat_q15); p-Vdc_meas = (int)(tmp13); p-Vdc_meas += p-Vdc_meas_offset; p-Imeas_c = -(p-Imeas_a + p-Imeas_b); AdcRegs.ADCTRL2.all |= 0x4040; /* 复位排序器 */ /*正向,电流流向电动机*/ /*正向,电流流向电动机*/ 例4、电动机位置检测 /* / TMS320F2812电动机位置检测 QEP电路初始化及应用 5 / 文件名称:F28XQEP.C /* #include DSP28_Device.h #i

19、nclude f28xqep.h #include f28xbmsk.h void F28X_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; EvaRegs.EVAIMRC.bit.CAP3INT = 1; GpioMuxRegs.GPAMUX.all |= 0x0700; vo

20、id F28X_EV1_QEP_Calc(QEP *p) long tmp; p-dir_QEP = 0x4000&EvaRegs.GPTCONA.all; p-dir_QEP = p-dir_QEP14; p-theta_raw = EvaRegs.T2CNT + p-cal_angle; tmp = (long)(p-theta_raw*p-mech_scaler); tmp &= 0x03FFF000; p-theta_mech = (int)(tmp11); p-theta_mech &= 0x7FFF; /* Q0*Q15 = Q15 */ p-theta_elec = p-pole

21、_pairs*p-theta_mech; p-theta_elec &= 0x7FFF; void F28X_EV1_QEP_Isr(QEP *p) p-QEP_cnt_idx = EvaRegs.T2CNT; EvaRegs.T2CNT = 0; p-index_sync_flag = 0x00F0; /* Q26 - Q15 */ /* Q0*Q26 = Q26 */ /*清除CAP3标志*/ /*使能CAP3中断*/ /*配置捕捉单元的引脚*/ 6 /* / TMS320F2812电动机位置检测 QEP电路初始化参数及函数定义 / 文件名称:F28XQEP.H /* #ifndef _F

22、28X_QEP_H_ #define _F28X_QEP_H_ #include f28xbmsk.h /* 初始化T2CON和CAPCON */ #define QEP_CAP_INIT_STATE 0x9004 #define QEP_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 (正交编码电路) 驱

23、动的对象 */ typedef struct int theta_elec; /* 输出: 电动机电角度(Q15) int theta_mech; /* 输出: 电动机机械角度(Q15) int dir_QEP; /* 输出: 电动机转动方向 (Q0) int QEP_cnt_idx; /* 变量: 编码器计数(Q0) int theta_raw; /* 变量: 定时器2得出的角度(Q0) int mech_scaler; /* 参数: 0.9999/计数最大值,计数最大值 = 4000 (Q26) int pole_pairs; /* 参数: 极对数(Q0) int cal_angle; /

24、* 参数: 编码器和相之间的角度偏移量 (Q0) int index_sync_flag; /* 输出: Index sync status (Q0) void (*init); /* 初始化函数指针 void (*calc); /* 计算函数指针 void (*isr); /* 中断程序指针 QEP; /* 定义一个QEP_handle */ typedef QEP *QEP_handle; #define QEP_DEFAULTS 0x0, 0x0,0x0,0x0,0x0,16776,2,-2365,0x0, (void (*)(long)F28X_EV1_QEP_Init, (void

25、(*)(long)F28X_EV1_QEP_Calc, (void (*)(long)F28X_EV1_QEP_Isr void F28X_EV1_QEP_Init(QEP_handle); void F28X_EV1_QEP_Calc(QEP_handle); void F28X_EV1_QEP_Isr(QEP_handle); */ */ */ */ */ */ */ */ */ */ */ */ 7 #endif /* _F28X_QEP_H_ */ 例5、TMS320F2812实现三相永磁同步电动机的磁场定向控制 /* / 采用TMS320F2812实现三相永磁同步电动机的磁场定向控制

26、 / 文件名称:PMSM3_1.C /* #include IQmathLib.h /* 包含IQmath库函数的头文件 */ #include DSP28_Device.h #include pmsm3_1.h #include parameter.h #include build.h / 函数声明 interrupt void EvaTimer1(void); interrupt void EvaTimer2(void); / 全局变量定义 float Vd_testing = 0; float Vq_testing = 0.25; float Id_ref = 0; float Iq_r

27、ef = 0.4; float speed_ref = 0.2; int isr_ticker = 0; int pwmdac_ch1=0; int pwmdac_ch2=0; int pwmdac_ch3=0; volatile int enable_flg=0; int lockrtr_flg=1; int speed_loop_ps = 10; int speed_loop_count = 1; CLARKE clarke1 = CLARKE_DEFAULTS; PARK park1 = PARK_DEFAULTS; IPARK ipark1 = IPARK_DEFAULTS; PIDR

28、EG3 pid1_id = PIDREG3_DEFAULTS; / 速度环定标器 / 速度环计数器 /* Vd testing (pu) */ /* Vq testing (pu) */ /* Id reference (pu) */ /* Iq reference (pu) */ /* Speed reference (pu) */ float T = 0.001/ISR_FREQUENCY; /* Samping period (sec), see parameter.h */ 8 PIDREG3 pid1_iq = PIDREG3_DEFAULTS; PIDREG3 pid1_spd =

29、 PIDREG3_DEFAULTS; PWMGEN pwm1 = PWMGEN_DEFAULTS; PWMDAC pwmdac1 = PWMDAC_DEFAULTS; SVGENDQ svgen_dq1 = SVGENDQ_DEFAULTS; QEP qep1 = QEP_DEFAULTS; SPEED_MEAS_QEP speed1 = SPEED_MEAS_QEP_DEFAULTS; DRIVE drv1 = DRIVE_DEFAULTS; RMPCNTL rc1 = RMPCNTL_DEFAULTS; RAMPGEN rg1 = RAMPGEN_DEFAULTS; ILEG2DCBUSM

30、EAS ilg2_vdc1 = ILEG2DCBUSMEAS_DEFAULTS; / 主函数 void main(void) / 系统初始化 InitSysCtrl; / HISPCP 设置 EALLOW; SysCtrlRegs.HISPCP.all = 0x0000; /* SYSCLKOUT/1 */ EDIS; / 禁止并清除所有CPU中断: DINT; IER = 0x0000; IFR = 0x0000; / 初始化Pie到默认状态 InitPieCtrl; / 初始化PIE相量表 InitPieVectTable; / 初始化EVA 定时器1: /设置定时器1寄存器 (EV A)

31、 EvaRegs.GPTCONA.all = 0; /等待使能标志位 while (enable_flg=0) 9 / 使能定时器1的下溢中断 EvaRegs.EVAIMRA.bit.T1UFINT = 1; EvaRegs.EVAIFRA.bit.T1UFINT = 1; / 使能CAP3中断 EvaRegs.EVAIMRC.bit.CAP3INT = 1; EvaRegs.EVAIMRC.bit.CAP3INT = 1; ; / 重新分配中断向量 / 使能PIE组2的中断6 PieCtrlRegs.PIEIER2.all = M_INT6; / 使能PIE组3的中断7 PieCtrlReg

32、s.PIEIER3.all = M_INT7; / 使能CPU INT2和INT3: / 使能全局中断和最高优先级适时调试事件管理器功能: /* pwmdac1.pwmdac_period = 2500; /* PWM频率 = 30 kHz */ pwmdac1.PWM_DAC_IPTR0 = &pwmdac_ch1; pwmdac1.PWM_DAC_IPTR1 = &pwmdac_ch2; pwmdac1.PWM_DAC_IPTR2 = &pwmdac_ch3; qep1.init(&qep1); drv1.init(&drv1); pwmdac1.init(&pwmdac1); 模块初始化

33、 */ pwm1.n_period = SYSTEM_FREQUENCY*1000000*T/2; /* 预定标器X1 (T1), ISR周期 = T x 1 */ pwm1.init(&pwm1); EINT; /使能全局中断INTM ERTM; / 使能适时调试中断DBGM IER |= (M_INT2 | M_INT3); EALLOW; PieVectTable.T1UFINT = &EvaTimer1; PieVectTable.CAPINT3 = &EvaTimer2; EDIS; 10 ilg2_vdc1.init(&ilg2_vdc1); /* 初始化SPEED_FRQ模块 *

34、/ speed1.K1 = _IQ21(1/(BASE_FREQ*T); speed1.K2 = _IQ(1/(1+T*2*PI*30); /* 低通截至频率 = 30 Hz */ speed1.K3 = _IQ(1)-speed1.K2; speed1.rpm_max = 120*BASE_FREQ/P; /*初始化RAMPGEN模块 */ rg1.step_angle_max = _IQ(BASE_FREQ*T); /* 初始化PID_REG3 Id调节模块 */ pid1_id.Kp_reg3 = _IQ(0.75); pid1_id.Ki_reg3 = _IQ(T/0.0005); p

35、id1_id.Kd_reg3 = _IQ(0/T); pid1_id.Kc_reg3 = _IQ(0.2); pid1_id.pid_out_max = _IQ(0.30); pid1_id.pid_out_min = _IQ(-0.30); /* 初始化PID_REG3 Iq调节模块 */ pid1_iq.Kp_reg3 = _IQ(0.75); pid1_iq.Ki_reg3 = _IQ(T/0.0005); pid1_iq.Kd_reg3 = _IQ(0/T); pid1_iq.Kc_reg3 = _IQ(0.2); pid1_iq.pid_out_max = _IQ(0.95); pi

36、d1_iq.pid_out_min = _IQ(-0.95); /*初始化PID_REG3 速度调节模块 */ pid1_spd.Kp_reg3 = _IQ(1); pid1_spd.Ki_reg3 = _IQ(T*speed_loop_ps/0.1); pid1_spd.Kd_reg3 = _IQ(0/(T*speed_loop_ps); pid1_spd.Kc_reg3 = _IQ(0.2); pid1_spd.pid_out_max = _IQ(1); pid1_spd.pid_out_min = _IQ(-1); / 循环等待 for(;); interrupt void EvaTim

37、er1(void) isr_ticker+; 11 if (speed_loop_count=speed_loop_ps) else speed_loop_count+; pwm1.Mfunc_c1 = (int)_IQtoIQ15(svgen_dq1.Ta); /* Mfunc_c1 is in Q15 */ ilg2_vdc1.read(&ilg2_vdc1); park1.ds = clarke1.ds; park1.qs = clarke1.qs; park1.ang = speed1.theta_elec; park1.calc(&park1); qep1.calc(&qep1); clarke1.as = _IQ15toIQ(long)ilg2_vdc1.Imeas_a); clarke1.bs = _IQ15toIQ(long)ilg2_vdc1.Imeas_b); clarke1.calc(&clarke1); pw

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号