51单片机PID调增量式光电编码器测速_第1页
51单片机PID调增量式光电编码器测速_第2页
51单片机PID调增量式光电编码器测速_第3页
51单片机PID调增量式光电编码器测速_第4页
51单片机PID调增量式光电编码器测速_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、51单片机PID调增量式光电编码器测速.51单片机PID调增量式光电编码器测速.16/1651单片机PID调增量式光电编码器测速.编码器输出的A向脉冲接到单片机的外面中止INT0,B向脉冲接到I/O端口P1.0。当系统工作时,第一要把INT0设置成降落沿触发,并开相应中止。当有有效脉冲触发中止时,进行中止办理程序,鉴别B脉冲是高电平仍是低电平,假如高电平则编码器正转,加1计数;假如低电平则编码器反转,减1计数。鉴于51单片机的直流电机PID闭环调速系统原理详解与程序(2013-08-0401:18:15)转载标签:分类:单片机51单片机直流电机pidpcf8591鉴于51单片机的直流电机PID

2、闭环调速系统电机转速反应:原理:利用光电编码器作为转速的反应元件,设电机转一周光电编码器发送N个PWM波形,利用测周法丈量电机转速。详细实现:将准时器0设置在计数模式,用来统计必定的时间T内接遇到的脉冲个数M个,而准时器0置在计时模式,用来计时T时间。则假如T时间接遇到M个PWM波形,而电机转一圈发出N个PWM波形,则依据测周法原理,电机的实质的转速为:real_speed=M/(N*T),单位转/秒。若将准时器1置在计数模式,则PWM波形应当由P33脚输入。代码实现:准时器0初始化,用来准时10msvoidInit_Timer0(void)TMOD|=0 x01;/使用模式1,16位准时器,

3、且工作在计时模式TH0=(65536-10000)/256;/准时10msTL0=(65536-10000)%6;EA=1;/总中止翻开ET0=1;/准时器中止翻开TR0=1;/准时器开关翻开计数器1初始化,用来统计准时器1计时250ms内PWM波形个数voidInit_Timer1(void)TMOD|=0 x50;/使用计数模式1,16位计数器模式TH1=0 x00;/给定初值,由0往上计数TL1=0 x00;EA=1;/总中止翻开ET1=1;/准时器中止翻开TR1=1;/准时器开关翻开准时器0的中止服务子函数,主要达成脉冲个数的读取,实质转速的计算和PID控制以及控制结/果输出等工作vo

4、idTimer0_isr(void)interrupt1unsignedcharcount;TH0=(65536-10000)/256;/从头赋值10msTL0=(65536-10000)%6;count+;if(count=25)/假如达到250ms,则计算一次转速并进行一次控制运算count=0;/清零以便于准时下一个250msTR1=0;/封闭准时器1,统计脉冲个数real_speed=(256*TH1+TL1)*4/N;/250ms内脉冲个数并由此计算转速TH1=0 x00;/计数器1清零,从头开始计数TL1=0 x00;TR1=1;OUT=contr_PID();/进入PID控制,P

5、ID控制子函数代码在后边给出write_add(0 x40,OUT);/进行DA变换,将数字量变换为模拟量,后边会介绍到2.PID控制:PID的基来源理在这里不作详细解说,这里主要给出PID算法的实现,经过调节构造体中比率常数(Proportion)、积分常数(Integral)、微分常数(Derivative)使得转速控制达到想要的精度。试凑法:注意这里参数调理采纳实验凑试法,试凑法也有其规律,下边做出解说:实验凑试法是经过闭环运转或模拟,察看系统的输出结果,而后依据各参数对系统的影响,频频凑试参数,直至出现满意的响应,进而确立PID控制参数。实验凑试法的整定步骤为先比率,再积分,最后微分。

6、(1)整定比率控制将比率控制作用由小变到大,察看各次响应,直至获取反响快、超调小的响应曲线。(2)整定积分环节若在比率控制下稳态偏差不可以知足要求,需加入积分控制。先将步骤(1)中选择的比率系数减小为本来的5080,再将积分时间置一个较大值,观察响应曲线。而后减小积分时间,加大积分作用,并相应调整比率系数,频频试凑至获取较满意的响应,确立比率和积分的参数。(3)整定微分环节若经过步骤(2),PI控制只好除去稳态偏差,而动向过程不可以令人满意,则应加入微分控制,组成PID控制。先置微分时间TD=0,渐渐加大TD,同时相应地改变比率系数和积分时间,频频试凑至获取满意的控制成效和PID控制参数。代码

7、实现unsignedintProportion=8;/比率常数ProportionalConstunsignedintIntegral=3;/积分常数IntegralConstunsignedintDerivative=1;/微分常数DerivativeConstunsignedintLastError=0;/Error-1unsignedintPrevError=0;/Error-2unsignedintError=0;/Error0intOut=0;/outcomeintcontr_PID()Error=expc_speed-real_speed;/计算偏差进行增量式PID计算Out=Ou

8、t+Proportion*(Error-LastError)+Integral*Error+Derivative*(Error+PrevError-2*LastError);进行偏差更新PrevError=LastError;LastError=Error;上下限幅办理if(Out255)Out=255;/DA变换为8位,最大数值为255,故当大于255时,限制为255returnOut;电机驱动:原理:直流有刷电机既能够用模拟电压驱动,又能够用PWM驱动.假如用PWM驱动时,刚才PID后的输出能够直接对应到PWM高电平连续的时间,PWM周期为T,则低电平对应为T-Out即可,这个实现比较简单

9、。这里介绍利用DA将数字量Out转变为模拟电压驱动电机的方法。模拟电压驱动实现:将数字量转变为模拟量的最常用方法就是使用DA变换。在一般的使用中我比较喜爱的一款芯片是PCF8591。它内部集成了4路8位AD变换和1路8位DA变换,与单片机之间使用IIC通信方式。因为IIC通信只要要SDA和SCL两根信号线,所以很省IO口,而且一个芯片AD,DA都有了,很方便。详细的PCF8591资料请参照其datasheet,这里直接给出其封装好的IIC通信代码,使用直接就能够了。这里面其余的函数不用管,因为它们最后在两个函数中被调用,即write_add()和read_add()中。前者实现DA变换,有两个

10、参数,第一个参数是控制DA变换对应存放器地点,取0 x40,第二个是要变换的数据,即返回的OUT,使用时直接一句代码:write_add(0 x40,OUT)就能将数字信号变换为模拟电压信号。后者实现AD变换,只有一个参数,就是选择AD变换的4个通道,经过宏定义能够定义出其四个通道:#defineAD_IN00 x40#defineAD_IN10 x41#defineAD_IN20 x42#defineAD_IN30 x43使用时只要要一句代码:dat=read_add(AD_IN2)就能实现将第二个通道的模拟信号变换为数字信号。代码实现:/PCF8591.h#defineucharunsig

11、nedchar/延时4usvoiddelay(void);/iic初始化voidinit(void);/iic开始信号voidstart(void);/iic停止信号voidstop(void);iic应答相当于一个智能的延时函数voidrespons(void);/iic读一个字节数据ucharread_byte(void);/iic写一字节数据voidwrite_byte(uchardate);控制DA变换voidwrite_add(ucharcontrol,uchardate);控制AD变换ucharread_add(ucharcontrol);/PCF8591.c#include#in

12、clude#definePCF85910 x90/默以为写,假如为读,则为0 x91sbitSDA=P20;sbitSCL=P21;/延时4usvoiddelay(void)unsignedchari;for(i=1;i0;i-);/iicvoidinit()初始化SDA=1;delay();SCL=1;delay();/iicvoidstart()SDA=1;delay();SCL=1;delay();SDA=0;delay();开始信号/iic停止信号voidstop()SDA=0;delay();SCL=1;delay();SDA=1;delay();iic应答相当于一个智能的延时函数v

13、oidrespons()uchari;SCL=1;delay();while(SDA=1)&(i250)i+;SCL=0;delay();/iic读一个字节数据ucharread_byte()uchari,k;SCL=0;delay();SDA=1;delay();for(i=0;i8;i+)SCL=1;delay();k=(k1)|SDA;/先左移一位,再在最低位接受目前位SCL=0;delay();returnk;/iic写一字节数据voidwrite_byte(uchardate)uchari,temp;temp=date;for(i=0;i8;i+)temp=temp1;/左移一位移出

14、的一位在CY中SCL=0;/只有在scl=0时sda能变化值delay();SDA=CY;delay();SCL=1;delay();SCL=0;delay();SDA=1;delay();控制DA变换voidwrite_add(ucharcontrol,uchardate)start();write_byte(PCF8591);respons();write_byte(control);respons();write_byte(date);respons();stop();控制AD变换ucharread_add(ucharcontrol)uchardate;start();write_byt

15、e(PCF8591);respons();write_byte(control);respons();start();write_byte(PCF8591+1);/把最后一位变为1,读数据respons();date=read_byte();stop();returndate;主函数:主函数中主假如一些初始化工作,还有按键检测和实质转速和希望转速显示。对于显示部分能够用液晶或许数码管,这里不再详细解说。#include#include#include#defineuintunsignedint#defineucharunsignedchar#definePCF85910 x90/默以为写,假如

16、为读,则为0 x91#defineAD_IN00 x40#defineAD_IN10 x41#defineAD_IN20 x42#defineAD_IN30 x43#defineKeyPortP1#defineCYCLE100/限制的最大转速unsignedintProportion=8;/比率常数ProportionalConstunsignedintIntegral=3;/积分常数IntegralConstunsignedintDerivative=1;/微分常数DerivativeConstunsignedintLastError=0;/Error-1unsignedintPrevErr

17、or=0;/Error-2unsignedintError=0;/Error0intOut=0;/outcomeunsignedintexpc_speed=0;unsignedintreal_speed=0;main()unsignedcharnum;Init_Timer0();/初始化准时器Init_Timer1();/初始化计数器lcd_init();init();01while(1)/主循环num=KeyScan();/循环调用按键扫描switch(num)case1:if(expc_speed0)expc_speed-;lcd_display(4,expc_speed);lcd_dis

18、play(5,real_speed);按键扫描函数,返回扫描键值unsignedcharKeyScan(void)unsignedcharkeyvalue;if(KeyPort!=0 xff)delay_ms(10);if(KeyPort!=0 xff)keyvalue=KeyPort;while(KeyPort!=0 xff);switch(keyvalue)case0 xfe:return1;break;case0 xfd:return2;break;case0 xfb:return3;break;case0 xf7:return4;break;case0 xef:return5;brea

19、k;case0 xdf:return6;break;case0 xbf:return7;break;case0 x7f:return8;break;default:return0;break;return0;分享:我个人对MCS-51单片机准时器和计数器区其余理解2008-02-2518:43:30|分类:默认分类|字号定阅在51单片机的学习过程中,我们常常会发现中止、计数器/准时器、串口是学习单片机的难点,对于初学者来说,这几部分的内容很难理解。可是我个人感觉这几部分内容是单片机学习的要点,假如在一个学期的讲堂学习或许自学中没有理解这几部分内容,那就等于还没有掌握51单片机,那更谈不上单片机

20、的开发了,我们都知道在成品的单片机项目中,有好多是以这几部分为理论基础的,万年历是以准时器为主的,报警器是以中止为主的,联机通信是以串口为主的。在这几部分内容中,计数器/准时器对于初学者说很简单搞混杂,下边我将对这方面的内容联合自己的学习经验谈几点见解。计数器和准时器的实质是相同的,他们都是对单片机中产生的脉冲入行计数,只可是计数器是单片机外面触发的脉冲,准时器是单片机内部在晶振的触发下产生的脉冲。当他们的脉冲间隔相同的时候,计数器和准时器就是一个观点。在准时器和计数器中都有一个溢出的观点,那什么是溢出了。呵呵,我们能够从一个生活小知识获取答案,当一个碗放在水龙头下接水的时候,过了一会儿,碗的水满了,就发生溢出。相同的道理,假定水龙头的水是一滴滴的往碗里滴,那么总有一滴水是致使碗中的水溢出的。在碗中溢出的水就浪费了,可是在单片机的准时计数器中溢出将致使一次中止,至于什么是中止我们下次再讲,这里不过初步的提下观点,中止就是能够打断系

温馨提示

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

评论

0/150

提交评论