拖动系统课程设计报告.doc_第1页
拖动系统课程设计报告.doc_第2页
拖动系统课程设计报告.doc_第3页
拖动系统课程设计报告.doc_第4页
拖动系统课程设计报告.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

拖动系统课程设计报告书题目:直流电机转速负反馈调节器专业:自动化 姓名: 学号:指导教师:任务书:设计题目:闭环控制的PWM直流调速系统设计与实现专题题目:直流电机速度闭环调速系统任务下达日期:2015年5月15日设计日期:2015年6月7日-2015年6月17日主要内容:1、测定综合实验中所用控制对象的参数(由实验完成)。2、根据给定指标设计转速调节器,并选择调节器参数和具体实现电路。3、按设计结果组成系统,以满足给定指标。4、研究参数变化对系统性能的影响。5、在变工况(加载)下进行调试。要求:1、能独立设置电机速度(按键设置或滑动变阻器设置或上位机设置);2、能显示当前电机的实际速度(单位为:r/min);3、能控制电机启动、停止、正反转、软启动和软制动;4、给电机加载后,速度能迅速调节回给定值;摘要本文章介绍了有TIM4C123GH6PM芯片以及带编码器的直流电机、L298电机驱动模块、矩阵键盘,串口四位数码管构成的PID转速闭环控制系统。由芯片的正交编码模块对电机自带的编码器产生的信号进行正交解码得到速度值,并由芯片将其与设定值进行比较的到偏差,再由偏差产生的直接控制作用去消除偏差。本文中不仅介绍了基础TIM4C123GH6PM的转速控制系统的软件设计,还涉及了硬件的设计方法。本文介绍系统不仅可以实现自动调速,还可实现电机的正反转以及启停控制,以及对电机转向进行标志。关键词:直流电机;PID闭环控制;TM4C123GH6PM;矩阵键盘;串口四位数码管目录1 系统概述12 硬件设计12.1 控制器12.2 按键模块22.3 串口四位数码管22.4 L298电机驱动模块32.5 直流电机42.5.1 直流电机参数42.5.2 编码器参数42.5.3 信号线说明53 软件设计53.1 主函数部分53.2 速度计算模块53.3 速度显示模块53.4 按键检测模块63.5 PID控制模块84 系统调试105 结束语116 参考文献117 附录12正文:1. 系统概述本次设计以数字PID为控制算法,以TIM4C123GH6PM为控制芯片,运用TIM4的PWM模块产生受PID算法控制的PWM信号驱动L298N电机驱动模块进而驱动电机,并用TIM4的正交编码模块对编码器产生的脉冲进行计数,实现转速闭环控制,达到转速无静差的目的。2. 硬件电路设计硬件连接示意图2.1. 控制器采用TIM4C123GH6PM,TIM4具有高速,低功耗的特点,而且自带PWM模块和正交编码模块,不仅控制性能好而且简便易于实现。并且自带3色LED都灯。可以作为停止,正转,反转的信号标志。其管脚如下:2.2. 按键模块按键为自己焊接的43矩阵键盘,采用扫描式方法,在A2,A3,A 4依次给低电平,B04进行检测,根据组合进行判定数字2.3. 串口四位数码管2.4. L298电机驱动模块2.5. 直流电机2.5.1. 直流电机参数:电机的电枢电阻11欧。工作电压可从3V至30V。堵转电流=电压 / 电枢电阻。 18v时空转转速9000rpm,其他电压下的转速可大致按比例计算。2.5.2. 编码器参数:共输出两路正交(相位相差90)脉冲信号。分辨率334,意味着电机每旋转一周输出334个周期脉冲。如果把每一路脉冲的上沿和下沿都利用起来,相当于四倍频,分辨率可以达到344=1336。334线AB相编码器,内含整形电路,输出是方波,可直联单片机IO。编码器供电电压为5V,AB相输出,在A相或B相的上升或下降沿时判断对方的电平,就可以判断电机的转动方向。2.5.3. 信号线说明:A相方波输出,B相方波输出,VCC,GND是编码器电源,必须稳压。电机1,电机2是直流电机的电源。3. 软件设计3.1. 主函数部分该函数先要要设置系统时钟,在函数中系统时钟为50MHz,然后便要对本次课程设计中数码管,按键所需要的GPIO口进行初始化配置。接着要对芯片上的PWM模块、正交编码模块进行初始化配置。然后要设置电机的初始状态。各个部分初始化完毕后,设计主循环部分的函数,速度检测应该放到最前,因为数码管显示和PID控制都需要用到检测的速度,然后便是数码管显示显示实时速度,按键检测检测完毕后,如果按键输入速度,便要通过PID控制达到所设置的速度。然后往复循环。.1.3.2. 速度计算模块由于正交编码模块采用双边沿触发设置,故电机运行一圈的脉冲数为3344。程序如下:speed_signal=QEIVelocityGet(QEI1_BASE);/得到脉冲个数speed=(speed_signal*50*60)/(4*334);/速度计算speedDirectionGet=QEIDirectionGet(QEI1_BASE);/得到电机转速方向3.3. 速度显示函数由于按键输入时要显示出按键值,所以加入输入数字个数检测变量,在无按键按下的情况显示速度,在按键按下时,显示按键值,直到四个数字输完,显示全部的四位数字,才切换会速度显示。程序如下:if(jianceTime=0) SpeedDisplay();else if(jianceTime=0xFF)for(i=0;i1000;i+)LED4_Display(); jianceTime=0;elseLED4_Display();3.4. 按键检测模块由于加入防抖动延时,按键函数分为两部分,一部分为按键按下检测,另一部分为按键值检测按键按下检测程序:GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,0);if(!(GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0)&GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_1)&GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_2)&GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_3)SysCtlDelay(SysCtlClockGet()/100);if(!(GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0)&GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_1)&GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_2)&GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_3)shaomiao(3-jianceTime);GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,0);while(!(GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0)&GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_1)&GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_2)&GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_3)/按键释放检测按键值检测程序:GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,0xFF);GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2,0);if(!GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0)LED1i=1;if(!GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_1)LED1i=4;if(!GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_2)LED1i=7;if(!GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_3)jianceTime=0xFF;judge_forward_reverse();return;GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2,GPIO_PIN_2);GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3,0);if(!GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0)LED1i=2;if(!GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_1)LED1i=5;if(!GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_2)LED1i=8;if(!GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_3)LED1i=0;GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3,GPIO_PIN_3);GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,0);if(!GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0)LED1i=3;if(!GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_1)LED1i=6;if(!GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_2)LED1i=9;if(!GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_3)LED0=11;LED1=11;LED2=11;LED3=11;jianceTime=0xFF;stop();return;GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,GPIO_PIN_4);3.5. PID控制模块由于电机的机械特性,导致一个PID参数难以对电机转速进行宽范围的调控,经测试尤其200r/min一下,难以正常运转,因此进行分段PID控制if(setspeed5000)out=5000;if(out=-5000)out=-5000;past_uk=out;e0=e1;e1=e2;PulseWidth=PulseWidth+PulseWidth*(out/5000);if(PulseWidth1)PulseWidth=1;if(setspeed=200) /200r/min以上PID控制Kp=0.04;Ki=0.000001;Kd=0.00001;e2=setspeed-speed;uk=Kp*(e2-e1)+Ki*e2+Kd*(e2-2*e1+e0);out=uk+past_uk;if(out5000)out=5000;if(out=-5000)out=-5000;past_uk=out;e0=e1;e1=e2;PulseWidth=PulseWidth+PulseWidth*(out/5000);if(PulseWidth1)PulseWidth=1;govern_speed();4. 系统调试本次课程设计的程序,我是一个模块一个模块依次编写的,首先是显示模块,显示模块的程序为51程序移植,这个模块唯一难点便是M4的GPIO口操作要比51复杂很多,除了花点时间之外,并没有太多困难。在显示模块之后是按键模块,由于用的矩阵键盘,除了需要配置较多GPIO口之外,便是程序的逻辑问题。刚开始我的键盘扫描程序编写的是一个较大的子程序,编完程序调试时变出了问题,按了2下1,数码管便显示4个1.经检查是没有加防抖动延时,因为用的矩阵键盘,按下检测比较麻烦,不知道怎么检测哪一个按钮,便起了侥幸心理,没想到就问题。后来经过思考,按下检测不需要知道哪个按键按下,于是便让A1A 3口均输出低电平,让B0B3口进行检测,只要有低电平按下,便进行防抖延时。加入防抖延时后,仍然不能完全解决问题,经过思考,系统时钟较快,如果按下时,系统可以执行两遍扫描程序,那便依然会出现上述问题,于是还要加按键释放检测。加了按键释放检测,上述问题便迎刃而解。所以一个键盘扫描程序用必须要有防抖延时和释放检测这两个环节。第三个模块就是PWM模块,这个模块是芯片上就有的功能,初始化配置之后便可使用。因为模块这个要配合按键输入占空比进行调速,首先第一个问题便是修改按键程序与之协调,并要添加正转,反转,停止和占空比设置函数。在程序编写完毕后,PWM调速已经没有问题,但是启停正反转无法实现,还有一个问题便是停止后,让电机启动要进入哪个状态。主要问题便是电机的正反转问题,刚开始正反转便是让一路PWM占空比为0,另一路有占空比不为0进行正反转控制,但是经过示波器观察发现,占空比不为0时无任何问题,但是占空比为0时,PWM输出管脚竟然是高电平,与理想中不一样。于是,设想如果PWM为0不能实现高电平,那么关掉PWM发生器,PWM发生器输出管脚应该就为低电平,可是经过测试后发现,PWM输出管脚依旧为高电平,无奈只能去找资料还有查看M4函数定义以及数据手册,然后经过大量测试发现将PWM输出管脚输出功能关闭之后,PWM输出管脚为低电平,才解决问题。第四部分便是正交编码模块,由于TI的数据手册虽然介绍的正交编码模块,但是没有讲解如何用函数去配置正交编码模块,就连TI的官方例程都没关于正交编码的程序,无奈只能去查找TI的函数库以及用其他厂商的M4芯片正交编码的程序作为参考,但是当程序编写出来后,并不能像想象中一样运行,经测试正交编码输入信号正常,而且由于其他模块在此模块前均正常工作,在加此模块后,除了初始化正交编码模块程序外,就加了用正交编码模块的速度获取函数以及电机运转反向获取函数然后送与数码管进行显示,所以问题的出现极大可能出现在正交编码的初始配置上,因为正交编码的初始化函数并不是TI提供的,经过查阅大量的TIM4系列类似本芯片的正交编码函数以及TI论坛的大量程序,发现初始化配置中缺少了GPIOPinConfigure(GPIO_PC5_PHA1);这一句GPIO复用功能配置函数。加上此函数后,程序运行正常,模块功能正常。5. 结束语在这次课程设计中,由于用了很多刚接触的东西,我学会了很多,例如在这次我用了刚接触的串口4位数码管,还有矩阵按键的原理虽然原来知道,但也是第一次变为现实。最为重要的我知道了如何自学一种芯片,原来的我只知道跟着例程做,现在我知道了要去查这个芯片的函数库,我也知道了如何运用一款芯片的数据手册。所以这次课设不仅提高了我对电机拖动的理解,最为重要的是提高了我的自学能力。参考文献:【1】 叶朝辉:TM4C123微处理器原理与实践。北京:清华大学出版社,2014.01.01【2】 百度文库.直流电机PID控制。网址:/link?url=nLy9H32VHrk6i0Bd6TstcrruXn-w-yZMtRtVtzUpEhMSsadKIFCPZJWoAFJi6rTOuzKFxxt9hzXpBwTU6RMl71RqVhrbUgDQfkESjABk8Pa 【3】 阮毅、陈伯时 电力拖动自动控制系统运动控制系统。机械工业出版社2015.01【4】 Tiva TM4C123FH6PM 微控制器数据手册【5】 德州仪器在线技术支持社区/question_answer/microcontrollers/tiva_arm_cortex/f/96/t/59991.aspx附录课设程序:#include #include #include inc/hw_memmap.h#include driverlib/sysctl.h#include driverlib/gpio.h#include driverlib/pin_map.h#include driverlib/pwm.h#include driverlib/qei.h#define uchar unsigned char#define PERIOD_TIMESysCtlClockGet()/2000#define DIO GPIO_PIN_1#define RCLK GPIO_PIN_2#define SCLK GPIO_PIN_3int anjianzhi=1;uchar LED8;uchar LED18;uchar jianceTime=0;double PulseWidth;unsigned long speed_signal=0;uint32_t setspeed=0,speed=0;int speedDirectionGet=0;int e3;double uk,past_uk,out;uchar speedstop=0;/*PWM初始化*/void Init_PWM()PulseWidth=0.3;/ 设置PWM时钟和系统时钟一致SysCtlPWMClockSet(SYSCTL_PWMDIV_1); / 使能PWM外设SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);/ 使能外设端口SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);/设置对应管脚的PWM信号功能GPIOPinConfigure(GPIO_PB4_M0PWM2);GPIOPinConfigure(GPIO_PB7_M0PWM1);/设置PWM信号端口GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_4);GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_7);/PWM生成器配置PWMGenConfigure(PWM0_BASE, PWM_GEN_1, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);PWMGenConfigure(PWM0_BASE, PWM_GEN_0, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);/设置PWM信号周期PWMGenPeriodSet(PWM0_BASE, PWM_GEN_1, PERIOD_TIME);PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, PERIOD_TIME);/设置PWM信号占空比PWMPulseWidthSet(PWM0_BASE, PWM_OUT_2,PulseWidth*PERIOD_TIME);PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1,PulseWidth*PERIOD_TIME);/ 使能PWM输出端口PWMOutputState(PWM0_BASE, PWM_OUT_2_BIT, false);PWMOutputState(PWM0_BASE, PWM_OUT_1_BIT, false);/ 使能PWM生成器PWMGenEnable(PWM0_BASE, PWM_GEN_1);PWMGenEnable(PWM0_BASE, PWM_GEN_0);/ 使能PWm生成器模块的及时功能.PWMSyncTimeBase(PWM0_BASE, PWM_GEN_1);PWMSyncTimeBase(PWM0_BASE, PWM_GEN_0);/*电机控制* */void govern_speed(void)PWMPulseWidthSet(PWM0_BASE, PWM_OUT_2, PulseWidth*PERIOD_TIME);PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1, PulseWidth*PERIOD_TIME);void forward(void)speedstop=0;PWMOutputState(PWM0_BASE, PWM_OUT_2_BIT, true);PWMOutputState(PWM0_BASE, PWM_OUT_1_BIT, false);void reverse(void)speedstop=0;PWMOutputState(PWM0_BASE, PWM_OUT_1_BIT, true);PWMOutputState(PWM0_BASE, PWM_OUT_2_BIT, false);void stop(void)speedstop=1;PWMOutputState(PWM0_BASE, PWM_OUT_2_BIT, false);PWMOutputState(PWM0_BASE, PWM_OUT_1_BIT, false);/*数码管显示*/unsigned char LED_0F= /0 1 2 34 5 6 78 90xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xbf;void Init_LED(void)SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, DIO|RCLK|SCLK);SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);void LED_OUT(uchar X)uchar i;for(i=8;i=1;i-)if (X&0x80)GPIOPinWrite(GPIO_PORTE_BASE, DIO|RCLK|SCLK, DIO);elseGPIOPinWrite(GPIO_PORTE_BASE,DIO,0);X=1;GPIOPinWrite(GPIO_PORTE_BASE,SCLK, 0);GPIOPinWrite(GPIO_PORTE_BASE,DIO|RCLK|SCLK, SCLK);void LED4_Display (void)uchar i;/显示第一位i = LED_0FLED0;LED_OUT(i);LED_OUT(0x01);GPIOPinWrite(GPIO_PORTE_BASE, RCLK, 0);GPIOPinWrite(GPIO_PORTE_BASE, DIO|RCLK|SCLK, RCLK);/显示第二位i = LED_0FLED1;LED_OUT(i);LED_OUT(0x02);GPIOPinWrite(GPIO_PORTE_BASE, RCLK, 0);GPIOPinWrite(GPIO_PORTE_BASE, DIO|RCLK|SCLK, RCLK);/显示第三位i = LED_0FLED2;LED_OUT(i);LED_OUT(0x04);GPIOPinWrite(GPIO_PORTE_BASE, RCLK, 0);GPIOPinWrite(GPIO_PORTE_BASE, DIO|RCLK|SCLK, RCLK);/显示第四位i = LED_0FLED3;LED_OUT(i);LED_OUT(0x08);GPIOPinWrite(GPIO_PORTE_BASE, RCLK,0);GPIOPinWrite(GPIO_PORTE_BASE, DIO|RCLK|SCLK, RCLK);void SpeedDisplay(void)if(speed=0)GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_1);else if(speedDirectionGet=1)GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_3);elseGPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_2);LED3=speed/1000;LED2=speed%1000/100;LED1=speed%100/10;LED0=speed%10;LED4_Display();void LED_Display()int i;if(jianceTime=0)SpeedDisplay();else if(jianceTime=0xFF)for(i=0;i2000)LED0=LED1=LED2=LED3=11;elsefor(x=0;x=3;x+)LEDx=LED1x;if(y!=0)setspeed=y;elsestop();/* *速度计算* */void SpeedCompute(void)speed_signal=QEIVelocityGet(QEI1_BASE);speed=(speed_signal*50*60)/(4*334);speedDirectionGet=QEIDirectionGet(QEI1_BASE);/* *正交编码初始化* */void Init_QEI(void)SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI1); GPIOPinConfigure(GPIO_PC5_PHA1); GPIOPinTypeQEI(GPIO_PORTC_BASE, GPIO_PIN_5); GPIOPinConfigure(GPIO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论