直流电机PID调速_第1页
直流电机PID调速_第2页
直流电机PID调速_第3页
直流电机PID调速_第4页
直流电机PID调速_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、#include <regX52.h> #include <intrins.h>#define uchar unsigned char #define uint unsigned int /与typedef unsigned int uint 效果相同,一个是编译前处理,一个编译时处理#define jump_ROM 0xCC#define start 0x44#define read_EEROM 0xBEvoid gettpr();/*位声明*/sbit RS= P23;/液晶片选 sbit RW= P24;/液晶读写sbit E= P25;/液晶读写sbit zfz

2、huan=P30; /左转sbit add= P31; /加速sbit dec= P32; /减速sbit weixuan=P33; /位选 sbit en1= P22; /* L298的Enable A */ sbit s1= P20; /* L298的Input 1 */ sbit s2= P21; /* L298的Input 2 */sbit tin= P34; /反转sbit beep= P26 ; /蜂鸣器控制口sbit DQ = P27; /DS18B20数据口/*变量定义*/char pwmge=0,pwmshi=0; /速度设定char pwmtime=0;float D1,D

3、2,D3;char I1,I2,Kp1,Kp2; /PID值设定uchar count1,count3;uint count2;uchar s11,s22,flag2=1,flag1,flag3;float Kp,Ki,Kd; /PID调节系数,kp=1.6,ki=0.3时较好,转速不稳定,待调/2.0,0.6,0.15char e=0,e1=0,e2=0; /偏差float uk=0,uk1=0,duk=0; /PID输出值uchar zhuansu=0;uchar TMPH,TMPL;uchar num,flag4;uint temp;unsigned char table3 = '

4、;0','1','2','3','4','5','6','7','8','9'unsigned char table1="P00 I00 Gspd:000"unsigned char table2=" Aspd:000"/*毫秒延时函数*/void delayms(unsigned int z)unsigned int x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);

5、/* 名称 : delay()* 功能 : 短暂延时函数* 输入 : 无* 输出 : 无*/void delay(uint N)uchar i;for(i=0; i<N; i+);/* 名称 : Reset()* 功能 : 复位DS18B20* 输入 : 无* 输出 : 无*/uchar Reset(void)uchar deceive_ready;DQ = 0;delay(29);DQ = 1;delay(3);deceive_ready = DQ;delay(25);return(deceive_ready);/* 名称 : read_bit()* 功能 : 从DS18B20读一个位

6、值* 输入 : 无* 输出 : 从DS18B20读出的一个位值*/uchar read_bit(void)uchar i;DQ = 0;DQ = 1;for(i=0; i<3; i+);return(DQ);/* 名称 : write_bit()* 功能 : 向DS18B20写一位* 输入 : bitval(要对DS18B20写入的位值)* 输出 : 无*/void write_bit(uchar bitval)DQ=0;if(bitval=1)DQ=1;delay(5);DQ=1;/* 名称 : read_byte()* 功能 : 从DS18B20读一个字节* 输入 : 无* 输出 :

7、 从DS18B20读到的值*/uchar read_byte(void)uchar i,m,receive_data;m = 1;receive_data = 0;for(i=0; i<8; i+)if(read_bit()receive_data = receive_data + (m << i);delay(6);return(receive_data);/* 名称 : write_byte()* 功能 : 向DS18B20写一个字节* 输入 : val(要对DS18B20写入的命令值)* 输出 : 无*/void write_byte(uchar val)uchar i

8、,temp;for(i=0; i<8; i+)temp = val >> i;temp = temp & 0x01;write_bit(temp);delay(5);/*微秒级延时*/ void delay_us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();/*液晶部分子程序*/void write_com(unsigned char com)/写液晶命令函数E=0;/操作时序RW=0; RS=0;P1

9、=com;delay_us();E=1;delay_us();E=0;void write_data(unsigned char shuju)/写液晶数据函数E=0;/操作时RW=0; RS=1;P1=shuju;delay_us();E=1;delay_us();E=0;/*液初始化函数*/void LCDintial() uchar *p,*p1;p=table1;p1=table2;write_com(0x38);/模式初始化write_com(0x0c);/光标显示设置write_com(0x06);/读写字符光标加1write_com(0x01);/指针清零write_com(0x8

10、0);/指针指向第一个while(*p) delayms(2); write_data(*p); p+; write_com(0x80+0x40);while(*p1) write_data(*p1); p1+; /*定时器初始化程序*/void T0T1T2_init() TMOD=0x51; /定时器1负责计数,0负责定时功能 重点中的重点工作方式的设定TH0=(65536-100)/256; /定时器设初值 TL0=(65536-100)%256;TL1=0; /计数器设初值TH1=0;ET0=1; /t0定时器允许TR1=1; /启动定时器T2CON=0x00;/定时器2初始化/TCL

11、K=0;/已经包含在T2CON里/RCLK=0;T2MOD=0x00;RCAP2H=(65536-50000)/256;RCAP2L=(65536-50000)%256;/ TH2=(65536-50000)/256; /会自动重装/TL2=(65536-50000)%256;ET2=1;EA=1;/开总中断/*测速函数*/void ceshu() uchar *p3;unsigned char table43;p3=table4;if(count1>=12)/0.6秒刷新数据一次,>=保证每次都刷新显示TR2=0; /关闭定时器2zhuansu=TH1*256+TL1;/0.6秒

12、脉冲次数table40=zhuansu/100+'0'table41=zhuansu/10%10+'0'table42=zhuansu%10+'0' write_com(0x80+0x40+13); while(*p3)write_data(*p3); p3+;count1=0;TH1=0; /清零,重新计数TL1=0;TR2=1;/打开定时器2/*蜂鸣器函数*/void Beep()beep=1;delayms(100);beep=0;delayms(15);/*按键扫描函数*/void keyscan()if(zfzhuan=0) delay

13、ms(20); /按键延时消抖if(zfzhuan=0) Beep();while(!zfzhuan);/等待按键释放flag1+;if(flag1=2)/反转设置flag1=0;/flag2=1; en1=1;s11=0;s22=1; TR0=1; TR2=1; write_com(0x80+13);write_data(0x2D); /字符- if(flag1=1)/正转设置 / flag2=1; en1=1;s11=1;s22=0;TR0=1;TR2=1; write_com(0x80+13);write_data(0x2B); /字符+ if(weixuan=0)/位选按下delaym

14、s(20); /延时消抖if(weixuan=0)Beep();while(!weixuan) if(TR0=1)ET0 = 0; gettpr();ET0= 1;num+;if(num>9)num=1;flag3=1; flag2=0;/屏蔽温度显示 if(flag3=1) write_com(0x80+0x40+1); /显示pid,屏蔽温度显示 write_data('D'); write_data(D1+'0'); write_data(0x2e); write_data(D2+'0'); write_data(D3+'0&

15、#39;); if(num!=0)if(num=1)/速度个位值设定write_com(0x80+15);write_com(0x0e); /光标显示if(add=0)/加键按下delayms(20);if(add=0)Beep();while(!add);pwmge+;if(pwmge>9)pwmge=9;/write_com(0x80+15);write_data(pwmge+'0');/写按键值到液晶 if(dec=0) /减键按下 delayms(20);if(dec=0) Beep();while(!dec);pwmge-;if(pwmge<0)pwmge

16、=0;write_data(pwmge+'0'); if(num=2) /速度十位值设定 write_com(0x80+14); /write_com(0x0e);if(add=0)delayms(20);if(add=0)Beep();while(!add);pwmshi+;if(pwmshi>9)pwmshi=9;write_data(pwmshi+'0');if(dec=0)delayms(20);if(dec=0)Beep();while(!dec);pwmshi-;if(pwmshi<0)pwmshi=0;/write_com(0x80+1

17、4);write_data(pwmshi+'0'); if(num=3)/kp值设定 write_com(0x80+1);/write_com(0x0e); /光标显示if(add=0)/加键按下delayms(20);if(add=0)Beep();while(!add);Kp1+;if(Kp1>9)Kp1=9;write_data(Kp1+'0');/写按键值到液晶 if(dec=0) /减键按下 delayms(20);if(dec=0) Beep();while(!dec);Kp1-;if(Kp1<0)Kp1=0;/write_com(0x8

18、0+1);write_data(Kp1+'0'); if(num=4)/kp值设定 write_com(0x80+2);/write_com(0x0e); /光标显示if(add=0)/加键按下delayms(20);if(add=0)Beep();while(!add);Kp2+;if(Kp2>9)Kp2=9;write_data(Kp2+'0');/写按键值到液晶 if(dec=0) /减键按下 delayms(20);if(dec=0) Beep();while(!dec);Kp2-;if(Kp2<0)Kp2=0;/write_com(0x80

19、+2);write_data(Kp2+'0'); if(num=5)/PID中I值设定write_com(0x80+5);/write_com(0x0e); /光标显示if(add=0)/加键按下delayms(20);if(add=0)Beep();while(!add);I1+;if(I1>9)I1=9;write_data(I1+'0');/写按键值到液晶 if(dec=0) /减键按下 delayms(20);if(dec=0) Beep();while(!dec);I1-;if(I1<0)I1=0;/write_com(0x80+5);wr

20、ite_data(I1+'0'); if(num=6)/PID中I值设定 write_com(0x80+6);/write_com(0x0e); /光标显示if(add=0)/加键按下delayms(20);if(add=0)Beep();while(!add);I2+;if(I2>9)I2=9;write_data(I2+'0');/写按键值到液晶 if(dec=0) /减键按下 delayms(20);if(dec=0) Beep();while(!dec);I2-;if(I2<0)I2=0;/write_com(0x80+6);write_da

21、ta(I2+'0'); if(num=7)/PID中D值设定write_com(0x80+0x40+2);/write_com(0x0e); /光标显示if(add=0)/加键按下delayms(20);if(add=0)Beep();while(!add);D1+;if(D1>9)D1=9;write_data(D1+'0');/写按键值到液晶 if(dec=0) /减键按下 delayms(20);if(dec=0) Beep();while(!dec);D1-;if(D1<0)D1=0;/write_com(0x80+0x40+2);write

22、_data(D1+'0'); if(num=8)/PID中D值设定write_com(0x80+0x40+4);/write_com(0x0e); /光标显示if(add=0)/加键按下delayms(20);if(add=0)Beep();while(!add);D2+;if(D2>9) D2=9; write_data(D2+'0');/写按键值到液晶 if(dec=0) /减键按下 delayms(20);if(dec=0) Beep();while(!dec); D2-;if(D2<0)D2=0;/write_com(0x80+0x40+4)

23、;write_data(D2+'0'); if(num=9)/PID中D值设定 write_com(0x80+0x40+5);/write_com(0x0e); /光标显示if(add=0)/加键按下delayms(20);if(add=0)Beep();while(!add);D3+;if(D3>9) D3=9;write_data(D3+'0');/写按键值到液晶 if(dec=0) /减键按下 delayms(15);if(dec=0) Beep();while(!dec); D3-;if(D3<0)D3=0;/write_com(0x80+0

24、x40+5);write_data(D3+'0'); if(tin=0) /电机停止键按下delayms(20);if(tin=0) Beep();while(!tin);flag2=1;flag3=0;en1=0;TR0=0;s11=0;s22=0;/TR2=0;pwmshi=0; /所有值清零pwmge=0;uk=0;uk1=0;duk=0;e=0;e1=0;e2=0;num=0;TH1=0;TL1=0;write_com(0x80+13);write_com(0x0c);write_data('0');write_data(pwmshi+'0

25、9;);write_data(pwmge+'0'); /*增量式PID调节函数*/void PIDControl() char pwm,sudu; Kp=(Kp1*10+Kp2);Ki=(I1*10+I2);Kd=(D1*10+D2+D3/10);sudu=pwmshi*10+pwmge;e=sudu-zhuansu; duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2)/10;/速度增量if(duk>15)duk=15;if(duk<(-15)duk=(-15); uk=uk1+duk;pwm=(int)uk;/pwm为给电机的占空比值 if(pwm>100)/分为100步调速,使调速更精细 pwm=100; else if(pwm<0) pwm=0;uk1=uk; e2=e1; e1=e; pwmtime=pwm;void gettpr() Reset();write_byte(jump_ROM);write_byte(start);Reset();write_byte(jump_ROM);write_byte(read_EEROM);TMPL = read_byte();TMPH = read_byte();temp=TMPH;temp<&l

温馨提示

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

评论

0/150

提交评论