【VC++开源代码栏目提醒】:网学会员在VC++开源代码频道为大家收集整理了“TI公司官网源代码基于TMS320F2812的永磁同步电动机空间矢量控制的算法实现 PDF - 技术总结“提供大家参考,希望对大家有所帮助!
1 第7章 基于TMS320F2812的永磁同步电动机控制 例1、空间矢量算法实现 SVGEN_DQ对象结构体定义 typedef struct _iq Ualpha // 输入轴参考电压 _iq Ubeta // 输入轴参考电压 _iq Ta // 输出参考相位a开关函数 _iq Tb // 输出参考相位b开关函数 _iq Tc // 输出参考相位c开关函数 void calc // 函数指针 SVGENDQ typedef SVGENDQ SVGENDQ_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.calcampsvgen_dq1 // 调用函数模块svgen_dq1 svgen_dq2.calcampsvgen_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 为进一步了解空间矢量算法的基本原理下面给出空间矢量模块的源代码 void svgendq_calcSVGENDQ v _iq VaVbVct1t2 _iq sector 0 /设相位置sector等于Q0 / /逆clarke变换 / Va v-gtUbeta Vb _IQmpy_IQ-0.5v-gtUbeta _IQmpy_IQ0.8660254v-gtUalfa / 0.8660254 sqrt3/2 / 2 Vc _IQmpy_IQ-0.5v-gtUbeta - _IQmpy_IQ0.8660254v-gtUalfa / 0.8660254 sqrt3/2 / / 60度sector的确定/ if Vagt_IQ0 sector 1 if Vbgt_IQ0 sector sector 2 if Vcgt_IQ0 sector sector 4 / XYZ VaVbVc的计算 / Va v-gtUbeta / X Va / Vb _IQmpy_IQ0.5v-gtUbeta _IQmpy_IQ0.8660254v-gtUalfa / Y Vb / Vc _IQmpy_IQ0.5v-gtUbeta - _IQmpy_IQ0.8660254v-gtUalfa / Z Vc / if sector1 / sector 1: t1Z and t2Y abc ---gt TbTaTc / t1 Vc t2 Vb v-gtTb _IQmpy_IQ0.5_IQ1-t1-t2 / tbon 1-t1-t2/2 / v-gtTa v-gtTbt1 / taon tbont1 / v-gtTc v-gtTat2 / tcon taont2 / else if sector2 / sector 2: t1Y and t2-X abc ---gt TaTcTb / t1 Vb t2 -Va v-gtTa _IQmpy_IQ0.5_IQ1-t1-t2 / taon 1-t1-t2/2 / v-gtTc v-gtTat1 / tcon taont1 / v-gtTb v-gtTct2 / tbon tcont2 / else if sector3 / sector 3: t1-Z and t2X abc ---gt TaTbTc / t1 -Vc t2 Va v-gtTa _IQmpy_IQ0.5_IQ1-t1-t2 / taon 1-t1-t2/2 / v-gtTb v-gtTat1 / tbon taont1 / v-gtTc v-gtTbt2 / tcon tbont2 / else if sector4 / sector 4: t1-X and t2Z abc ---gt TcTbTa / t1 -Va t2 Vc v-gtTc _IQmpy_IQ0.5_IQ1-t1-t2 / tcon 1-t1-t2/2 / 3 v-gtTb v-gtTct1 / tbon tcont1 / v-gtTa v-gtTbt2 / taon tbont2 / else if sector5 / sector 5: t1X and t2-Y abc ---gt TbTcTa / t1 Va t2 -Vb v-gtTb _IQmpy_IQ0.5_IQ1-t1-t2 / tbon 1-t1-t2/2 / v-gtTc v-gtTbt1 / tcon tbont1 / v-gtTa v-gtTct2 / taon tcont2 / else if sector6 / sector 6: t1-Y and t2-Z abc ---gt TcTaTb / t1 -Vb t2 -Vc v-gtTc _IQmpy_IQ0.5_IQ1-t1-t2 / tcon 1-t1-t2/2 / v-gtTa v-gtTct1 / taon tcont1 / v-gtTb v-gtTat2 / tbon taont2 / v-gtTa _IQmpy_IQ2v-gtTa-_IQ0.5 v-gtTb _IQmpy_IQ2v-gtTb-_IQ0.5 v-gtTc _IQmpy_IQ2v-gtTc-_IQ0.5 在相位置sector3中的一个矢量的例子 T0/4T6/2T6/2T0/4T0/4T6/4T4/4T0/4V0V6V4V7V7V6V4V0TtttPWM1PWM3PWM5tCMPR1CMPR3CMPR2tcontbontaon 图 相位置sectorPWM 实例及其占空比 例2、事件管理器配置 EvaRegs.T1PR p-gtn_period / SYSTEM_FREQUENCY1000000T/2 / 4 /初始化Timer 1周期寄存器 / / 预定标器X1 T1ISR周期 T x 1 / 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-gtn_period EvaRegs.CMPR2 p-gtn_period EvaRegs.CMPR3 p-gtn_period EALLOW GpioMuxRegs.GPAMUX.all 0x003F 例3、TMS320F2812电流及DC母线电压检测 // // TMS320F2812电流及DC母线电压检测 // 文件名称F28XILEG_VDC.C // include quotDSP28_Device.hquot include quotf28xileg_vdc.hquot include quotf28xbmsk.hquot define CPU_CLOCK_SPEED 6.6667L // CPU时钟速度150MHz define ADC_usDELAY 5000L define DELAY_USA DSP28x_usDelaylong double A 1000.0L / long doubleCPU_CLOCK_SPEED - 9.0L / 5.0L extern void DSP28x_usDelayunsigned long Count void F28X_ileg2_dcbus_drv_initILEG2DCBUSMEAS p DELAY_USADC_usDELAY AdcRegs.ADCTRL1.all ADC_RESET_FLAG /复位ADC模块 / asmquot NOP quot asmquot NOP quot AdcRegs.ADCTRL3.bit.ADCBGRFDN 0x3 / 为bandgap和参考电路供电/ DELAY_USADC_usDELAY /为ADC其他单元上电前延时 / AdcRegs.ADCTRL3.bit.ADCPWDN 1 /为ADC其他单元上电 / AdcRegs.ADCTRL3.bit.ADCCLKPS 3 / 设置ADCTRL3寄存器 / DELAY_USADC_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-gtCh_sel / 配置通道选择 / 5 EvaRegs.GPTCONA.bit.T1TOADC 1 /设置采用Timer1 UF触发ADC转换 / void F28X_ileg2_dcbus_drv_readILEG2DCBUSMEAS p int dat_q15 long tmp / 等待ADC转换结束/ while AdcRegs.ADCST.bit.SEQ1_BSY 1 dat_q15 AdcRegs.ADCRESULT00x8000 /将转换结果变成Q15格式双极性数据/ tmp longp-gtImeas_a_gaindat_q15 p-gtImeas_a inttmpgtgt13 p-gtImeas_a p-gtImeas_a_offset p-gtImeas_a -1 /正向电流流向电动机/ dat_q15 AdcRegs.ADCRESULT10x8000 /将转换结果变成Q15格式双极性数据/ tmp longp-gtImeas_b_gaindat_q15 p-gtImeas_b inttmpgtgt13 p-gtImeas_b p-gtImeas_b_offset p-gtImeas_b -1 /正向电流流向电动机/ dat_q15 AdcRegs.ADCRESULT2gtgt1amp0x7FFF /将转换结果变成Q15格式双极性数据/ tmp longp-gtVdc_meas_gaindat_q15 p-gtVdc_meas inttmpgtgt13 p-gtVdc_meas p-gtVdc_meas_offset p-gtImeas_c -p-gtImeas_a p-gtImeas_b AdcRegs.ADCTRL2.all 0x4040 / 复位排序器 / 例4、电动机位置检测 / // TMS320F2812电动机位置检测 QEP电路初始化及应用 // 文件名称F28XQEP.C // include quotDSP28_Device.hquot include quotf28xqep.hquot 6 include quotf28xbmsk.hquot void F28X_EV1_QEP_InitQEP 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 /配置捕捉单元的引脚/ void F28X_EV1_QEP_CalcQEP p long tmp p-gtdir_QEP 0x4000ampEvaRegs.GPTCONA.all p-gtdir_QEP p-gtdir_QEPgtgt14 p-gttheta_raw EvaRegs.T2CNT p-gtcal_angle tmp longp-gttheta_rawp-gtmech_scaler / Q0Q26 Q26 / tmp amp 0x03FFF000 p-gttheta_mech inttmpgtgt11 / Q26 -gt Q15 / p-gttheta_mech amp 0x7FFF p-gttheta_elec p-gtpole_pairsp-gttheta_mech / Q0Q15 Q15 / p-gttheta_elec amp 0x7FFF void F28X_EV1_QEP_IsrQEP p p-gtQEP_cnt_idx EvaRegs.T2CNT EvaRegs.T2CNT 0 p-gtindex_sync_flag 0x00F0 // // TMS320F2812电动机位置检测 QEP电路初始化参数及函数定义 7 // 文件名称F28XQEP.H // ifndef __F28X_QEP_H__ define __F28X_QEP_H__ include quotf28xbmsk.hquot / 初始化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 正交编码电路 驱动的对象 / 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 / 参数: 编码器和相之间的角度偏移量 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 0x00x00x00x0167762-23650x0 void longF28X_EV1_QEP_Init void longF28X_EV1_QEP_Calc void longF28X_EV1_QEP_Isr void F28X_EV1_QEP_InitQEP_handle void F28X_EV1_QEP_CalcQEP_handle void F28X_EV1_QEP_IsrQEP_handle endif / __F28X_QEP_H__ / 8 例5、TMS320F2812实现三相永磁同步电动机的磁场定向控制 // // 采用TMS320F2812实现三相永磁同步电动机的磁场定向控制 // 文件名称PMSM3_1.C // include quotIQmathLib.hquot / 包含IQmath库函数的头文件 / include quotDSP28_Device.hquot include quotpmsm3_1.hquot include quotparameter.hquot include quotbuild.hquot // 函数声明 interrupt void EvaTimer1void interrupt void EvaTimer2void // 全局变量定义 float Vd_testing 0 / Vd testing pu / float Vq_testing 0.25 / Vq testing pu / float Id_ref 0 / Id reference pu / float Iq_ref 0.4 / Iq reference pu / float speed_ref 0.2 / Speed reference pu / float T 0.001/ISR_FREQUENCY / Samping period sec see parameter.h / int isr_ticker 0 int pwmdac_ch10 int pwmdac_ch20 int pwmdac_ch30 volatile int enable_flg0 int lockrtr_flg1 int speed_loop_ps 10 // 速度环定标器 int speed_loop_count 1 // 速度环计数器 CLARKE clarke1 CLARKE_DEFAULTS PARK park1 PARK_DEFAULTS IPARK ipark1 IPARK_DEFAULTS PIDREG3 pid1_id PIDREG3_DEFAULTS PIDREG3 pid1_iq PIDREG3_DEFAULTS PIDREG3 pid1_spd PIDREG3_DEFAULTS 9 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 ILEG2DCBUSMEAS ilg2_vdc1 ILEG2DCBUSMEAS_DEFAULTS // 主函数 void mainvoid // 系统初始化 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 EvaRegs.GPTCONA.all 0 //等待使能标志位 while enable_flg0 // 使能定时器1的下溢中断 EvaRegs.EVAIMRA.bit.T1UFINT 1 10 EvaRegs.EVAIFRA.bit.T1UFINT 1 // 使能CAP3中断定时器2 EvaRegs.EVAIMRC.bit.CAP3INT 1 EvaRegs.EVAIMRC.bit.CAP3INT 1 // 重新分配中断向量 EALLOW PieVectTable.T1UFINT ampEvaTimer1 PieVectTable.CAPINT3 ampEvaTimer2 EDIS // 使能PIE组2的中断6T1UFINT PieCtrlRegs.PIEIER2.all M_INT6 // 使能PIE组3的中断7CAPINT3 PieCtrlRegs.PIEIER3.all M_INT7 // 使能CPU INT2T1UFINT和INT3CAPINT3 IER M_INT2 M_INT3 // 使能全局中断和最高优先级适时调试事件管理器功能 EINT //使能全局中断INTM ERTM // 使能适时调试中断DBGM / 模块初始化 / pwm1.n_period SYSTEM_FREQUENCY1000000T/2 / 预定标器X1 T1 ISR周期 T x 1 / pwm1.initamppwm1 pwmdac1.pwmdac_period 2500 / PWM频率 30 kHz / pwmdac1.PWM_DAC_IPTR0 amppwmdac_ch1 pwmdac1.PWM_DAC_IPTR1 amppwmdac_ch2 pwmdac1.PWM_DAC_IPTR2 amppwmdac_ch3 pwmdac1.initamppwmdac1 qep1.initampqep1 drv1.initampdrv1 ilg2_vdc1.initampilg2_vdc1 / 初始化SPEED_FRQ模块 / 11 speed1.K1 _IQ211/BASE_FREQT speed1.K2 _IQ1/1T2PI30 / 低通截至频率 30 Hz / speed1.K3 _IQ1-speed1.K2 speed1.rpm_max 120BASE_FREQ/P /初始化RAMPGEN模块 / rg1.step_angle_max _IQBASE_FREQT / 初始化PID_REG3 Id调节模块 / pid1_id.Kp_reg3 _IQ0.75 pid1_id.Ki_reg3 _IQT/0.0005 pid1_id.Kd_reg3 _IQ0/T pid1_id.Kc_reg3 _IQ0.2 pid1_id.pid_out_max _IQ0.30 pid1_id.pid_out_min _IQ-0.30 / 初始化PID_REG3 Iq调节模块 / pid1_iq.Kp_reg3 _IQ0.75 pid1_iq.Ki_reg3 _IQT/0.0005 pid1_iq.Kd_reg3 _IQ0/T pid1_iq.Kc_reg3 _IQ0.2 pid1_iq.pid_out_max _IQ0.95 pid1_iq.pid_out_min _IQ-0.95 /初始化PID_REG3 速度调节模块 / pid1_spd.Kp_reg3 _IQ1 pid1_spd.Ki_reg3 _IQTspeed_loop_ps/0.1 pid1_spd.Kd_reg3 _IQ0/Tspeed_loop_ps pid1_spd.Kc_reg3 _IQ0.2 pid1_spd.pid_out_max _IQ1 pid1_spd.pid_out_min _IQ-1 // 循环等待 for interrupt void EvaTimer1void isr_ticker if speed_loop_countspeed_loop_ps 12 pid1_spd.pid_ref_reg3 _IQspeed_ref pid1_spd.pid_fdb_reg3 speed1.speed_frq pid1_spd.calcamppid1_spd speed_loop_count1 else speed_loop_count pid1_iq.pid_ref_reg3 pid1_spd.pid_out_reg3 pid1_iq.pid_fdb_reg3 park1.qe pid1_iq.calcamppid1_iq pid1_id.pid_ref_reg3 _IQId_ref pid1_id.pid_fdb_reg3 park1.de pid1_id.calcamppid1_id ipark1.de pid1_id.pid_out_reg3 ipark1.qe pid1_iq.pid_out_reg3 ipark1.ang speed1.theta_elec ipark1.calcampipark1 svgen_dq1.Ualfa ipark1.ds svgen_dq1.Ubeta ipark1.qs svgen_dq1.calcampsvgen_dq1 pwm1.Mfunc_c1 int_IQtoIQ15svgen_dq1.Ta / Mfunc_c1 is in Q15 / pwm1.Mfunc_c2 int_IQtoIQ15svgen_dq1.Tb / Mfunc_c2 is in Q15 / pwm1.Mfunc_c3 int_IQtoIQ15svgen_dq1.Tc / Mfunc_c3 is in Q15 / pwm1.updateamppwm1 ilg2_vdc1.readampilg2_vdc1 clarke1.as _IQ15toIQlongilg2_vdc1.Imeas_a clarke1.bs _IQ15toIQlongilg2_vdc1.Imeas_b clarke1.calcampclarke1 park1.ds clarke1.ds park1.qs clarke1.qs park1.ang speed1.theta_elec park1.calcamppark1 qep1.calcampqep1 speed1.theta_elec _IQ15toIQlongqep1.theta_elec speed1.dir_QEP longqep1.dir_QEP 13 speed1.ca.上一篇:黑客编码经典源代码