您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > DSP电机控制系统驱动程序的设计
DSP电机控制系统驱动程序的设计摘要:设计了一种DSP电机控制系统,开发了电机控制可视化界面。建立计算机(上位机)与DSP(下位机)之间的串口通信机制,既而完成对电机运行的复杂控制。着重分析DSP电机驱动程序的结构和相关代码,理清程序设计的思路,供相关研究人员借鉴。关键词:DSP直流电机串口通信程序设计中图分类号:TP29文献标识码:A文章编号:1007-9416(2014)12-0147-03Abstract:AkindofDSPmotorcontrolsystemwasdesignedandonemotorcontrolvisualinterfacewasdevelopedinthepaper.TheserialcommunicationmechanismbetweenPCofhostandDSPofclientisestablishedtofinishcomplicatedcontrolsofDCmotor.FocusontheanalysisofstructuresandrelatedcodesofDSPmotordriveprogramisexpectedtoclearprogramdesignideasforrelevantscienceresearches.KeyWords:DSP;DCmotor;serialcommunication;programdesign目前,利用DSP实现对电动机运行的控制已经成为电机拖动领域流行且成熟的方案。通过DSP可以实施对多类型电机的多形式的运动控制,其中最突出的是对电机宽域且平滑的调速,依据电机与DSP类型的不同,具有诸多实用的方案[1,2]。关于直流电机的调速,理论上可以采取三种方式:改变电枢电压,改变电枢回路电阻,调节励磁磁通,但是由于其它两种方法缺陷明显,目前主要采用改变电枢电压的方法:通过调节DSP输出的PWM波形的占空比,调控输入到电机电枢绕组的电压有效值,既而实现电机速度在较宽的范围内平滑改变[3]。本文介绍一种基于DSPTMS320F2812的电机控制系统。利用VisualStudio2010(VS2010)开发电机控制界面,构建了计算机(上位机)与DSP(下位机)之间串口的通信机制,实现对电机运动的控制。着力讨论以DSP为信息交换枢纽的电机驱动程序的设计。1控制系统开发首先,利用集成了.netFramework4.0的VisualStudio2010Windows应用程序开发平台,采用C#语言开发出电机控制界面,用以实现如开停、增/减速、运行状态查询等可视化电机控制功能,如图1所示;其次,构建上位机与下位机之间的串口通信机制,由上位机PC把相应的控制命令传递给下位机DSP,执行电机控制的操作命令;最后,由DSP构成电机控制系统的信息交换枢纽,一方面传递上位机下达的控制命令给电动机,另一方面把电动机运行状态的相关信息反馈给上位机,实现对电机运行状态的实时监控。该控制系统整体为主从式计算机结构如图2所示,其中PC为上位机,DSP为下位机,两者之间通过串口RS232C协议交换数据。硬件电路连接如图3所示,包括计算机、DSP开发板、仿真器、电机驱动电路板、直流电动机和一些电路连接线。2驱动程序设计CCS3.3是一个集成版的DSP应用程序开发环境,基本涵盖了TI公司所有型号的DSP,与其它版本相比体积稍大,但是代码优化效率较高,调试方便,是目前用的最多的DSP程序开发平台。该电机控制系统利用C语言基于CCS3.3软件平台开发DSP的电机驱动程序,建立电机控制策略实施的纽带。DSP的驱动程序主要包括:各个外设的初始化函数、主函数与输入中断函数。其中初始化函数完成相应外设的初始化定义,如系统、输入/输出引脚、串行通信接口、事件管理器等;主函数完成相关变量、宏及功能函数的定义,最后形成一个死循环,等待CPU对电机控制命令中断请求的响应,完成对电机运动的调节;中断函数为电机各种控制命令在DSP电机驱动程序中的入口,利用事件响应机制去完成对电机行为的控制。程序整体采用模块化结构,通过调用一个个功能子函数来实现对电机的不同控制,逻辑清晰,便于实现系统功能的扩展。驱动程序的设计思路如图4所示,首先需要完成DSP及相应功能外设的初始化,即准备好去执行电机的控制命令,然后等待串口的电机控制命令的输入,即形成一个死循环。当串口有电机操作指令输入时,随即发生中断事件,调用中断函数,执行相应的电机操作指令,包括电机的起/停、正/反转、加/减速、状态查询等;在指令完成后,返回死循环进入待命状态,等待下一个电机操作指令,周而复始。2.1主函数首先引用相关的头文件,定义相应的宏、变量与功能函数,然后在主函数中完成相关变量、函数及外设功能的初始化,最后形成一个死循环,等待串口输入对CPU的中断请求,既而完成电机行为的相关控制指令。以下程序代码的省略部分,均为DSP程序的一些固定的功能语句,如中断的使能、外设功能的设定等,为了节省篇幅,不再一一列出,可以参阅文献[4]。//头文件,宏、变量、功能函数定义等……;voidmain(void){InitSysCtrl();//初始化系统函数//CPU中断,PIE寄存器、外设初始化[4]……;InitGpio();//初始化Gpio口InitEv();for(i=0;i4;i++)//初始化数组变量{Sci_VarRx[i]=0;//存储电机控制指令}i=0;//初始化M1_Flag=0;M2_Flag=0;//电机起始为停止状态//电机控制界面显示波特率初值sendMsg(SciaRegs.SCIHBAUD);sendMsg(SciaRegs.SCILBAUD);//定时器T3和T1计数使能EvbRegs.T3CON.bit.TENABLE=1;EvaRegs.T1CON.bit.TENABLE=1;/*使能SCI中断,开CPU中断,使能全局与实时中断[4]*/……;for(;;){}}2.2功能函数该电机控制系统实现了控制2台(易于扩展到多台)直流电机的起/停、正/反转、加/减速、状态查询等行为,由于程序采用模块化结构,每一个控制功能都对应特定的功能函数,且每一个功能函数的结构类似,皆为先判断指令对象,然后再依据不同的指令代码执行对应的动作。因此在此仅列出加速功能函数的代码,其中省略部分为对两台以上电机的相同操作,不再重复。其它功能函数以此类推。voidM_Inc(unsignedintnum)//加速函数{if((num==1)&(M1_Flag!=0))//电机M1{//占空比增加2%EvaRegs.CMPR1=EvaRegs.CMPR1+375;if(EvaRegs.CMPR1=0x41EB){//最大占空比值为90%EvaRegs.CMPR1=0x41EB;}}elseif((num==2)&(M2_Flag!=0))//其它电机{……;//相同控制代码}}2.3系统初始化函数在系统初始化函数中,主要完成关闭看门狗电路、初始化PLL锁相环模块、设定高/低速时钟预定标器频率等,也就是说确定系统输出PWM波的频率,相关内容可以参阅文献[4]。以下主要列出该工程中用到的外设的初始化设置代码:voidInitSysCtrl(void){//关门狗电路、PLL模块、高低速时钟初始化[4]……;//EVA、EVB、SCIA模块时钟使能SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;}2.4I/O口初始化函数在输入输出引脚初始化函数中,主要完成工程用到引脚的功能与方向的设定,如引脚为功能引脚还是通用的输入输出引脚、是输入还是输出引脚等。其代码如下:voidInitGpio(void){EALLOW;//使能寄存器访问//设置串口的的发送和接收引脚为功能引脚GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4=1;GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5=1;//设置GPIOA0、A1等引脚为功能引脚GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1;GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=1;GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0=1;GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1=1;EDIS;//关闭寄存器访问}2.5串口初始化函数该工程利用串口的SCIA模块,其初始化包括设置1位停止位、8位数据位,禁止奇偶校验、禁止数据回送测试,使能串口的发送和接收数据功能,使能中断方式发送和接收数据,设置波特率等,最后重启SCI保存设置,完成初始化。主要代码如下所示:voidInitSci(void){//停止位、数据位、极性校验等设置[4]……;SciaRegs.SCIHBAUD=0x00;SciaRegs.SCILBAUD=0xE7;//波特率为9600//发送和接收数据使能,中断使能。重启SCI[4]……;}2.6事件管理器初始化函数在事件管理器初始化函数中,分别设定事件管理器EVA的定时器T1与EVB的定时器T3工作于连续增/减计数模式,定时器的时钟频率为37.5MHz,暂时禁止T1计数,使能T1内部时钟,设定T1的周期值为0x493E=18750(即相应的PWM波频率为1kHz),设定T1计数器初始值为0;使能比较单元的比较操作,全比较器输出,相应引脚PWM1~PWM6由比较逻辑驱动;立即重载寄存器保存设置;设定PWM1引脚为低电平有效,PWM2引脚为高电平有效,初始占空比值为0x1250(25%);设定死区定时器周期为10s,定时器预定标因子为(37.5MHz)/8≈4.69MHz,相应的死区时间约为10/(4.69×106)≈2.13μs。对于EVB的操作完全类似,代码如下所示:voidInitEv(void){/*EVA模块。设定T1工作模式、时钟频率、周期值,T1计数器初值。比较单元1使能及相关引脚设定[4]。*/……;/*PWM1、PWM2引脚初始低电平,保证电机初始停止状态。*/EvaRegs.ACTR.bit.CMP1ACT=0;EvaRegs.ACTR.bit.CMP2ACT=0;EvaRegs.CMPR1=0x1250;//占空比初始值25%EvaRegs.DBTCONA.bit.DBT=10;//死区定时器周期//死区定时器1使能EvaRegs.DBTCONA.bit.EDBT1=1;//死区定时器预定标因子EvaRegs.DBTCONA.bit.EDBT1=3;/*EVB模块。与EVA模块完全类似,只需把定时器T1换为T3,引脚PWM1与PWM2改为PWM7与PWM8,死区定时器控制寄存器DBTCONA改为DBTCONB即可。*/……;}2.7中断函数DSP采用中断方式响应串口数据的读取,所有对电机的控制操作皆在中断函数里完成,不同的控制命令调用不同的功能子函数。相应程序的代码结构如下:/*只要串口输入缓冲区有数据需要接收,CPU就//会执行此中断函数。*/interruptvoidSCIRXINTA_ISR(void){//利用数组保存控制命令数据Sci_VarRx[i]=SciaRegs.SCIRXBUF.all;i++;//主函数中已定义//根据命令代码格式,01为电机正反转识别代码if(Sci_VarRx[0]==0x0001){Rec_Manage(Sci_VarRx[0]);//电机正/反转}//02为电机停止识别代码elseif(Sci_VarRx[0]==0x0002){……;//电机停止}/*03、04分别对应电机加/减速、占空比设定、运行状态查询等识别代码。*/……;if(i==4){i=0;}//使得同组其他中断能够得到响应PieCtrl.PIEACK.bit.ACK9=1;EINT
本文标题:DSP电机控制系统驱动程序的设计
链接地址:https://www.777doc.com/doc-4865521 .html