




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2.4 无刷直流电动机驱动控制程序/#/无刷电机控制源程序/TMS320F2812/#/=/头文件调用/=#include DSP28_Device.h#include math.h#include float.h/=/常量附值/=#define Idc_max 3000 /电流给定最大值 #define Idc_min 0 /电流给定最小值 /=/标志位/=char Iab_Data=0;struct Flag_Bits / bits description Uint16 Send:1; / 0 串口发数 Uint16 Test:1; / 1 串口测试 Uint16 Vflag:1; / 2 转速更新 Uint16 SendEnd:1; / 3 串口发送结束 Uint16 Sign1:1; / 4 上一次给定转向标志 Uint16 Sign2:1; / 5 本次给定转向标志 Uint16 Openint:1; / 6 启动标志 Uint16 Adfrist:1; / 7 保留 Uint16 Spdoff:1; / 8 保留 Uint16 Zero:1; / 9 转速过零标志 Uint16 Mode:3; / 10-12 保留 Uint16 Dshow:1; / 13 保留 Uint16 Sign:1; / 14 当前转向标志;union Flag_Reg Uint16 all; struct Flag_Bits bit;FlagRegs;/=/全局变量/=/串口通信变量unsigned int Sci_Rx8=0,0,0,0,0,0,0,0; /接收数据数组unsigned int Sci_Tx8=0,0,0,0,0,0,0,0; /发送数据数组char T_pointer=0; /发送数据数组指针char R_pointer=0; /接收数据数组指针char T_length=1; /发送数据长度 char R_length=0; /接收数据长度 char a2=0; /控制参数unsigned int spd_kp=0; /转速环P参数unsigned int spd_ki=0; /转速环I参数 unsigned int id_kp=0,id_ki=0; /电流PI参数signed int spd_given=0; /转速给定signed int spd_given1=0; /转速给定signed int spd_given2=0; /转速给定/控制变量unsigned int cap1=0; /前次换向标志位unsigned int cap2=0; /本次换向标志位unsigned int intruptcount=0; /定时器1下溢中断次数unsigned int speed_given = 1000; /转速给定signed int Idc_given2=0; /算得本次电流给定值signed int speed_e1=0; /前次转速误差signed int speed_e2=0; /本次转速误差signed int Ia_e1=0; /前次电流误差 signed int Ia_e2=0; /本次电流误差char t2first=0;signed int COMP2=0; /装比较寄存器值/转速反馈char Spd_Data=0; /滤波计数int speed_counter=0; /速度环计数器unsigned int cap_a; /本次捕获单元数据unsigned int cap_b; /上次捕获单元数据long cap_c; /捕获单元数据差signed int BLDC_SPD10=0,0,0,0,0,0,0,0,0,0;/转速滤波signed int spd_fd_q1=0; /转速反馈临时变量unsigned int spd_fd_q0=0; /转速检测值char cc=0;/电流反馈unsigned int ia6=0,0,0,0,0,0; /A相电流反馈值 unsigned int ib6=0,0,0,0,0,0; /B相电流反馈值signed int ia_fd=0,ib_fd=0; /电流反馈signed int Temp_filter=0; /临时变量unsigned int t1per=0; /周期寄存器数值/临时变量signed long long1_tmp=0;signed long long2_tmp=0;signed int u16_tmp1=0;signed int u16_tmp2=0;/=/子程序声明/=interrupt void t1uf_int(void);interrupt void cap_int(void);void Ad(void);void speed(void); /计算速度void Ia_PI(void); /电流环调节Iavoid speed_PI(void); /速度环调节void bldc(void); void Check_Rxdata(void); void Sci_Send(signed int sci_delay);char *Fen_Jie(signed int Send_Temp);unsigned int Sci_Rx_check(unsigned int i_Rx,unsigned int *p_Rx); signed int DIV_CAL(long signed int dividend,signed int divisor);unsigned int U_DIV_CAL(long unsigned int udividend,unsigned int udivisor);/=/主程序开始/=void main(void)/控制寄存器初始设置 InitSysCtrl(); /初始化系统 DINT; /关全局中断 IER = 0x0000; IFR = 0x0000; InitPieCtrl(); /初始化PIE中断 InitPieVectTable(); /初始化PIE中断矢量表 InitGpio(); /初始化Gpio输入输出口 InitEv(); /初始化Eva的T和T2 InitAdc_Eva(); /初始化AD InitData(); EALLOW; / This is needed to write to EALLOW protected registers PieVectTable.T1UFINT=&t1uf_int;/T1下溢中断地址 PieVectTable.CAPINT4=&cap_int; PieVectTable.CAPINT5=&cap_int; PieVectTable.CAPINT6=&cap_int; EDIS; / This is needed to disable write to EALLOW protected registers PieCtrl.PIEIER2.bit.INTx6 = 1; /T1下溢中断使能 PieCtrl.PIEIER5.bit.INTx5 = 1; PieCtrl.PIEIER5.bit.INTx6 = 1; PieCtrl.PIEIER5.bit.INTx7 = 1; IER |= M_INT2; / Enable CPU Interrupt 2 IER |= M_INT4; / Enable CPU Interrupt 4 IER |= M_INT5; / Enable CPU Interrupt 5 EvbRegs.EVBIMRC.bit.CAP4INT=1; EvbRegs.EVBIMRC.bit.CAP5INT=1; EvbRegs.EVBIMRC.bit.CAP6INT=1; EvbRegs.CAPCONB.all=0x36FF; NOP; NOP; NOP; NOP; EvbRegs.CAPCONB.all=0xB6FF; EINT; /使能全局中断INTM ERTM; / Enable Global realtime interrupt DBG /等待中断(中断之外的时间内进行LCD的发送和接收) for(;) SCI_CTL(); /=/串口控制/=/*/接收数据检测/*void Check_Rxdata()switch(Sci_Rx0) case m: /转速给定和转速在线更新 case v: FlagRegs.bit.Vflag=1; if(Sci_Rx1=-) FlagRegs.bit.Sign1=0; /转速为负值 spd_given1 = Sci_Rx_check(4,Sci_Rx); else FlagRegs.bit.Sign1=1; /转速为正值 spd_given1 = Sci_Rx_check(3,Sci_Rx); if(Sci_Rx0=m) FlagRegs.bit.Sign2=FlagRegs.bit.Sign1; FlagRegs.bit.Sign=FlagRegs.bit.Sign1; break; case s: /启动 Sci_Tx0=a; Sci_Tx1=+; Sci_Tx2=0; Sci_Tx3=0; Sci_Tx4=0; Sci_Tx5=0; Sci_Tx6=0; Sci_Tx7=z; spd_given=spd_given1; Protect_Data(); Motor_Start(); FlagRegs.bit.Send=1; T_length=8; T_pointer=0; break; case t: /停止 Motor_Stop(); break; default: break; /*/ 串口接收/发送判断/*SCI_CTL() if(SciaTx_Ready() = 1) & (FlagRegs.bit.Send = 1)/发送数据准备好并且软件使能发送 if(FlagRegs.bit.Test=0) /SCI测通状态 SciaRegs.SCITXBUF = Sci_RxT_pointer; T_pointer+; /发送缓冲器数组指针+1 if(T_pointer=R_length) FlagRegs.bit.Test=1; FlagRegs.bit.Send=0; T_pointer=0; else /SCI非测通状态 SciaRegs.SCITXBUF = Sci_TxT_pointer; T_pointer+; /发送缓冲器数组指针+1 if(T_pointer=T_length) FlagRegs.bit.Send = 0; T_pointer=0; if(T_pointer=10) T_pointer=0; FlagRegs.bit.Send= 0; R_pointer=0;#if !SCIA_INTif(SciaRx_Ready() = 1) /接收数据准备好 FlagRegs.bit.SendEnd=0; FlagRegs.bit.Send= 0; Sci_RxR_pointer = SciaRegs.SCIRXBUF.all; R_pointer+; if(Sci_RxR_pointer-1=z) R_length=R_pointer-1; FlagRegs.bit.Send= 1; FlagRegs.bit.SendEnd=1; if(FlagRegs.bit.Test=1) Check_Rxdata(); R_pointer = 0; if(R_pointer= 10) R_pointer = 0; #endif /*/接收数据格式调整/*unsigned int Sci_Rx_check(unsigned int i_Rx,unsigned int *p_Rx) unsigned long data_Rx; unsigned int *p_tmp_Rx=p_Rx+i_Rx; data_Rx=1000*(*p_tmp_Rx)+100*(*(p_tmp_Rx+1)+10*(*(p_tmp_Rx+2)+(*(p_tmp_Rx+3)-53328; return(data_Rx);/*/发送数据格式调整/*char *Fen_Jie(signed int Send_Temp) unsigned int Temp; char s1,s2,s3,s4; char String_Tmp6=0,0,0,0,0,0; if(Send_Temp21; if(s1=10) s1=9; Temp=Send_Temp-s1*1000; s2=(long)Temp*5253)19; if(s2=10) s2=9; Temp=Temp-s2*100; s3=(long)Temp*3277)15; if(s3=10) s3=9; s4=Temp-s3*10; if(s4=10) s4=9; String_Tmp1=s1+48; /千位 String_Tmp2=s2+48; /百位 String_Tmp3=s3+48; /十位 String_Tmp4=s4+48; /个位 return(String_Tmp); /*/ 数据发送/*void Sci_Send(signed int sci_delay) /串口数据发送 char *p_send=0; a2+; if(a2=sci_delay)&(FlagRegs.bit.Send=0)&(FlagRegs.bit.SendEnd=1) p_send=Fen_Jie(spd_fd_q0); Sci_Tx0=a; Sci_Tx1=*p_send; Sci_Tx2=0; Sci_Tx3=*(p_send+1); Sci_Tx4=*(p_send+2); Sci_Tx5=*(p_send+3); Sci_Tx6=*(p_send+4); Sci_Tx7=z; FlagRegs.bit.Send=1; a2=0; /=/电机状态控制/=/*/ 数据处理/*Protect_Data() if(spd_kp30000) spd_kp=30000; if(spd_ki30000) spd_ki=30000; if(id_kp30000) id_kp=30000; if(id_ki30000) id_ki=30000; EvaRegs.T1PR =7500; /矢量控制开关频率5K固定 t1per=7500; EvaRegs.T1CON.all = 0X080C; /连续增减计数 InitAdc_Eva(); /*/电机停止 /* Motor_Stop() EvaRegs.CMPR1=0; EvaRegs.CMPR2=0; EvaRegs.CMPR3=0; EvaRegs.ACTR.all=0X0FFF; InitData(); FlagRegs.bit.Openint=0; EvaRegs.T1CON.bit.TENABLE=0; EvbRegs.T3CON.bit.TENABLE=0; /* /电机启动/* Motor_Start() EvaRegs.ACTR.all=0X0999; FlagRegs.bit.Openint=1; t1per=7500; EvaRegs.T1PR =7500; /周期寄存器 5khz EvaRegs.T1CON.all = 0X080C; /连续增减计数 EvbRegs.T3PR =0xffff; / 周期寄存器 EvbRegs.T3CON.all = 0X170C; / 连续增减计数 EvbRegs.EVBIMRA.all=0X0000; / T3下溢使能 EvbRegs.EVBIFRA.all=0X0FFFF; / 清中断标志位 GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8=0; /将cap456设置为io口 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=0; GpioMuxRegs.GPBMUX.bit.CAP6QI2_GPIOB10=0; cap2 = GpioDataRegs.GPBDAT.all & 0x0700; /记录cap4-6初始状态 cap2 = cap28; cap2 = cap2&0x0007; if(FlagRegs.bit.Sign=1) cap2=7-cap2; else cap2=cap2; GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8=1; /将cap456设置为CAP口 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=1; GpioMuxRegs.GPBMUX.bit.CAP6QI2_GPIOB10=1; EvaRegs.T1CON.bit.TENABLE=1; FlagRegs.bit.Vflag=1; /=/直流无刷电动机驱动双闭环主程序/=/*/驱动主程序/*void bldc() intruptcount+; speed(); switch(int)cap2) case 4: Ad(); /检测电流 if(ia_fd0) ia_fd=0; /保护 speed_PI();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 儿童色彩创作课件大纲
- 课件智能AI教学课件
- 广东会计初级自考试题及答案
- 历年护理考试题及答案
- 礼仪学堂考试题及答案
- 乐器辅助考试题及答案
- 广东房屋构造自考试题及答案
- 康复基层考试题及答案
- 钼钨冶炼辅料制备工适应性考核试卷及答案
- 信息安全管理员职业考核试卷及答案
- 泵送式桥塞与射孔联做技术介绍n课件
- 大型医院耗材管理SPD系统
- 精选提高脑卒中偏瘫患者良肢位摆放的正确率品管圈讲义
- 大金龙纯电动车hvcm及bms外网协议
- GB/T 8295-2008天然橡胶和胶乳铜含量的测定光度法
- GB/T 19960.1-2005风力发电机组第1部分:通用技术条件
- 生产作业管理讲义
- 二年级上册《树之歌》优秀课件
- 锅炉安全技术规程
- 初中音乐《快乐的女战士》《水草舞》课件
- 易制毒化学品岗位责任制度
评论
0/150
提交评论