基于单片机的直流电机转速pid控制系统设计_毕业设计论文(编辑修改稿)内容摘要:

0x66,0x6d,0x7d,0x07, 0x7f,0x6f }。 uchar code chose[]={0x01,0x02,0x04,0x08,0x10,0x20}。 uint shu[6]={1,2,3,4,5,6}。 uchar q=0,i=0,m=0,n=0。 uint count,miaoshu,sv,k=0,k2=0,sv1,sv2。 //定义计数值,实际温度值,设定的温度值 uchar sec,tt,flag,flag1。 int rk,yk,uk,uk_1=0,ek,ek_1=0,ek_2=0。 //PID计算参数 signed char T=20,Kp=30,Td=8,Ti=100,q0,q1,q2。 //PID 参数其值经反复调试得来 uchar data buf[4]={0,1,1,1}。 //字型显示中间变量 /******************************************************************** 21 **************/ 延时子程序用来产生 1ms的延时,用于在程序中的等待 /**********************************************************************************/ //延时 1ms 子程序 void delay(uchar z) { uchar x,y。 for(x=z。 x0。 x) for(y=110。 y0。 y)。 } /**********************************************************************************/ 显示子程序用来在数码管中显示电机的设定转速或计算转速以及实际转速 /**********************************************************************************/ //显示子程序 void display(uint a,uint b) { char i。 shu[0]=a/100。 shu[1]=a%100/10。 shu[2]=a%10。 shu[3]=b/100。 shu[4]=b%100/10。 shu[5]=b%10。 for(i=0。 i6。 i++) { P2=chose[i]。 P0=table[shu[i]]。 delay(5)。 } } /**********************************************************************************/ 定时器中断子程序用来产生 秒的中断,以此来测量电机的转速 22 /**********************************************************************************/ // 定时器中断 0子程序 void t0(void) interrupt 1 using 0 //定时 T0 中断服务函数 { tt++。 //每过 250ust tt 加一 if(tt==40) //计满 40 次( 1/100 秒)时 { tt=0。 //重新再计 sec++。 if(sec==10) //定时 秒,在从零开始计时 { sec=0。 TH0=0x06。 //对 TH0 TL0 赋值 TL0=0x06。 miaoshu=count。 count=0。 } } } /**********************************************************************************/ 用来记录中断数,从而得到转速 /**********************************************************************************/ void sdf(void) interrupt 2 using 0 //外部中断服务函数 { count=count+1。 } /**********************************************************************************/ 接收来自另一个单片机的中断并放入一个数组中以便在显示函数中方便调用此数据,其中加了 容错程序,通过一个特殊字符’ 11’ ,来区别哪一个是三位数的百位,十位,个位。 /**********************************************************************************/ 23 void jieshou()//接收子程序 {uchar g。 if(RI==1) {g=SBUF。 if(g==11) m=0。 buf[m]=g。 m++。 if(m==4) m=0。 RI=0。 //REN=1。 } } /**********************************************************************************/ 检测按键值计算对应的数值 /**********************************************************************************/ //左移一位 void yishu(uchar num) { uchar bai,shi,ge。 bai=sv1%100/10。 shi=sv1%10。 ge=num。 sv1=bai*100+shi*10+ge。 k2=sv1。 //xinjia } /**********************************************************************************/ 检测对应的按键 /**********************************************************************************/ //按键子程序 void key() { uchar i,temp,lie,hang,shu。 for(i=0。 i4。 i++) //求 出按键值 { P1=~chose[i]。 24 temp=P1。 temp=tempamp。 0xf0。 if(temp!=0xf0) { hang=i。 if(temp==0xe0) lie=1。 else if(temp==0xd0) lie=2。 else if(temp==0xb0) lie=3。 else if(temp==0x70) lie=4。 break。 } } shu=hang*4+lie。 //数为对应的按键 switch(shu) { case 1: if(!flag) yishu(0)。 break。 case 2: if(!flag) yishu(1)。 break。 case 3: if(!flag) yishu(2)。 break。 case 4: if(!flag) yishu(3)。 break。 case 5: if(!flag) yishu(4)。 break。 case 6: if(!flag) yishu(5)。 break。 case 7: if(!flag) yishu(6)。 break。 case 8: if(!flag) yishu(7)。 break。 case 9: if(!flag) yishu(8)。 break。 case 10: if(!flag) yishu(9)。 break。 case 11: flag++。 /*flag1++*/。 break。 case 12: sv1=0。 miaoshu=0。 flag=0。 flag1=0。 break。 case 13: flag1++。 break。 25 default: break。 } while(temp!=0xf0) //放键检测 { temp=P1。 temp=tempamp。 0xf0。 for(i=0。 i10。 i++) display(sv1,miaoshu)。 } } //按键检测程序 void keyscan() { uchar temp。 P1=0xf0。 temp=P1。 temp=tempamp。 0xf0。 if(temp!=0xf0) { delay(5)。 //消除抖动 P1=0xf0。 temp=P1。 temp=tempamp。 0xf0。 if(temp!=0xf0) key()。 } } /**********************************************************************************/ 进行 pid 的计算,用来在后面的程序中进行电机的闭环控制 /**********************************************************************************/ void pid(void) //PID 计算输出量 {sv2=100*buf[1]+10*buf[2]+buf[3]。 if(p26==0)//低电平时正常显示设定值 sv=sv1。 26 if(p26=。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。