基于Atmega16的温度测控系统PID算法.docx

上传人:h**** 文档编号:139779 上传时间:2018-07-10 格式:DOCX 页数:16 大小:19.49KB
下载 相关 举报
基于Atmega16的温度测控系统PID算法.docx_第1页
第1页 / 共16页
基于Atmega16的温度测控系统PID算法.docx_第2页
第2页 / 共16页
基于Atmega16的温度测控系统PID算法.docx_第3页
第3页 / 共16页
基于Atmega16的温度测控系统PID算法.docx_第4页
第4页 / 共16页
基于Atmega16的温度测控系统PID算法.docx_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、/编译器: AVRStudio 头文件部分: #include #define uchar unsigned char #define uchar unsigned char #define uint unsigned int void convert(float data); void init_1820(void); void write_1820(uchar x); uchar read_1820(void); float read_temperature(void); char key_scan(); int lcd_bz(); void lcd_wcmd(uchar cmd); vo

2、id lcd_pos(uchar pos); void lcd_wdat(uchar dat); void lcd_wstr(unsigned char pos,unsigned char *q); void lcd_init(); void avr_init(); void delay(int us); void delayl(int ms); void delay1(int ms); 按键程序 #include #include“headfile.h“ /.按键 . char key_scan() int temp=0,temp1,temp2; char key; DDRA=0xf0; P

3、ORTA delay1(3); temp1=PINA if(temp1!=0x0f) delay1(80); temp1=PINA if(temp1!=0x0f) DDRA=0x0f; PORTA delay1(5); temp2=PINA if(temp2!=0xf0) temp=temp1+temp2; switch(temp) case 0xee:key=/;break;/7 case 0xde:key=*;break;/8 case 0xbe:key=-;break;/9 case 0x7e:key=+;break;/+ case 0xed:key=.;break;/4 case 0x

4、dd:key=9;break;/5 case 0xbd:key=6;break;/6 case 0x7d:key=3;break;/- case 0xeb:key=;break;/1 case 0xdb:key=8;break;/2 case 0xbb:key=5;break;/3 case 0x7b:key=2;break;/* case 0xe7:key=0;break;/0 case 0xd7:key=7;break;/. case 0xb7:key=4;break;/= case 0x77:key=1;break;/ default :key=0;break; return key;

5、1602 显示程序 #include /#include #define ep_1 (PORTB|=0x04) #define ep_0 (PORTB int result=0; rs_0; rw_1; ep_1; result =(result|(PINC ep_0; DDRC=0xff; return result; /. 写入指令数据到LCD. . void lcd_wcmd(uchar cmd) while(lcd_bz(); rs_0; rw_0; ep_0; PORTC= cmd; ep_1; ep_0; delay(5); /.设定显示位置 . void lcd_pos(ucha

6、r pos) lcd_wcmd(pos | 0x80); delay(5); /.写入字符显示数据到 LCD. void lcd_wdat(uchar dat) while(lcd_bz(); rs_1; rw_0; ep_0; PORTC=dat; ep_1; ep_0; /.写入字符显示数组到 LCD. void lcd_wstr(unsigned char pos,unsigned char *q) /lcd_wcmd(0x01); /清屏 /delay(10); unsigned char i=0x00; lcd_pos(pos); while(*q!=0) lcd_wdat(*q);

7、 q+; i+; if(i=(0x0F-pos+1) lcd_pos(0x40); delay(10); /*/ /.LCD 初始化设定 . void lcd_init() lcd_wcmd(0x38); /function set delay(10); lcd_wcmd(0x38); /function set delay(10); lcd_wcmd(0x0c); /display on/off delay(10); lcd_wcmd(0x06); /entry mode set delay(10); lcd_wcmd(0x01); /清除 LCD 的显示内容 delay(10); /.av

8、r 初始化 ./ void avr_init() DDRC=0xFF; DDRB=0x07; 18b20 程序 #include #define uchar unsigned char #define uchar unsigned char #define uint unsigned int /-/ /.convert:data display. void convert(float data) /实数在液晶上显示 int i=0; int data1=(int)data; uchar array15=0,array25=0; lcd_wcmd(0x01); / lcd_wcmd(0x00);

9、 lcd_pos(0x0B); / if(data1=0) array10=0; lcd_wdat(48); / delay1(5); else while(data1!=0) array1i=data1%10; data1=data1/10; i+; for(-i;i=0;i-) lcd_wdat(array1i+48); / delay1(5); /显示小数点前面 lcd_wdat(0x2E); /显示小数点 for(i=0;i=18000)Flag_1820Error=1;break; DDRD|=(14; teml=teml teml=(teml*10)/16; tempval=tem

10、h;e0=tempval/100; tempval=temh;e1=(tempval/10)%10; tempval=temh;e2=tempval%10; tempval=teml;e3=tempval;*/ Main 程序 #include #include“headfile.h“ #include #include #include #include #include unsigned char key5; /按键数组 float keyvalue; /按键值 float actual; /温度值 unsigned int flag=0;/判断按键标志 unsigned char dis

11、1=“SET“; unsigned char dis2=“NOW“; unsigned char dis3=“00:00“; unsigned int h=0; /定时 1S 计时 10000 次 unsigned count=0; /计算动态时间 float PWM=0; float PWM1=0; float Error1; /误差 unsigned int maxminflag=0;/判断达到动态平衡标志 unsigned char time7;/存储动态时间 struct PID float SetPoint; / 设定目标 Desired Value float Proportion

12、; / 比例常数 Proportional Const float Integral; / 积分常数 Integral Const float Derivative; / 微分常数 Derivative Const float LastError; / Error1 1 float PrevError; / Error1 2 ; struct PID spid; / PID Control Structure struct PID *pp; /*PID 结构体初始化 */ void PIDInit (struct PID *pp) memset(pp,0,sizeof(struct PID);

13、 /*PID 参数设置 */ void setPID(float a,float b,float c) pp-Proportion=a; pp-Integral=b; pp-Derivative=c; /*PID 计算部分 */ float PIDCalc( struct PID *pp, float NextPoint ) float dError; unsigned int a; Error1 = pp-SetPoint-NextPoint; / 当前偏差 if(fabs(Error1)Proportion*(Error1-pp-LastError) +a*pp-Integral*pp-L

14、astError +a*pp-Derivative*(Error1-2*pp-LastError+pp-PrevError); /*dError=pp-Proportion*Error1 -pp-Integral*pp-LastError +pp-Derivative*pp-PrevError; if(fabs(Error1)Proportion*(Error1-pp-LastError)+a*pp-Integral*pp-LastError+ pp-Derivative*(Error1-2*pp-LastError+pp-PrevError);*/ pp-PrevError = pp-LastError; pp-LastError = Error1; return (dError); / 微分项 /*PWM 占空比设置 /*/ void setPWM(float dError)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。