51单片机PID控制直流电机实验报告.pdf
- 文档编号:3218850
- 上传时间:2022-11-20
- 格式:PDF
- 页数:11
- 大小:357.72KB
51单片机PID控制直流电机实验报告.pdf
《51单片机PID控制直流电机实验报告.pdf》由会员分享,可在线阅读,更多相关《51单片机PID控制直流电机实验报告.pdf(11页珍藏版)》请在冰豆网上搜索。
基于基于5151单片机单片机的的直流电机直流电机PIDPID控制控制一、试验器件选择1、控制芯片的作用主要是与L289相连接驱动直流电机,以及与八位数码管相连显示。
(1)、AT89C51是一种带4K自己FLASH存储器的低压、高性能CMOS8为微处理器。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失真存储制造技术制造,与工业标准的MCS-51指令集和输出关键相兼容。
由于将多功能8位CPU和闪存组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性奥高且廉价的方案。
(2)、AT89C51引脚图如下:
2、电机驱动芯片
(1)、电机驱动芯片选择L298。
其主要功能是作为单片机与直流电机中间的过度链接,单片机输出的信号通过L298加载到直流电机上驱动直流电机运行。
其引脚图如下:
(2)、主要工作原理:
1、15脚分别是两个H桥的电流反馈脚,不用时可以直接接地;2、3为一对输出端口,13、14为一对输出端口;4为驱动电压输入,最小值必须比输入的低电平高2;5、7一对输入端口,10、12一对输入端口,TTL电平兼容6、11使能端,低电平禁止输出;8、9分别为接地和逻辑电源3、直流电机。
在protues中选择motor-encoder直流电机,引脚图如下:
上方左右的两个引脚在点击运转时输出频率相同的方波,但是在相位上相差90,而且在正转和反转是相反,因此可以根据这两个引脚的输出情况判断点击的转向。
上方中间的引脚每当电机转一圈就输出一个正脉冲,可以据此册数点击的转速。
左右两个引脚是电机的电压输入端。
4、74HC74。
当D触发器的D和CLK输入端分别接电机上方的左右两个输出端口时可以根据D触发器的输出情况判断点击的转速。
5、八位数码管。
用以显示。
二、系统硬件设计连接1、系统的器件连接图如下:
2、单片机与数码管通过P0口和P2口相连,其中P2口选择点亮哪一个数码管,P0口则控制被点亮的数码管显示的数据。
3、单片通过P10和P11和L298的第一对输入端IN1和IN2相连,然后又L298的第一对输出端OUT1和OUT2与直流电机相连,已达到控制直流电机的目的。
4、从P14到P17分别接一个Button按钮来实现PID控制,P36和P37分别接Button按钮实现对电机的加速与减速控制。
5、双刀双掷开关SW1课实现点击的正转与反转,单刀双掷开关SW2可实现点击的开启与停止。
三、系统程序设计及功能实现1、程序流程图:
开始输入一个值,点击Enter按钮,通过PID算法,改变PWM波输出让电机运行通过按钮加减改变当前值,Enter键确定判断新的输入值与当前值的差值,将差值加到原值上,通过PID算法改变PWM波输出控制电机运行循环2、各部分实现程序:
(1)、普通延时:
#includevoiddelayms(unsignedcharx)unsignedchari;while(x-)for(i=0;i120;i+);
(2)、数码管显示:
#include#include#includevoiddisplay_lilun(doublenum)charcodetable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,/07对应数码0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/8F对应数码longintn=num;P0=0;P2=0x7f;P0=tablen%1000/100;delayms
(2);/百位加小数点P0=0;P2=0xbf;P0=tablen%100/10;delayms
(2);/十位P0=0;P2=0xdf;P0=tablen%10;delayms
(2);/个位P0=0;/关闭显示器voiddisplay(doublenum,intdir)charcodetable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,/07对应数码0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/8F对应数码longintn=num*10;P0=0;P2=0xf7;P0=tablen/1000;delayms
(2);/百位加小数点P0=0;P2=0xfb;P0=tablen%1000/100;delayms
(2);/百位加小数点P0=0;P2=0xfd;P0=tablen%100/10+128;delayms
(2);/十位P0=0;P2=0xfe;P0=tablen%10;delayms
(2);/个位P0=0;/关闭显示器if(dir=1)P0=0;P2=0xef;P0=0x40;delayms
(2);(3)、按键扫描:
#includesbitjiashi=P13;/对各个按钮进行位定义sbitjianshi=P14;sbitjia=P15;sbitjian=P16;sbitenter=P17;externintnum_key5;/定义全局变量voidkeyscan()if(jiashi=0)while(!
jiashi);num_key0+;if(jianshi=0)while(!
jianshi);num_key1+;if(jia=0)while(!
jia);num_key2+;if(jian=0)while(!
jian);num_key3+;if(enter=0)while(!
enter);num_key4+;(4)、PWM波输出:
#include#include#includeexternintPWM;/赋初值externintstart,sudu_lilun;externdoubledis_count;sbitS2=P36;/PWM值减少键sbitS3=P37;/PWM值增加键voidPWM_duty()if(start=1)PWM=sudu_lilun;doif(PWM!
=0xff)PWM+;delayms(10);while(S3=0);doif(PWM=0x02)PWM-;delayms(10);while(S2=0);(5)、中断服务程序:
#includeexternintPWM,count,count1,dir,count20ms_flag;externdoubledis_count;sbitPWM_OUT1=P11;sbitPWM_OUT2=P10;voidtimer0()interrupt1longinti;TR1=0;dir=0;TL0=0x00;TH0=0xd8;/10msTL0=0xf0;TH1=PWM;TR1=1;PWM_OUT1=0;/启动输出PWM_OUT2=0;if(i+=492)count20ms_flag=1;i=0;dis_count=(double)(count+count1)/2;count=0;count1=0;voidtimer1()interrupt3TR1=0;if(dir=0)PWM_OUT1=1;/结束输出PWM_OUT2=0;elsePWM_OUT1=0;PWM_OUT2=1;voidEIRQ0(void)interrupt0EX0=0;count+;EX0=1;voidEIRQ1(void)interrupt2EX1=0;count1+;EX1=1;(6)、PID控制:
#include#includeintP,I,D;externintsudu_lilun;typedefstructPID/定义结构体intSetPoint;/目标longSumError;/误差doubleProportion;/比例系数doubleIntegral;/积分系数doubleDerivative;/微分系数intLastError;intPrevError;PID;staticPIDsPID;staticPID*sptr=&sPID;voidIncPIDInit()sptr-SumError=0;sptr-LastError=0;/Error-1sptr-PrevError=0;/Error-2sptr-Proportion=0.5;/比例系数sptr-Integral=0.3;/积分系数sptr-Derivative=0.3;/微分系数sptr-SetPoint=sudu_lilun;intIncPIDCalc(intNextPoint)registerintiError,iIncpid;/当前的误差值iError=sptr-SetPoint-NextPoint;/计算增加量iIncpid=sptr-Proportion*iError/Ek项-sptr-Integral*sptr-LastError/Ek1项+sptr-Derivative*sptr-PrevError;/Ek2项/存储当前误差以便后面计算sptr-PrevError=sptr-LastError;sptr-LastError=iError;/返回增量值return(iIncpid);(7)、main函数:
#include#include#include#include#include#include#includesbitP10=P12;/确定电机转向intnum_key5;intPWM,PWM1,count,count1,dir,sudu_lilun,start,count20ms_flag;doubledis_count;intPWM_PID;voidinit();voidmain()init();while
(1)PWM_duty();if(P10=1)dir=0;elsedir=1;keyscan();sudu_lilun=num_key0*10-num_key1*10+num_key2-num_key3;display_lilun(sudu_lilun);if(num_key4=1)start=1;display(dis_count,dir);if(start=1&count20ms_flag=1)count20ms_flag=0;IncPIDInit();PWM_PID=IncPIDCalc(dis_count);PWM=PWM+PWM_PID*2;voidinit()/定时器、外部中断初始化TMOD=0x01;TH0=0xd8;TL0=0xf0;IT0=1;EX0=1;IT1=1;EX1=1;TH1=PWM;TL1=0xff;EA=1;ET0=1;ET1=1;TR0=1;3、程序实现效果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 PID 控制 直流电机 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)