




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 1 / 29 第7章基于TMS320F2812的永磁同步电动机控制例 1、空间矢量算法实现 SVGEN_DQ对象结构体定义 typedef struct _iq Ualpha;/输入:轴参考电压 _iq Ubeta; _iq Ta; _iq Tb; _iq Tc; SVGENDQ; typedef SVGENDQ *SVGENDQ_handle; SVGEN_DQ模块调用方法: main() void interrupt periodic_interrupt_isr()svgen_dq 1.Ualpha = Ualpha1; svgen_dq 1.Ubeta = Ubeta1; svgen_
2、dq 2.Ualpha = Ualpha2; svgen_dq 2.Ubeta = Ubeta2; 2 / 29 svgen_dq 1.calc(&svgen_dq1); svgen_dq 2.calc(&svgen_dq2); Ta1 = svgen_dq 1.Ta; Tb1 = svgen_dq 1.Tb; Tc1 = svgen_dq 1.Tc; Ta2 = svgen_dq 2.Ta; Tb2 = svgen_dq 2.Tb; Tc2 = svgen_dq 2.Tc; /提供输入参数: svgen_dq1 /提供输入参数: svgen_dq1 /提供输入参数: 3 /
3、29 vgen_dq2 /提供输入参数: svgen_dq2 /调用函数模块svgen_dq1 /调用函数模块svgen_dq2 /访问运算结果svgen_dq1 /访问运算结果svgen_dq1 /访问运算结果svgen_dq1 /访问运算结果svgen_dq2 /访问运算结果svgen_dq2 /访问运算结果svgen_dq2 /输入:轴参考电压 /输出: 参考相位a开关函数 /输出: 参考相位b开关函数 /输出: 参考相位c开关函数 函数指针 void (*calc)(); / 4 / 29 为进一步了解空间矢量算法的基本原理,下面给出空间矢量模块的源代码: void svgendq_c
4、alc(SVGENDQ *v)_iq Va,Vb,Vc,t1,t2; _iq sector = 0;/*设相位置(sector)等于Q0*/ /*逆clarke变换*/ Va = v->Ubeta; Vb = _IQmpy(_IQ(- 0.5),v->Ubeta) + _IQmpy(_IQ( 0.),v->Ualfa);/* 0. = sqrt (3)/2 */Vc = _IQmpy(_IQ(- 0.5),v->Ubeta) - _IQmpy(_IQ( 0.),v->Ualfa);/* 0. = sqrt (3)/2 */* 60度sector的确定*/ if (
5、Va>_IQ (0) sector = 1; if (Vb>_IQ (0) sector = sector + 2; if (Vc>_IQ 5 / 29 (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.),v->Ualfa);/* Y = Vb */ Vc = _IQmpy(_IQ( 0.5),v->Ubeta) - _IQmpy(_IQ( 0.),v-
6、>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
7、 t2=-X (abc -> Ta,Tc,Tb) */t1 = Vb; t2 = -Va; v->Ta = _IQmpy(_IQ( 0.5),(_IQ (1)-t1-t2);/* taon = (1-t1-t2)/2 */ 6 / 29 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;
8、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 */else if (sector=4)/* sector 4: t1=-X and t2=Z (abc -> Tc,Tb,Ta) */t1 = -Va; t2 = Vc; v->Tc = _IQmpy(_IQ( 0.5),(_IQ (1)-t1-t2);/* tcon = (1
9、-t1-t2)/2 */ v->Tb = v->Tc+t1;/* tbon = tcon+t1 */ v->Ta = v->Tb+t2;/* 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 */
10、 7 / 29 v->Ta = v->Tc+t2;/* taon = tcon+t2 */else if (sector=6)/* sector 6: t1=-Y and t2=-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-&
11、gt;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中的一个矢量的例子: CMPR3tcon CMPR2tbon CMPR1taontPWM1tPWM3tPWM5T0/4T 6/2T 6/2T 0/4T 8 / 29 0/4T 6/4T 4/4T 0/4tV0V 6V 4V 7V 7V 6V 4V0T 图相位置(sector)PWM实例及其占空比例2
12、、事件管理器配置 EvaRegs.T1PR = p->n_period;/* SYSTEM_FREQUENCY*1000*T/2*/*初始化Timer 1周期寄存器*/*/*/*预定标器X1 (T1),ISR周期= T x 1 EvaRegs.T1CON.all = PWM_INIT_STATE;/*对称操作模式 EvaRegs.DBTCON A.all = DBTCON_INIT_STATE; EvaRegs.ACTR A.all = ACTR_INIT_STATE; EvaRegs.COMCON A.all = 0xA200; EvaRegs.CMPR1 = p->n_peri
13、od; EvaRegs.CMPR2 = p->n_period; 9 / 29 EvaRegs.CMPR3 = p->n_period; EALLOW; GpioMuxRegs.GPAMUX.all |= 0x003F;例3、TMS320F2812电流及DC母线电压检测 /* /TMS320F2812电流及DC母线电压检测 /文件名称: F28XILEG_V DC.C /* #include DSP28_Device.h #include f28xileg_vdc.h #include f28xbmsk.h #define CPU_CLOCK_SP EED6.6667L/CPU时钟
14、速度150MHz #define ADC_usDELAY 5000L #define DELAY_US(A) DSP28x_usDelay(long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) - 9.0L) / 10 / 29 5.0L)extern void DSP28x_usDelay(unsigned long Count); void F28X_ileg2_dcbus_drv_init(ILEG2DCBUSMEAS *p)DELAY_US(ADC_usDELAY); asm( NOP ); asm( NOP ); AdcR
15、egs.ADCTRL 3.bit.ADCBGRFDN = 0x3; DELAY_US(ADC_usDELAY); AdcRegs.ADCTRL 3.bit.ADCPWDN = 1; AdcRegs.ADCTRL 3.bit.ADCCLKPS = 3; DELAY_US(ADC_usDELAY); AdcRegs.ADCTRL 1.all = ADCTRL1_INIT_STATE; AdcRegs.ADCTRL 2.all = ADCTRL2_INIT_STATE; AdcRegs.ADCMAXCONV.bit.MAX_CONV = 2; AdcRegs.ADCCHSELSEQ 1.all =
16、p->Ch_sel;/*设置ADCTRL1寄存器*/ /*设置ADCTRL2寄存器*/*确定3个转换 /*配置通道选择*/*/*为ADC其他单元上电*/ 11 / 29 /*设置ADCTRL3寄存器*/ /*为bandgap和参考电路供电*/ /*为ADC其他单元上电前延时*/*复位ADC模块*/ AdcRegs.ADCTRL 1.all = ADC_RESET_FLAG; EvaRegs.GPTCON A.bit.T1TOADC = 1; /*设置采用Timer1 UF触发ADC转换*/void F28X_ileg2_dcbus_drv_read(ILEG2DCBUSMEAS *p)i
17、nt dat_q15; long tmp; /*等待ADC转换结束*/ while (AdcRegs.ADCST.bit.SEQ1_BSY = 1) ; dat_q15 = AdcRegs.ADCRESULT00x8000;/*将转换结果变成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.ADCRESULT
18、10x8000;/*将转换结果变成Q15格式双极性数据*/tmp = (long)(p->Imeas_b_gain*dat_q15); p->Imeas_b = (int)(tmp>>13); p->Imeas_b += p->Imeas_b_offset; 12 / 29 p->Imeas_b *= -1; dat_q15 = (AdcRegs.ADCRESULT2>>1)&0x7FFF;/*将转换结果变成Q15格式双极性数据*/tmp = (long)(p->Vdc_meas_gain*dat_q15); p->Vd
19、c_meas = (int)(tmp>>13); p->Vdc_meas += p->Vdc_meas_offset; p->Imeas_c = -(p->Imeas_a + p->Imeas_b); AdcRegs.ADCTRL 2.all |= 0x40;/*复位排序器*/*正向,电流流向电动机*/ /*正向,电流流向电动机*/例 4、电动机位置检测 /* /TMS320F2812电动机位置检测QEP电路初始化及应用 /文件名称: F28XQEP.C /* #include DSP28_Device.h #include f28xqep.h#inc
20、lude f28xbmsk.h voidF28X_EV1_QEP_Init(QEP *p)EvaRegs.CAPCON.all = QEP_CAP_INIT_STATE;/*设置捕捉单元*/ EvaRegs.T2CON.all = QEP_TIMER_INIT_STATE;/*设置捕捉定时器*/ EvaRegs.T2PR = 0xFF; 13 / 29 EvaRegs.EVAIFR C.bit.CAP3INT = 1; EvaRegs.EVAIMR C.bit.CAP3INT = 1; GpioMuxRegs.GPAMUX.all |= 0x0700;void F28X_EV1_QEP_Cal
21、c(QEP *p)long tmp; p->dir_QEP = 0x4000&EvaRegs.GPTCON A.all; p->dir_QEP = p->dir_QEP>>14; p->theta_raw = EvaRegs.T2CNT + p->cal_angle; tmp = (long)(p->theta_raw*p->mech_scaler); tmp &= 0x03FFF000; p->theta_mech = (int)(tmp>>11); p->theta_mech &= 0x7
22、FFF; /* Q0*Q15 = Q15 */ p->theta_elec = p->pole_pairs*p->theta_mech; EvaRegs.T2CNT = 0; p->index_sync_flag = 0x00F0;/* /TMS320F2812电动机位置检测QEP电路初始化参数及函数定义/* Q26 -> Q15 */ /* Q0*Q26 = Q26 */*清除CAP3标志*/ 14 / 29 /*使能CAP3中断*/ /*配置捕捉单元的引脚*/ /文件名称: F28XQEP.H /* #ifndef _F28X_QEP_H_ #define _
23、F28X_QEP_H_ #include f28xbmsk.h /*初始化T2CON和CAPCON*/ #define QEP_CAP_INIT_STATE0x9004 #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
24、 theta_elec;/*输出: 电动机电角度(Q15) int theta_mech;/*输出: 15 / 29 电动机机械角度(Q15) int dir_QEP;/*输出: 电动机转动方向(Q0) 编码器计数(Q0) int theta_raw;/*变量: 定时器2得出的角度(Q0) int mech_scaler;/*参数: 0.99/计数最大值,计数最大值= 4000 (Q26)int pole_pairs;/*参数: 极对数(Q0) int cal_angle;/*参数: 编码器和相之间的角度偏移量(Q0) int index_sync_flag; /*输出: Index sync
25、 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, 16 / 29 (void (*)(long)F28X_EV1_QEP_Init, (void (*)(long)F28X_EV1_QEP_Calc, (void (*)(long)F28X_EV1_QEP_I
26、sr void F28X_EV1_QEP_Init(QEP_handle); void F28X_EV1_QEP_Calc(QEP_handle); void F28X_EV1_QEP_Isr(QEP_handle); #endif /*_F28X_QEP_H_ */*/ */*/*/*/*/*/*/*/*/*/*/例 5、TMS320F2812实现三相永磁同步电动机的磁场定向控制 /* /采用TMS320F2812实现三相永磁同步电动机的磁场定向控制 /文件名称: PMSM3_ 1.C /* #include IQmathLib.h/*包含IQmath库函数的头文件*/ #include D
27、SP28_Device.h #include pmsm3_ 1.h #include parameter.h 17 / 29 #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_ref = 0.4; float speed_ref = 0.2; int isr_ticker = 0; int pwmdac_ch1
28、=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; 18 / 29 CLARKE clarke1 = CLARKE_DEFAULTS; PARK park1 = PARK_DEFAULTS; IPARK ipark1 = IPARK_DEFAULTS; PIDREG3 pid1_id = PIDREG3_DEFAULTS; PIDREG3 pid1_iq = PIDREG3_D
29、EFAULTS; PIDREG3 pid1_spd = 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 */ PWMGEN pwm1 = PWMGEN_DEFAULTS; PWMDAC pwmdac1 =
30、 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; 19 / 29 ILEG2DCBUSMEAS ilg2_vdc1 = ILEG2DCBUSMEAS_DEFAULTS; /主函数 void main(vo
31、id)/系统初始化 InitSysCtrl(); /HISPCP设置 EALLOW; SysCtrlRegs.HISPCP.all = 0x00;/* SYSCLKOUT/1*/ EDIS; /禁止并清除所有CPU中断: DINT; IER = 0x00; IFR = 0x00; /初始化Pie到默认状态 InitPieCtrl(); /初始化PIE相量表 InitPieVectTable(); /初始化EVA定时器1: /设置定时器1寄存器(EV A) EvaRegs.GPTCON A.all = 0; /等待使能标志位 20 / 29 while (enable_flg=0)/使能定时器1
32、的下溢中断 EvaRegs.EVAIMR A.bit.T1UFINT = 1;EvaRegs.EVAIFR A.bit.T1UFINT = 1; /使能CAP3中断(定时器2) EvaRegs.EVAIMR C.bit.CAP3INT = 1; EvaRegs.EVAIMR C.bit.CAP3INT = 1; ; /重新分配中断向量 /使能PIE组2的中断6(T1UFINT) PieCtrlRegs.PIER 2.all = M_INT6; /使能PIE组3的中断7(CAPINT3) PieCtrlRegs.PIER 3.all = M_INT7; /使能CPU INT2(T1UFINT)和
33、INT3(CAPINT3): /使能全局中断和最高优先级适时调试事件管理器功能: /* pwmdac 21 / 29 1.pwmdac_period = 2500;/* PWM频率= 30 kHz */ pwmdac 1.PWM_DAC_IPTR0 = &pwmdac_ch1; pwmdac 1.PWM_DAC_IPTR1 = &pwmdac_ch2; pwmdac 1.PWM_DAC_IPTR2 = &pwmdac_ch3; qep 1.init(&qep1); drv 1.init(&drv1); ilg2_vdc 1.init(&ilg2_
34、vdc1); /*初始化SPEED_FRQ模块*/ pwmdac 1.init(&pwmdac1); 模块初始化*/ pwm 1.n_period = SYSTEM_FREQUENCY*1000*T/2;/*预定标器X1 (T1), ISR周期= T x 1 */pwm 1.init(&pwm1); EINT;/使能全局中断INTM 22 / 29 ERTM;/使能适时调试中断DBGM IER |= (M_INT2 | M_INT3); EALLOW; PieVectTable.T1UFINT = &EvaTimer1; PieVectTable.CAPINT3 = &
35、amp;EvaTimer2; EDIS; speed 1.K1 = _IQ21(1/(BASE_FREQ*T); speed 1.K2 = _IQ(1/(1+T*2*PI*30);/*低通截至频率= 30 Hz */ speed 1.K3 = _IQ (1)-speed 1.K2; speed 1.rpm_max = 120*BASE_FREQ/P; /*初始化RAMPGEN模块*/ rg 1.step_angle_max = _IQ(BASE_FREQ*T); /*初始化PID_REG3Id调节模块*/ pid1_id.Kp_reg3 = _IQ( 23 / 29 0.75); pid1_i
36、d.Ki_reg3 = _IQ(T/ 0.0005); pid1_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_REG3Iq调节模块*/ 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); pid
37、1_iq.pid_out_max = _IQ( 0.95); pid1_iq.pid_out_min = _IQ(- 24 / 29 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 = _
38、IQ(-1); /循环等待 for(;);interrupt void EvaTimer1(void)isr_ticker+; if (speed_loop_count=speed_loop_ps) pid1_spd.pid_ref_reg3 = _IQ(speed_ref); pid1_spd.pid_fdb_reg3 = speed 1.speed_frq; pid1_spd.calc(&pid1_spd); speed_loop_count=1; else speed_loop_count+; 25 / 29 pwm 1.Mfunc_c1 = (int)_IQtoIQ15(svgen_dq 1.Ta); /* Mfunc_c1 is in Q15 */ ilg2_vdc 1.read(&ilg2_vdc1); park 1.ds = clarke 1.ds; park 1.qs = clarke 1.qs; park 1.ang = speed 1.theta_elec; park 1.calc(&park1); qep 1.calc(&qep1); speed 1.theta_elec = _IQ15toIQ(long)qep 1.theta_elec); 26 / 29 speed 1.dir_QE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度技术合作项目终止及解除合同书
- 2025年度农村水井承包合同与农业灌溉用水权流转及监管协议
- 2025年度特殊年龄段劳动者用工协议及权益保障
- 2025年度个体商户劳动合同(家政服务行业合作)
- 5G通信借款居间合同模板
- 2025年度分红股收益确认与分配协议
- 2025年度影视作品著作权许可及广告植入合作合同
- 2025年度分手协议书模板:分手后共同债务承担协议
- 2025年度房屋拆除与建筑垃圾清运一体化服务合同
- 2025年度企业导师带徒技能传承服务协议
- (高清版)TDT 1056-2019 县级国土资源调查生产成本定额
- 公司合作计划书
- 2016-2023年南京信息职业技术学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
- 跨领域联合诊疗(MDT)管理法规
- 光伏电站运维安全风险管控清单
- 保安员考核评分标准与细则
- 四年级竖式计算大全100道
- 履行法定义务纠正违法行为的模板
- 越剧基本知识讲座
- 岗位绩效奖励制度
- JGT161-2016 无粘结预应力钢绞线
评论
0/150
提交评论