欢迎来到天天文库
浏览记录
ID:23850326
大小:51.00 KB
页数:14页
时间:2018-11-11
《基于51单片机的直流电机pid闭环调速系统》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、基于51单片机的直流电机PID闭环调速系统1.电机转速反馈:原理:利用光电编码器作为转速的反馈元件,设电机转一周光电编码器发送N个PWM波形,利用测周法测量电机转速。具体实现:将定时器0设置在计数模式,用来统计一定的时间T内接受到的脉冲个数M个,而定时器0置在计时模式,用来计时T时间。则如果T时间接受到M个PWM波形,而电机转一圈发出N个PWM波形,则根据测周法原理,电机的实际的转速为:real_speed=M/(N*T),单位转/秒。若将定时器1置在计数模式,则PWM波形应该由P3^3脚输入。代码实现://定时器
2、0初始化,用来定时10msvoidInit_Timer0(void){TMOD
3、=0x01;//使用模式1,16位定时器,且工作在计时模式TH0=(65536-10000)/256;//定时10msTL0=(65536-10000)%6;EA=1;//总中断打开ET0=1;//定时器中断打开TR0=1;//定时器开关打开}//计数器1初始化,用来统计定时器1计时250ms内PWM波形个数voidInit_Timer1(void){TMOD
4、=0x50;//使用计数模式1,16位计数器模式TH1=0x00;//给定初
5、值,由0往上计数TL1=0x00;EA=1;//总中断打开ET1=1;//定时器中断打开TR1=1;//定时器开关打开}//定时器0的中断服务子函数,主要完成脉冲个数的读取,实际转速的计算和PID控制以及控制结//果输出等工作voidTimer0_isr(void)interrupt1{unsignedcharcount;TH0=(65536-10000)/256;//重新赋值10msTL0=(65536-10000)%6;count++;if(count==25)//如果达到250ms,则计算一次转速并进行一次控
6、制运算{count=0;//清零以便于定时下一个250msTR1=0;//关闭定时器1,统计脉冲个数real_speed=(256*TH1+TL1)*4/N;//250ms内脉冲个数并由此计算转速TH1=0x00;//计数器1清零,重新开始计数TL1=0x00;TR1=1;OUT=contr_PID();//进入PID控制,PID控制子函数代码在后面给出write_add(0x40,OUT);//进行DA转换,将数字量转换为模拟量,后面会介绍到}}2.PID控制:PID的基本原理在这里不作具体讲解,这里主要给出PI
7、D算法的实现,通过调节结构体中比例常数(Proportion)、积分常数(Integral)、微分常数(Derivative)使得转速控制达到想要的精度。试凑法:注意这里参数调节采用实验凑试法,试凑法也有其规律,下面做出讲解:实验凑试法是通过闭环运行或模拟,观察系统的输出结果,然后根据各参数对系统的影响,反复凑试参数,直至出现满意的响应,从而确定PID控制参数。实验凑试法的整定步骤为"先比例,再积分,最后微分"。(1)整定比例控制将比例控制作用由小变到大,观察各次响应,直至得到反应快、超调小的响应曲线。(2)整定积
8、分环节若在比例控制下稳态误差不能满足要求,需加入积分控制。先将步骤(1)中选择的比例系数减小为原来的50~80%,再将积分时间置一个较大值,观测响应曲线。然后减小积分时间,加大积分作用,并相应调整比例系数,反复试凑至得到较满意的响应,确定比例和积分的参数。(3)整定微分环节若经过步骤(2),PI控制只能消除稳态误差,而动态过程不能令人满意,则应加入微分控制,构成PID控制。先置微分时间TD=0,逐渐加大TD,同时相应地改变比例系数和积分时间,反复试凑至获得满意的控制效果和PID控制参数。代码实现unsignedin
9、tProportion=8;//比例常数ProportionalConstunsignedintIntegral=3;//积分常数IntegralConstunsignedintDerivative=1;//微分常数DerivativeConstunsignedintLastError=0;//Error[-1]unsignedintPrevError=0;//Error[-2]unsignedintError=0;//Error[0]intOut=0;//outcomeintcontr_PID(){Error=e
10、xpc_speed-real_speed;//计算偏差//进行增量式PID计算Out=Out+Proportion*(Error-LastError)+Integral*Error+Derivative*(Error+PrevError-2*LastError);//进行误差更新PrevError=LastError;LastError=Error;//上下
此文档下载收益归作者所有