【VC++开源代码栏目提醒】:网学会员,鉴于大家对VC++开源代码十分关注,论文会员在此为大家搜集整理了“TI公司官网源代码基于TMS320F2812的永磁同步电动机空间矢量控制的算法实现 - 机械机电”一文,供大家参考学习!
第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 / 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 / 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 中的一个矢量的例子: CMPR3 tcon CMPR2 tbon taon CMPR1 t PWM1 t PWM3 t PWM5 T0/4 T6/2 T6/2 T0/4 T0/4 T6/4 T4/4 T0/4 t V0 V6 V4 V7 V7 V6 V4 V0 T 图 相位置sectorPWM 实例及其占空比例2、事件管理器配置 EvaRegs.T1PR p-gtn_period / SYSTEM_FREQUENCY1000000T/2 / /初始化 Timer 1 周期寄存器 / / 预定标器 X1 T1,ISR 周期 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 / 配置通道选择 / 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.hquotinclude quotf28xqep.hquotinclude quotf28xbmsk.hquotvoid 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 0x7FFFvoid F28X_EV1_QEP_IsrQEP p p-gtQEP_cnt_idx EvaRegs.T2CNT EvaRegs.T2CNT 0 p-gtindex_sync_flag 0x00F0//// TMS320F2812 电动机位置检测 QEP 电路初始化参数及函数定义// 文件名称:F28XQEP.H//ifndef __F28X_QEP_H__define __F28X_QEP_H__include quotf28xbmsk.hquot/ 初始化 T2CON 和 CAPCON /define QEP_CAP_INIT_STATE 0x9004define 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_handledefine 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_handlevoid F28X_EV1_QEP_CalcQEP_handlevoid F28X_EV1_QEP_IsrQEP_handleendif / __F28X_QEP_H__ /例5、TMS320F2812实现三相永磁同步电动机的磁场定向控制//// 采用 TMS320F2812 实现三相永磁同步电动机的磁场定向控制// 文件名称:PMSM3_1.C//include quotIQmathLib.hquot / 包含 IQmath 库函数的头文件 /include quotDSP28_Device.hquotinclude quotpmsm3_1.hquotinclude quotparameter.hquotinclude quotbuild.hquot// 函数声明interrupt void EvaTimer1voidinterrupt 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 0int pwmdac_ch10int pwmdac_ch20int pwmdac_ch30volatile int enable_flg0int lockrtr_flg1int speed_loop_ps 10 // 速度环定标器int speed_loop_count 1 // 速度环计数器CLARKE clarke1 CLARKE_DEFAULTSPARK park1 PARK_DEFAULTSIPARK ipark1 IPARK_DEFAULTSPIDREG3 pid1_id PIDREG3_DEFAULTSPIDREG3 pid1_iq PIDREG3_DEFAULTSPIDREG3 pid1_spd PIDREG3_DEFAULTSPWMGEN pwm1 PWMGEN_DEFAULTSPWMDAC pwmdac1 PWMDAC_DEFAULTSSVGENDQ svgen_dq1 SVGENDQ_DEFAULTSQEP qep1 QEP_DEFAULTSSPEED_MEAS_QEP speed1 SPEED_MEAS_QEP_DEFAULTSDRIVE drv1 DRIVE_DEFAULTSRMPCNTL rc1 RMPCNTL_DEFAULTSRAMPGEN rg1 RAMPGEN_DEFAULTSILEG2DCBUSMEAS 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 EvaRegs.EVAIFRA.bit.T1UFINT 1// 使能 CAP3 中断(定时器 2) EvaRegs.EVAIMRC.bit.CAP3INT 1 EvaRegs.EVAIMRC.bit.CAP3INT 1 // 重新分配中断向量 EALLOW PieVectTable.T1UFINT ampEvaTimer1 PieVectTable.CAPINT3 ampEvaTimer2.上一篇:C仓库管理系统(C++SQL) 【任务书+开题报告+毕业论文+源代码+答辩PDF+评审书等】 任务书