还剩24页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
拖动系统课程设计报告书题目直流电机转速负反馈调节器专业自动化姓名学号指导教师任务书设计题目闭环控制的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.4L298电机驱动模块···························
32.5直流电机·······························
42.
5.1直流电机参数··························
42.
5.2编码器参数··························
42.
5.3__线说明···························53软件设计·································
53.1主函数部分·····························
53.2速度计算模块·····························
53.3速度显示模块·····························
53.4按键检测模块·····························
63.5PID控制模块·····························84系统调试································105结束语·································116____································117附录··································12正文
1.系统概述本次设计以数字PID为控制算法,以TIM4C123GH6PM为控制芯片,运用TIM4的PWM模块产生受PID算法控制的PWM__驱动L298N电机驱动模块进而驱动电机,并用TIM4的正交编码模块对编码器产生的脉冲进行计数,实现转速闭环控制,达到转速无静差的目的
2.硬件电路设计硬件连接示意图
2.
1.控制器采用TIM4C123GH6PM,TIM4具有高速,低功耗的特点,而且自带PWM模块和正交编码模块,不仅控制性能好而且简便易于实现并且自带3色LED都灯可以作为停止,正转,反转的__标志其管脚如下
2.
2.
2.
3.按键模块按键为自己焊接的4×3矩阵键盘,采用扫描式方法,在A2A3A4依次给低电平,B0~4进行检测,根据组合进行判定数字
2.
4.串口四位数码管
2.
5.
2.
6.L298电机驱动模块
2.
7.
2.
8.直流电机
2.
8.
1.直流电机参数电机的电枢电阻11欧工作电压可从3V至30V堵转电流=电压/电枢电阻18v时空转转速9000rpm,其他电压下的转速可大致按比例计算
2.
8.
2.编码器参数共输出两路正交(相位相差90°)脉冲__分辨率334,意味着电机每旋转一周输出334个周期脉冲如果把每一路脉冲的上沿和下沿都利用起来,相当于四倍频,分辨率可以达到34×4=1336334线AB相编码器,内含整形电路,输出是方波,可直联单片机IO编码器供电电压为5V,AB相输出,在A相或B相的上升或下降沿时判断对方的电平,就可以判断电机的转动方向
2.
8.
3.
2.
8.
4.__线说明A相方波输出,B相方波输出,VCC,GND是编码器电源,必须稳压电机1,电机2是直流电机的电源
3.软件设计
3.
1.主函数部分该函数先要要设置系统时钟,在函数中系统时钟为50MHz,然后便要对本次课程设计中数码管,按键所需要的GPIO口进行初始化配置接着要对芯片上的PWM模块、正交编码模块进行初始化配置然后要设置电机的初始状态各个部分初始化完毕后,设计主循环部分的函数,速度检测应该放到最前,因为数码管显示和PID控制都需要用到检测的速度,然后便是数码管显示显示实时速度,按键检测检测完毕后,如果按键输入速度,便要通过PID控制达到所设置的速度然后往复循环
1.
2.
3.
3.
1.
3.
2.速度计算模块由于正交编码模块采用双边沿触发设置,故电机运行一圈的脉冲数为334×4程序如下speed_signal=QEIVelocityGetQEI1_BASE;//得到脉冲个数speed=speed_signal*50*60/4*334;//速度计算speedDirectionGet=QEIDirectionGetQEI1_BASE;//得到电机转速方向
3.
3.速度显示函数由于按键输入时要显示出按键值,所以加入输入数字个数检测变量,在无按键按下的情况显示速度,在按键按下时,显示按键值,直到四个数字输完,显示全部的四位数字,才切换会速度显示程序如下ifjian__Time==0{SpeedDisplay;}elseifjian__Time==0xFF{fori=0;i1000;i++{LED4_Display;}jian__Time=0;}else{LED4_Display;}
3.
4.按键检测模块由于加入防抖动延时,按键函数分为两部分,一部分为按键按下检测,另一部分为按键值检测按键按下检测程序GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_40;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_0GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_1GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_2GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_3{SysCtlDelaySysCtlClockGet/100;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_0GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_1GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_2GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_3{shaomiao3-jian__Time;}GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_40;while!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_0GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_1GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_2GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_3//按键释放检测{}}按键值检测程序GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_40xFF;GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_20;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_0LED1[i]=1;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_1LED1[i]=4;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_2LED1[i]=7;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_3{jian__Time=0xFF;judge_forward_reverse;return;}GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_2GPIO_PIN_2;GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_30;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_0LED1[i]=2;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_1LED1[i]=5;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_2LED1[i]=8;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_3LED1[i]=0;GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_3GPIO_PIN_3;GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_40;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_0LED1[i]=3;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_1LED1[i]=6;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_2LED1[i]=9;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_3{LED
[0]=11;LED
[1]=11;LED
[2]=11;LED
[3]=11;jian__Time=0xFF;stop;return;}GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_4GPIO_PIN_4;
3.
5.PID控制模块由于电机的机械特性,导致一个PID参数难以对电机转速进行宽范围的调控,经测试尤其200r/min一下,难以正常运转,因此进行分段PID控制ifsetspeed200{//200r/min以下PID控制Kp=
0.001;Ki=
0.00000005;//
0.000011;//
0.000064;//
0.00012//
0.0001;///
0.000081Kd=
0.2;e
[2]=setspeed-speed;uk=Kp*e
[2]-e
[1]+Ki*e
[2]+Kd*e
[2]-2*e
[1]+e
[0];out=uk+past_uk;ifout5000{out=5000;}ifout=-5000{out=-5000;}past_uk=out;e
[0]=e
[1];e
[1]=e
[2];PulseWidth=PulseWidth+PulseWidth*out/5000;ifPulseWidth
0.3{PulseWidth=
0.3;}ifPulseWidth1{PulseWidth=1;}}ifsetspeed=200{//200r/min以上PID控制Kp=
0.04;Ki=
0.000001;Kd=
0.00001;e
[2]=setspeed-speed;uk=Kp*e
[2]-e
[1]+Ki*e
[2]+Kd*e
[2]-2*e
[1]+e
[0];out=uk+past_uk;ifout5000{out=5000;}ifout=-5000{out=-5000;}past_uk=out;e
[0]=e
[1];e
[1]=e
[2];PulseWidth=PulseWidth+PulseWidth*out/5000;ifPulseWidth
0.3{PulseWidth=
0.3;}ifPulseWidth1{PulseWidth=1;}}govern_speed;
4.
5.系统调试本次课程设计的程序,我是一个模块一个模块依次编写的,首先是显示模块,显示模块的程序为51程序移植,这个模块唯一难点便是M4的GPIO口操作要比51复杂很多,除了花点时间之外,并没有太多困难在显示模块之后是按键模块,由于用的矩阵键盘,除了需要配置较多GPIO口之外,便是程序的逻辑问题刚开始我的键盘扫描程序编写的是一个较大的子程序,编完程序调试时变出了问题,按了2下1,数码管便显示4个
1.经检查是没有加防抖动延时,因为用的矩阵键盘,按下检测比较麻烦,不知道怎么检测哪一个按钮,便起了侥幸心理,没想到就问题后来经过思考,按下检测不需要知道哪个按键按下,于是便让A1~A3口均输出低电平,让B0~B3口进行检测,只要有低电平按下,便进行防抖延时加入防抖延时后,仍然不能完全解决问题,经过思考,系统时钟较快,如果按下时,系统可以执行两遍扫描程序,那便依然会出现上述问题,于是还要加按键释放检测加了按键释放检测,上述问题便迎刃而解所以一个键盘扫描程序用必须要有防抖延时和释放检测这两个环节第三个模块就是PWM模块,这个模块是芯片上就有的功能,初始化配置之后便可使用因为模块这个要配合按键输入占空比进行调速,首先第一个问题便是修改按键程序与之协调,并要添加正转,反转,停止和占空比设置函数在程序编写完毕后,PWM调速已经没有问题,但是启停正反转无法实现,还有一个问题便是停止后,让电机启动要进入哪个状态主要问题便是电机的正反转问题,刚开始正反转便是让一路PWM占空比为0另一路有占空比不为0进行正反转控制,但是经过示波器观察发现,占空比不为0时无任何问题,但是占空比为0时,PWM输出管脚竟然是高电平,与理想中不一样于是,设想如果PWM为0不能实现高电平,那么关掉PWM发生器,PWM发生器输出管脚应该就为低电平,可是经过测试后发现,PWM输出管脚依旧为高电平,无奈只能去找资料还有查看M4函数定义以及数据手册,然后经过大量测试发现将PWM输出管脚输出功能关闭之后,PWM输出管脚为低电平,才解决问题第四部分便是正交编码模块,由于TI的数据手册虽然介绍的正交编码模块,但是没有讲解如何用函数去配置正交编码模块,就连TI的__例程都没关于正交编码的程序,无奈只能去查找TI的函数库以及用其他厂商的M4芯片正交编码的程序作为参考,但是当程序编写出来后,并不能像想象中一样运行,经测试正交编码输入__正常,而且由于其他模块在此模块前均正常工作,在加此模块后,除了初始化正交编码模块程序外,就加了用正交编码模块的速度获取函数以及电机运转反向获取函数然后送与数码管进行显示,所以问题的出现极大可能出现在正交编码的初始配置上,因为正交编码的初始化函数并不是TI提供的,经过查阅大量的TIM4系列类似本芯片的正交编码函数以及TI__的大量程序,发现初始化配置中缺少了GPIOPinConfigureGPIO_PC5_PHA1;这一句GPIO复用功能配置函数加上此函数后,程序运行正常,模块功能正常
5.
6.结束语在这次课程设计中,由于用了很多刚接触的东西,我学会了很多,例如在这次我用了刚接触的串口4位数码管,还有矩阵按键的原理虽然原来知道,但也是第一次变为现实最为重要的我知道了如何自学一种芯片,原来的我只知道跟着例程做,现在我知道了要去查这个芯片的函数库,我也知道了如何运用一款芯片的数据手册所以这次课设不仅提高了我对电机拖动的理解,最为重要的是提高了我的自学能力____【1】叶朝辉TM4C123微处理器原理与实践北京清华大学出版社,
2014.
01.01【2】百度文库.直流电机PID控制网址http://wenku.baidu.com/linkurl=nLy9H32VHrk6i0Bd6TstcrruXn-w-yZMtRtVtzUpEhMSsadKIFCPZJWoAFJi6rTOuzKFxxt9hzXpBwTU6RMl71RqVhrbUgDQfkESjABk8Pa【3】阮毅、陈伯时电力拖动自动控制系统——运动控制系统机械工业出版社
2015.01【4】Tiva™TM4C123FH6PM微控制器数据手册【5】德州仪器在线技术支持社区http://___.deyisupport.com/question_answer/microcontrollers/tiva_arm_cortex/f/96/t/
59991.aspx附录课设程序#includestdint.h#includestdbool.h#includeinc/hw_mem__p.h#includedriverlib/sysctl.h#includedriverlib/gpio.h#includedriverlib/pin___p.h#includedriverlib/pwm.h#includedriverlib/qei.h#defineucharunsignedchar#definePERIOD_TIMESysCtlClockGet/2000#defineDIOGPIO_PIN_1#defineRCLKGPIO_PIN_2#defineSCLKGPIO_PIN_3intanjianzhi=1;ucharLED
[8];ucharLED1
[8];ucharjian__Time=0;doublePulseWidth;unsignedlongspeed_signal=0;uint32_tsetspeed=0speed=0;intspeedDirectionGet=0;inte
[3];doubleukpast_ukout;ucharspeedstop=0;/***************************************************************************************PWM初始化*********************************************************************************************/voidInit_PWM{PulseWidth=
0.3;//设置PWM时钟和系统时钟一致SysCtlPWMClockSetSYSCTL_PWMDIV_1;//使能PWM外设SysCtlPeripheralEnableSYSCTL_PERIPH_PWM0;//使能外设端口SysCtlPeripheralEnableSYSCTL_PERIPH_GPIOB;//设置对应管脚的PWM__功能GPIOPinConfigureGPIO_PB4_M0PWM2;GPIOPinConfigureGPIO_PB7_M0PWM1;//设置PWM__端口GPIOPinTypePWMGPIO_PORTB_BASEGPIO_PIN_4;GPIOPinTypePWMGPIO_PORTB_BASEGPIO_PIN_7;//PWM生成器配置PWMGenConfigurePWM0_BASEPWM_GEN_1PWM_GEN_MODE_DOWN|PWM_GEN_MODE_NO_SYNC;PWMGenConfigurePWM0_BASEPWM_GEN_0PWM_GEN_MODE_DOWN|PWM_GEN_MODE_NO_SYNC;//设置PWM__周期PWMGenPeriodSetPWM0_BASEPWM_GEN_1PERIOD_TIME;PWMGenPeriodSetPWM0_BASEPWM_GEN_0PERIOD_TIME;//设置PWM__占空比PWMPulseWidthSetPWM0_BASEPWM_OUT_2PulseWidth*PERIOD_TIME;PWMPulseWidthSetPWM0_BASEPWM_OUT_1PulseWidth*PERIOD_TIME;//使能PWM输出端口PWMOutputStatePWM0_BASEPWM_OUT_2_BITfalse;PWMOutputStatePWM0_BASEPWM_OUT_1_BITfalse;//使能PWM生成器PWMGenEnablePWM0_BASEPWM_GEN_1;PWMGenEnablePWM0_BASEPWM_GEN_0;//使能PWm生成器模块的及时功能.PWMSyncTimeBasePWM0_BASEPWM_GEN_1;PWMSyncTimeBasePWM0_BASEPWM_GEN_0;}/*******************************************************************************************电机控制*******************************************************************************************/voidgovern_speedvoid{PWMPulseWidthSetPWM0_BASEPWM_OUT_2PulseWidth*PERIOD_TIME;PWMPulseWidthSetPWM0_BASEPWM_OUT_1PulseWidth*PERIOD_TIME;}voidforwardvoid{speedstop=0;PWMOutputStatePWM0_BASEPWM_OUT_2_BITtrue;PWMOutputStatePWM0_BASEPWM_OUT_1_BITfalse;}voidreversevoid{speedstop=0;PWMOutputStatePWM0_BASEPWM_OUT_1_BITtrue;PWMOutputStatePWM0_BASEPWM_OUT_2_BITfalse;}voidstopvoid{speedstop=1;PWMOutputStatePWM0_BASEPWM_OUT_2_BITfalse;PWMOutputStatePWM0_BASEPWM_OUT_1_BITfalse;}/*******************************************************************************************数码管显示*****************************************************************************************/unsignedcharLED_0F[]={//01234567890xC00xF90xA40xB00x990x920x820xF80x800x900xFF0xbf};voidInit_LEDvoid{SysCtlPeripheralEnableSYSCTL_PERIPH_GPIOE;GPIOPinTypeGPIOOutputGPIO_PORTE_BASEDIO|RCLK|SCLK;SysCtlPeripheralEnableSYSCTL_PERIPH_GPIOF;GPIOPinTypeGPIOOutputGPIO_PORTF_BASEGPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;}voidLED_OUTucharX{uchari;fori=8;i=1;i--{ifX0x80GPIOPinWriteGPIO_PORTE_BASEDIO|RCLK|SCLKDIO;elseGPIOPinWriteGPIO_PORTE_BASEDIO0;X=1;GPIOPinWriteGPIO_PORTE_BASESCLK0;GPIOPinWriteGPIO_PORTE_BASEDIO|RCLK|SCLKSCLK;}}voidLED4_Displayvoid{uchari;//显示第一位i=LED_0F[LED
[0]];LED_OUTi;LED_OUT0x01;GPIOPinWriteGPIO_PORTE_BASERCLK0;GPIOPinWriteGPIO_PORTE_BASEDIO|RCLK|SCLKRCLK;//显示第二位i=LED_0F[LED
[1]];LED_OUTi;LED_OUT0x02;GPIOPinWriteGPIO_PORTE_BASERCLK0;GPIOPinWriteGPIO_PORTE_BASEDIO|RCLK|SCLKRCLK;//显示第三位i=LED_0F[LED
[2]];LED_OUTi;LED_OUT0x04;GPIOPinWriteGPIO_PORTE_BASERCLK0;GPIOPinWriteGPIO_PORTE_BASEDIO|RCLK|SCLKRCLK;//显示第四位i=LED_0F[LED
[3]];LED_OUTi;LED_OUT0x08;GPIOPinWriteGPIO_PORTE_BASERCLK0;GPIOPinWriteGPIO_PORTE_BASEDIO|RCLK|SCLKRCLK;}voidSpeedDisplayvoid{ifspeed==0{GPIOPinWriteGPIO_PORTF_BASEGPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3GPIO_PIN_1;}elseifspeedDirectionGet==1{GPIOPinWriteGPIO_PORTF_BASEGPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3GPIO_PIN_3;}else{GPIOPinWriteGPIO_PORTF_BASEGPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3GPIO_PIN_2;}LED
[3]=speed/1000;LED
[2]=speed%1000/100;LED
[1]=speed%100/10;LED
[0]=speed%10;LED4_Display;}voidLED_Display{inti;ifjian__Time==0{SpeedDisplay;}elseifjian__Time==0xFF{fori=0;i1000;i++{LED4_Display;}jian__Time=0;}else{LED4_Display;}}/********************************************************************************************按键程序******************************************************************************************/voidInit_anjianvoid//按键初始化{//使能GPIO口SysCtlPeripheralEnableSYSCTL_PERIPH_GPIOB;SysCtlPeripheralEnableSYSCTL_PERIPH_GPIOA;GPIOPinTypeGPIOOutputGPIO_PORTA_BASEGPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;GPIOPinTypeGPIOInputGPIO_PORTB_BASEGPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;GPIOPadConfigSetGPIO_PORTB_BASEGPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3GPIO_STRENGTH_2__GPIO_PIN_TYPE_STD_WPU;GPIOPinWriteGPIO_PORTB_BASEGPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_30xFF;GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_40xFF;}voidjudge_forward_reversevoid{ifspeed!=0speedDirectionGet==1{reverse;return;}ifspeed==0|speedDirectionGet==-1{forward;return;}}voidshaomiaoi{GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_40xFF;GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_20;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_0LED1[i]=1;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_1LED1[i]=4;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_2LED1[i]=7;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_3{jian__Time=0xFF;judge_forward_reverse;return;}GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_2GPIO_PIN_2;GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_30;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_0LED1[i]=2;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_1LED1[i]=5;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_2LED1[i]=8;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_3LED1[i]=0;GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_3GPIO_PIN_3;GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_40;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_0LED1[i]=3;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_1LED1[i]=6;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_2LED1[i]=9;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_3{LED
[0]=11;LED
[1]=11;LED
[2]=11;LED
[3]=11;jian__Time=0xFF;stop;return;}GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_4GPIO_PIN_4;//按键值显示LED
[0]=LED1[i];LED
[1]=10;LED
[2]=10;LED
[3]=10;jian__Time++;}voidkeyvoid//按键主函数{intxy;GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_40;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_0GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_1GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_2GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_3{SysCtlDelaySysCtlClockGet/100;if!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_0GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_1GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_2GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_3{shaomiao3-jian__Time;}GPIOPinWriteGPIO_PORTA_BASEGPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_40;while!GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_0GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_1GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_2GPIOPinReadGPIO_PORTB_BASEGPIO_PIN_3{}}ifjian__Time==4{jian__Time=0xFF;y=LED1
[3]*1000+LED1
[2]*100+LED1
[1]*10+LED1
[0];ify2000{LED
[0]=LED
[1]=LED
[2]=LED
[3]=11;}else{forx=0;x=3;x++{LED[x]=LED1[x];}ify!=0{setspeed=y;}else{stop;}}}}/******************************************************************************速度计算*****************************************************************************/voidSpeedComputevoid{speed_signal=QEIVelocityGetQEI1_BASE;speed=speed_signal*50*60/4*334;speedDirectionGet=QEIDirectionGetQEI1_BASE;}/************************************************************************正交编码初始化******************************************************************************/voidInit_QEIvoid{SysCtlPeripheralEnableSYSCTL_PERIPH_GPIOC;SysCtlPeripheralEnableSYSCTL_PERIPH_QEI1;GPIOPinConfigureGPIO_PC5_PHA1;GPIOPinTypeQEIGPIO_PORTC_BASEGPIO_PIN_5;GPIOPinConfigureGPIO_PC6_PHB1;GPIOPinTypeQEIGPIO_PORTC_BASEGPIO_PIN_6;GPIOPadConfigSetGPIO_PORTC_BASEGPIO_PIN_5GPIO_STRENGTH_4__GPIO_PIN_TYPE_STD;GPIOPadConfigSetGPIO_PORTC_BASEGPIO_PIN_6GPIO_STRENGTH_4__GPIO_PIN_TYPE_STD;QEIConfigureQEI1_BASEQEI_CONFIG_CAPTURE_A_B|QEI_CONFIG_NO_RESET|QEI_CONFIG_QUADRATURE|QEI_CONFIG_SWAP0;QEIVelocityConfigureQEI1_BASEQEI_VELDIV_1SysCtlClockGet/50;QEIVelocityEnableQEI1_BASE;QEIEnableQEI1_BASE;}/*************************************************************************PID控制********************************************************************************/voidPID_control{ifspeedstop==1{return;}floatKpKiKd;ifsetspeed200{Kp=
0.001;Ki=
0.00000005;//
0.000011;//
0.000064;//
0.00012//
0.0001;///
0.000081Kd=
0.2;e
[2]=setspeed-speed;uk=Kp*e
[2]-e
[1]+Ki*e
[2]+Kd*e
[2]-2*e
[1]+e
[0];out=uk+past_uk;ifout5000{out=5000;}ifout=-5000{out=-5000;}past_uk=out;e
[0]=e
[1];e
[1]=e
[2];PulseWidth=PulseWidth+PulseWidth*out/5000;ifPulseWidth
0.3{PulseWidth=
0.3;}ifPulseWidth1{PulseWidth=1;}}ifsetspeed=200{Kp=
0.04;Ki=
0.000001;Kd=
0.00001;e
[2]=setspeed-speed;uk=Kp*e
[2]-e
[1]+Ki*e
[2]+Kd*e
[2]-2*e
[1]+e
[0];out=uk+past_uk;ifout5000{out=5000;}ifout=-5000{out=-5000;}past_uk=out;e
[0]=e
[1];e
[1]=e
[2];PulseWidth=PulseWidth+PulseWidth*out/5000;ifPulseWidth
0.3{PulseWidth=
0.3;}ifPulseWidth1{PulseWidth=1;}}govern_speed;}/***********************************************************************主函数**********************************************************************************/int__invoid{SysCtlClockSetSYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC___IN;Init_LED;Init_anjian;Init_PWM;Init_QEI;e
[2]=e
[1]=e
[0]=0;stop;while1{SpeedCompute;LED_Display;key;PID_control;}}。