| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749 |
- #include "STC8XXXX.h"
- #include "oled.h"
- #include "bmp.h"
- #include "timer0.h"
- #include "ADC.h"
- #include "EEPROM.h"
- #include <math.h>
- #define vol_channel 0
- #define tem_channel 1
- #define vcc_channel 15
- void prekey(void);//计算按键按下时长
- void relkey_page0(void);//对按键操作做出反应
- void relkey_page1(void);//对按键操作做出反应
- void page0(void);//第0个页面
- void page1(void);//第1个页面
- void mode0(void);//模式0
- void mode1(void);//模式1
- void pid_p(void);
- unsigned int presstime=500;//长按时间ms
- unsigned int tartem=300;//设定温度
- unsigned int keyi0=0;//按键0时长
- unsigned int keyi1=0;//按键1时长
- unsigned int keyi=0;//同时按下时长
- unsigned int maxtartem=350;//最大设定温度,可设置
- unsigned int mintartem=1;//最小设定温度,可设置
- unsigned int i;//for循环变量
- unsigned int time;//定时器计时
- unsigned int kp=10,ki=20,kd=30;
- int pwm=0;
- int pagenum=0;
- int err=0,lasterr=0;
- int integral=0;
- int derivative=0;
- double showpwm=0;
- double showpwm_opp=0;
- double powvol;//电源电压统计
- double powvol_average[30]=0;//电源电压均值
- double realtem=200;//真实温度
- double realtem_average[30]=0;//实际温度统计
- double p1= 0.00000016;//温度曲线参数1
- double p2= -0.00089441;//温度曲线参数2
- double p3= 1.91367865;//温度曲线参数3
- double p4=-1537.97459730;//温度曲线参数4
- double vcc=0;
- unsigned char count=0;//电源电压统计计数
- unsigned char page = 0;//页面选择
- unsigned char modesel=0;//模式选择
- unsigned char keyx0,keyx1;
- unsigned char page1_iconnum=4;//页面1选项数量
- unsigned char page1_PIDnum=4;//PID二级页面选项数量
- unsigned char page1_TEMnum=3;//温度二级页面选项数量
- unsigned char page1_MODEnum=3;//模式二级页面选项数量
- unsigned char eeptart[2]=0;
- unsigned char eepkp[2]=0;
- unsigned char eepki[2]=0;
- unsigned char eepkd[2]=0;
- unsigned char eepmaxt[2]=0;
- unsigned char eepmint[2]=0;
- unsigned char mapline[101]=0;//温度记录
- unsigned char numofsam=30;//取样次数
- sbit heat=P3^4;//加热
- sbit key0=P3^2;//按键0
- sbit key1=P3^3;//按键1
- bit swclose=1;//按键休眠开关
- bit keyj0;//按键0标志位
- bit keyj1;//按键1标志位
- bit keyj;//同时按下标志位-1
- bit keyp;//同时按下标志位-2
- bit eeprom_tartem=1;//设定温度标志位
- bit eeprom_pid=1;//PID参数标志位
- bit eeprom_limtem=1;//温度限制标志位
- bit eeprom_mode=1;
- bit pageflag;//切换页面标志位
- bit blinker;//刷新标志位
- bit pidflag;
- void init(void)
- {
- EEPROM_read_n(0x0000,&eeptart[0],2);
- EEPROM_read_n(0x0200,&eepkp[0],2);
- EEPROM_read_n(0x0204,&eepki[0],2);
- EEPROM_read_n(0x0208,&eepkd[0],2);
- EEPROM_read_n(0x0400,&eepmaxt[0],2);
- EEPROM_read_n(0x0404,&eepmint[0],2);
- EEPROM_read_n(0x0600,&modesel,1);
- tartem=(256*eeptart[1])+eeptart[0];
- kp=(256*(eepkp[1]))+(eepkp[0]);
- ki=(256*(eepki[1]))+(eepki[0]);
- kd=(256*(eepkd[1]))+(eepkd[0]);
- maxtartem=(256*(eepmaxt[1]))+(eepmaxt[0]);
- mintartem=(256*(eepmint[1]))+(eepmint[0]);
- if(maxtartem>350){maxtartem=350;}
- else if(maxtartem<200){maxtartem=200;}
- if(mintartem>200){mintartem=0;}
- else if(mintartem<0){mintartem=0;}
- if(tartem>maxtartem){tartem=maxtartem;}
- else if(tartem<mintartem){tartem=mintartem;}
- if(kp>1000){kp=500;}
- else if(kp<0){kp=0;}
- if(ki>1000){ki=500;}
- else if(ki<0){ki=0;}
- if(kd>1000){kd=500;}
- else if(kd<0){kd=0;}
- if(modesel>page1_MODEnum-2 || page1_MODEnum<0)
- {
- modesel=0;
- }
- P1M0 = 0x00;//00000011
- P1M1 = 0xff;//11111100
- P3M0 = 0xff;//11111111
- P3M1 = 0x0c;//00001100
- heat=0;
- swclose=0;
- powvol=0;
- adc_init();//初始化ADC
- OLED_Init();//初始化屏幕
- Timer0Init();//初始化定时器0
- EA=1;
- showpwm_opp=100-showpwm;
- for(i=0;i<numofsam;i++)
- {
- powvol_average[i]=get_adc(vol_channel);//读取电源ADC值
- realtem_average[i]=transform(get_adc(tem_channel),p1,p2,p3,p4);
- }
- for(i=0;i<numofsam;i++)
- {
- vcc+=(1.19*4096)/get_adc(vcc_channel);//计算电源电压
- }
- vcc/=numofsam;
- for(i=0;i<numofsam;i++)
- {
- powvol+=19*vcc*(powvol_average[i]/4096);
- realtem+=realtem_average[i];
- }
- powvol/=numofsam;
- realtem/=numofsam;
- }
- void main(void)
- {
- init();
- while(1)
- {
- if(page==0){page0();}//页面0
- if(page==1){page1();}//页面1
- }
- }
- void timer0()interrupt 1
- {
- time++;
- time %= 1000;
- if(time%1000==0){blinker=0;if(swclose){pidflag=1;}}
- if(pwm>=time && swclose){heat=1;}
- else/* if(pwm<time || !swclose)*/{heat=0;}
- prekey();//检测和计算按键按下时长
- }
- void prekey(void)
- {
- if(!key0 && key1 && !keyj)
- {keyi0++;keyj0=1;}
- if(!key1 && key0 && !keyj)
- {keyi1++;keyj1=1;}
- if(!key0 && !key1 && keyi0<presstime && keyi1<presstime)
- {keyi0=keyi1=keyj0=keyj1=0;keyi++;keyj=1;}
- }
- void relkey_page0(void)
- {
- if(!key0 && keyi0>=presstime)//长按0
- {
- if(tartem<maxtartem)
- {
- tartem++;
- eeprom_tartem=0;
- }
- }
- else if(key0 && keyj0)//短按0
- {
- if(tartem<maxtartem)
- {
- tartem++;keyi0=0;keyj0=0;eeprom_tartem=0;
- }
- }
- if(!key1 && keyi1>=presstime)//长按1
- {
- if(tartem>mintartem)
- {
- tartem--;
- eeprom_tartem=0;
- }
- }
- else if(key1 && keyj1 && !pageflag)//短按1
- {
- if(tartem>mintartem)
- {
- tartem--;keyi1=0;keyj1=0;eeprom_tartem=0;
- }
- }
- if(!key0 && !key1 && keyi>=presstime && keyj && keyp)//同时长按
- {
- page=!page;
- swclose=0;
- heat=0;
- keyj=0;
- keyi=0;
- keyp=0;
- pagenum=1;
- }
- else if(key1 && key0 && keyj && keyi<presstime && keyp)//同时短按
- {
- swclose=!swclose;
- pagenum=1;
- heat=swclose;
- integral=0;
- pwm=0;
- keyj=0;
- keyi=0;
- }
- if(key1 && key0)//松开
- {
- keyi=0;
- keyj=0;
- keyp=1;
- keyi0=0;
- keyi1=0;
- keyj0=0;
- keyj1=0;
- if(eeprom_tartem==0)
- {
- eeptart[0]=(tartem%256);
- eeptart[1]=(tartem/256);
- EEPROM_SectorErase(0x0000);
- EEPROM_write_n(0x0000,&eeptart[0],2);
- eeptart[0]=eeptart[1]=0;
- eeprom_tartem=1;
- }
- }
- if(pageflag)
- {
- pageflag=0;
- }
- }
- void page0(void)
- {
- OLED_display_clear();
- count++;
- count%=numofsam;
- powvol_average[count]=get_adc(vol_channel);//读取电源ADC值
- realtem_average[count]=transform(get_adc(tem_channel),p1,p2,p3,p4);
- realtem=0;
- powvol=0;
- vcc=0;
- for(i=0;i<numofsam;i++)
- {
- vcc+=(1.19*4096)/get_adc(vcc_channel);//计算参考电压
- }
- vcc/=numofsam;
- for(i=0;i<numofsam;i++)
- {
- powvol+=20*vcc*(powvol_average[i]/4096);//计算电源电压
- realtem+=realtem_average[i];//计算实际温度
- }
- powvol/=numofsam;
- realtem/=numofsam;
- //realtem=pidflag;
- if(realtem>400 || realtem<0)
- {
- realtem=0;
- }
- if(pidflag){pid_p();pidflag=0;}
- if(modesel==0){mode0();}//显示第0个模式
- else if(modesel==1){mode1();}//显示第一个模式
- OLED_display();
- relkey_page0();
- }
- void relkey_page1(void)
- {
- if(!key0 && keyi0>=presstime)//长按0
- {
- if(pagenum>=100 && pagenum<110)
- {
- switch(pagenum%10)
- {
- case 0: if(kp<500) {kp++;eeprom_pid=0;} break;
- case 1: if(ki<500) {ki++;eeprom_pid=0;} break;
- case 2: if(kd<500) {kd++;eeprom_pid=0;} break;
- }
- }
- else if(pagenum>=200 && pagenum<210)
- {
- switch(pagenum%10)
- {
- case 0: if(maxtartem<350) {maxtartem++;eeprom_limtem=0;} break;
- case 1: if(mintartem<200) {mintartem++;eeprom_limtem=0;} break;
- }
- }
- }
- else if(key0 && keyj0)//短按0
- {
- if(pagenum<100)
- {
- pagenum++;
- }
- else if(pagenum>=100 && pagenum<110)
- {
- switch(pagenum%10)
- {
- case 0: if(kp<500) {kp++;eeprom_pid=0;} break;
- case 1: if(ki<500) {ki++;eeprom_pid=0;} break;
- case 2: if(kd<500) {kd++;eeprom_pid=0;} break;
- }
- }
- else if(pagenum>=200 && pagenum<210)
- {
- switch(pagenum%10)
- {
- case 0: if(maxtartem<350) {maxtartem++;eeprom_limtem=0;} break;
- case 1: if(mintartem<200) {mintartem++;eeprom_limtem=0;} break;
- }
- }
- if(pagenum==page1_iconnum+1)
- {
- pagenum=1;
- }
- else if(pagenum==10+page1_PIDnum)
- {
- pagenum-=page1_PIDnum;
- }
- else if(pagenum==20+page1_TEMnum)
- {
- pagenum-=page1_TEMnum;
- }
- else if(pagenum==30+page1_MODEnum)
- {
- pagenum-=page1_TEMnum;
- }
- keyi0=0;
- keyj0=0;
- }
- if(!key1 && keyi1>=presstime)//长按1
- {
- if(pagenum>=100 && pagenum<110)
- {
- switch(pagenum%10)
- {
- case 0: if(kp>0){kp--;eeprom_pid=0;} break;
- case 1: if(ki>0){ki--;eeprom_pid=0;} break;
- case 2: if(kd>0){kd--;eeprom_pid=0;} break;
- }
- }
- else if(pagenum>=200 && pagenum<210)
- {
- switch(pagenum%10)
- {
- case 0: if(maxtartem>200) {maxtartem--;eeprom_limtem=0;} break;
- case 1: if(mintartem>0) {mintartem--;eeprom_limtem=0;} break;
- }
- }
- }
- else if(key1 && keyj1)//短按1
- {
- if(pagenum<100)
- {
- pagenum--;
- }
- else if(pagenum>=100 && pagenum<110)
- {
- switch(pagenum%10)
- {
- case 0: if(kp>0){kp--;eeprom_pid=0;} break;
- case 1: if(ki>0){ki--;eeprom_pid=0;} break;
- case 2: if(kd>0){kd--;eeprom_pid=0;} break;
- }
- }
- else if(pagenum>=200 && pagenum<210)
- {
- switch(pagenum%10)
- {
- case 0: if(maxtartem>200) {maxtartem--;eeprom_limtem=0;} break;
- case 1: if(mintartem>0) {mintartem--;eeprom_limtem=0;} break;
- }
- }
- if(pagenum==0)
- {
- pagenum=page1_iconnum;
- }
- else if(pagenum==9)
- {
- pagenum+=page1_PIDnum;
- }
- else if(pagenum==19)
- {
- pagenum+=page1_TEMnum;
- }
- else if(pagenum==29)
- {
- pagenum+=page1_TEMnum;
- }
- keyi1=0;
- keyj1=0;
- }
- if(!key0 && !key1 && keyi>=presstime && keyj && keyp)//同时长按
- {
- if(pagenum<10)
- {
- if(tartem<mintartem)
- {
- tartem=mintartem;
- }
- else if(tartem>maxtartem)
- {
- tartem=maxtartem;
- }
- page=!page;
- pageflag=0;
- pagenum=0;
- swclose=0;
- heat=0;
- keyj=0;
- keyi=0;
- keyp=0;
- }
- else
- {
- pagenum/=10;
- keyj=0;
- keyi=0;
- keyp=0;
- }
- }
- else if(key1 && key0 && keyj && keyi<presstime && keyp)//同时短按
- {
- if(pagenum==page1_iconnum)
- {
- if(tartem<mintartem)
- {
- tartem=mintartem;
- }
- else if(tartem>maxtartem)
- {
- tartem=maxtartem;
- }
- page=!page;
- pageflag=0;
- pagenum=0;
- swclose=0;
- heat=0;
- keyj=0;
- keyi=0;
- keyp=0;
- }
- else if(pagenum>=100)
- {
- pagenum=pagenum/10+pagenum%10;
- }
- else if(pagenum==13 || pagenum==22)
- {
- pagenum/=10;
- }
- else if(pagenum<10)
- {
- pagenum=pagenum*10;
- }
- else if(pagenum>=30 && pagenum<40)// && pagenum%10!=page1_MODEnum-1)
- {
- if(pagenum%10!=page1_MODEnum-1)
- {
- modesel=pagenum%10;
- eeprom_mode=0;
- }
- else
- {
- pagenum/=10;
- }
- }
- else
- {
- pagenum=(pagenum/10)*100+pagenum%10;
- }
- keyj=0;
- keyi=0;
- }
- if(key1 && key0)//松开
- {
- keyi=0;
- keyj=0;
- keyp=1;
- if(eeprom_pid==0)
- {
- eepkp[0]=(kp%256);
- eepkp[1]=(kp/256);
- eepki[0]=(ki%256);
- eepki[1]=(ki/256);
- eepkd[0]=(kd%256);
- eepkd[1]=(kd/256);
- EEPROM_SectorErase(0x0200);
- EEPROM_write_n(0x0200,&eepkp[0],2);
- EEPROM_write_n(0x0204,&eepki[0],2);
- EEPROM_write_n(0x0208,&eepkd[0],2);
- eeprom_pid=1;
- }
- if(eeprom_limtem==0)
- {
- eepmaxt[0]=maxtartem%256;
- eepmaxt[1]=maxtartem/256;
- eepmint[0]=mintartem%256;
- eepmint[1]=mintartem/256;
- EEPROM_SectorErase(0x0400);
- EEPROM_write_n(0x0400,&eepmaxt[0],2);
- EEPROM_write_n(0x0404,&eepmint[0],2);
- eeprom_limtem=1;
- }
- if(eeprom_mode==0)
- {
- EEPROM_SectorErase(0x0600);
- EEPROM_write_n(0x0600,&modesel,1);
- eeprom_mode=1;
- }
- }
- if(!pageflag)
- {
- pageflag=1;
- }
- }
- void page1()
- {
- OLED_display_clear();
- relkey_page1();
- //Draw_realnum(pagenum);
- if(pagenum<10)//一级页面
- {
- OLED_DrawBMP_2(109,1,17,48,page1_arrrw);
- OLED_DrawBMP_2(2,1,17,48,page1_arrlw);
- OLED_DrawBMP_2(48,0,32,64,page1_icon[pagenum-1]);
- }
- else if(pagenum>=10 && pagenum < 20)//二级页面-PID
- {
- OLED_DrawBMP_2(109,1,17,48,page1_arrrw);
- OLED_DrawBMP_2(2,1,17,48,page1_arrlw);
- OLED_DrawBMP_2(52,0,54,32,kpid[pagenum%10]);
- if(pagenum%10<page1_PIDnum-1)
- {
- OLED_DrawBMP_2(22,0,28,56,PIDopp[pagenum%10]);
- }
- else if(pagenum%10==page1_PIDnum-1)
- {
- OLED_DrawBMP_2(22,0,28,56,PID[page1_PIDnum-1]);
- }
- for(i=0;i<page1_PIDnum;i++)
- {
- if(i!=pagenum%10)
- {
- OLED_DrawBMP_2((72/(page1_PIDnum-1))*i+22,7,12,8,tab);
- }
- else
- {
- OLED_DrawBMP_2((72/(page1_PIDnum-1))*i+22,7,12,8,tab2);
- }
- }
- }
- else if(pagenum>=20 && pagenum < 30)//二级页面-温度
- {
- OLED_DrawBMP_2(109,1,17,48,page1_arrrw);
- OLED_DrawBMP_2(2,1,17,48,page1_arrlw);
- OLED_DrawBMP_2(52,0,54,32,templimit[pagenum%10]);
- if(pagenum%10<page1_TEMnum-1)
- {
- OLED_DrawBMP_2(22,0,28,56,TEMPopp[pagenum%10]);
- }
- else if(pagenum%10==page1_TEMnum-1)
- {
- OLED_DrawBMP_2(22,0,28,56,TEMP[pagenum%10]);
- }
- for(i=0;i<page1_TEMnum;i++)
- {
- if(i!=pagenum%10)
- {
- OLED_DrawBMP_2((72/(page1_TEMnum-1))*i+22,7,12,8,tab);
- }
- else
- {
- OLED_DrawBMP_2((72/(page1_TEMnum-1))*i+22,7,12,8,tab2);
- }
- }
- }
- else if(pagenum>=30 && pagenum<=40)//二级页面-模式
- {
- OLED_DrawBMP_2(109,1,17,48,page1_arrrw);
- OLED_DrawBMP_2(2,1,17,48,page1_arrlw);
- OLED_DrawBMP_2(52,0,54,32,modeexp[pagenum%10]);
- if(pagenum%10==page1_MODEnum-1)
- {
- OLED_DrawBMP_2(22,0,28,56,mode[pagenum%10]);
- }
- else if(modesel==pagenum%10)
- {
- OLED_DrawBMP_2(22,0,28,56,mode[pagenum%10]);
- }
- else
- {
- OLED_DrawBMP_2(22,0,28,56,modopp[pagenum%10]);
- }
- for(i=0;i<page1_MODEnum;i++)
- {
- if(i!=pagenum%10)
- {
- OLED_DrawBMP_2((72/(page1_MODEnum-1))*i+22,7,12,8,tab);
- }
- else
- {
- OLED_DrawBMP_2((72/(page1_MODEnum-1))*i+22,7,12,8,tab2);
- }
- }
- }
- else if(pagenum >=100 && pagenum<110)//三级页面-PID设置
- {
- OLED_DrawBMP_2(109,1,17,48,page1_arrrb);
- OLED_DrawBMP_2(2,1,17,48,page1_arrlb);
- OLED_DrawBMP_2(22,0,28,56,PID[pagenum%10]);
- OLED_DrawBMP_2(52,0,54,32,kpid[pagenum%10]);
- //Draw_midnum(53,4,pagenum,4);
- switch(pagenum%10)
- {
- case 0: Draw_midnum(53,4,kp,4); break;
- case 1: Draw_midnum(53,4,ki,4); break;
- case 2: Draw_midnum(53,4,kd,4); break;
- }
- for(i=0;i<page1_PIDnum;i++)
- {
- if(i!=pagenum%10)
- {
- OLED_DrawBMP_2((72/(page1_PIDnum-1))*i+22,7,12,8,tab);
- }
- else
- {
- OLED_DrawBMP_2((72/(page1_PIDnum-1))*i+22,7,12,8,tab2);
- }
- }
- }
- else if(pagenum>=200 && pagenum<210)//三级页面-温度设置
- {
- OLED_DrawBMP_2(109,1,17,48,page1_arrrb);
- OLED_DrawBMP_2(2,1,17,48,page1_arrlb);
- OLED_DrawBMP_2(22,0,28,56,TEMP[pagenum%10]);
- OLED_DrawBMP_2(52,0,54,32,templimit[pagenum%10]);
- switch(pagenum%10)
- {
- case 0: Draw_midnum(53,4,maxtartem,3); break;
- case 1: Draw_midnum(53,4,mintartem,3); break;
- }
- for(i=0;i<page1_TEMnum;i++)
- {
- if(i!=pagenum%10)
- {
- OLED_DrawBMP_2((72/(page1_TEMnum-1))*i+22,7,12,8,tab);
- }
- else
- {
- OLED_DrawBMP_2((72/(page1_TEMnum-1))*i+22,7,12,8,tab2);
- }
- }
- }
- OLED_display();
- }
- void mode0()
- {
- Draw_realnum(0,0,realtem);//显示测量温度
- Draw_tarnum(48,3,tartem,1);//绘制设定温度到缓存
- Draw_voltage(48,0,powvol);//绘制电源电压到缓存
- if(realtem>=mintartem && realtem <= maxtartem)
- {
- Draw_Loading(8,6,0,((realtem-mintartem)*100)/(maxtartem-mintartem));//绘制左侧进度条
- }
- else if(realtem>maxtartem)
- {
- Draw_Loading(8,6,0,100);
- }
- else
- {
- Draw_Loading(8,6,0,0);//绘制左侧进度条
- }
- if(showpwm!=pwm && swclose){showpwm_opp=(pwm/10-showpwm);showpwm_opp=showpwm_opp*0.8;showpwm=pwm/10-showpwm_opp;}
- else if(!swclose){showpwm*=0.8;}
- Draw_Loading(65,6,1,showpwm+1);//绘制右侧进度条
- Draw_Sign(11,48,((tartem-(mintartem))*100)/((maxtartem)-(mintartem)),tartem,realtem);//绘制左侧进度条标记
- if(swclose==0){OLED_DrawBMP_2(84, 0, 42, 48, &state[2]);}
- else if(err>5){OLED_DrawBMP_2(84, 0, 42, 48, &state[1]);}
- else{OLED_DrawBMP_2(84, 0, 42, 48, &state[0]);}
- }
- void mode1()
- {
- Draw_tarnum(0,0,realtem,0);//绘制设定温度到缓存
- Draw_tarnum(0,3,tartem,0);//绘制设定温度到缓存
- if(swclose==0){OLED_DrawBMP_2(4,6,16,16,switch_clo);}
- else{OLED_DrawBMP_2(4,6,16,16,switch_ope);}
- //OLED_DrawLine(26,60,128,60,1);
- OLED_DrawBMP_2(25,0,103,64,xy);//绘制坐标轴
- for(i=26;i<128;i++)
- {
- if((i+1)%4==0)
- {
- OLED_DrawPixel(i,60-((tartem*60)/(maxtartem-mintartem)),1);
- }
- }
- if(!blinker)
- {
- for(i=0;i<100;i++)
- {
- mapline[i]=mapline[i+1];
- }
- blinker=1;
- mapline[100]=realtem;
- }
- for(i=0;i<101;i++)
- {
- OLED_DrawPixel(27+i,60-((mapline[i]*60)/maxtartem),1);
- }
- }
- void pid_p(void)
- {
- err=tartem-realtem;//误差
- if(fabs(err)<10){integral=integral+err;}
- derivative = err-lasterr;//微分
- if(integral>500){integral=500;}
- if(integral<-500){integral=-500;}//避免积分值太大
- if(kp*err>1000){err=1000/kp;}
- if(ki*integral>1000){integral=1000/ki;}
- if(kd*derivative>1000){integral=1000/kd;}
- pwm=kp*err+ki*integral+kd*derivative;
- if(pwm>1000){pwm=1000;}
- if(pwm<0){pwm=0;}//防止溢出
- lasterr=err;
- }
|