單片機源程序如下:- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "oled.h"
- #include "usart.h"
- #include "ds18b20.h"
- #include "timer.h"
- short zheng,xiao,temp,temp_numb;
- u16 temp2;
- //short yuzhi;
- uint16_t pwm;
- //float Ki,Kp,Kd;
- u8 flag=1,flag_2=1;
- void read_key()
- {
- u8 key;
- key=KEY_Scan(0);
- switch(key)
- {
- case KEY1_PRES: flag++;OLED_Clear(); if(flag>=4)flag=0;
- break;
-
- case KEY2_PRES:flag_2++; OLED_Clear();if(flag_2>=4) flag_2=1;
- break;
-
- case KEY3_PRES:
-
- if(flag==0)
- yuzhi+=10;
- if(flag_2==1 && flag ==1) Kp+=0.1;
- if(flag_2==2 && flag ==1) Kp+=0.5;
- if(flag_2==3 && flag ==1) Kp+=1;
- if(Kp>=10000) Kp=0;
-
- if(flag_2==1 && flag ==2) Ki+=0.1;
- if(flag_2==2 && flag ==2) Ki+=0.5;
- if(flag_2==3 && flag ==2) Ki+=1;
- if(Ki>=1000) Ki=0;
-
- if(flag_2==1 && flag ==3) Kd+=0.1;
- if(flag_2==2 && flag ==3) Kd+=0.5;
- if(flag_2==3 && flag ==3) Kd+=1;
- if(Kd>=10)Kd=0;
-
- break;
-
- case KEY4_PRES:
-
- if(flag==0)
- yuzhi-=10;
-
- if(flag_2==1 && flag ==1) Kp-=0.1;
- if(flag_2==2 && flag ==1) Kp-=0.5;
- if(flag_2==3 && flag ==1) Kp-=1;
- if(Kp<=0)Kp=0;
-
- if(flag_2==1 && flag ==2) Ki-=0.1;
- if(flag_2==2 && flag ==2) Ki-=0.5;
- if(flag_2==3 && flag ==2) Ki-=1;
- if(Kd<=0)Kd=0;
-
- if(flag_2==1 && flag ==3) Kd-=0.1;
- if(flag_2==2 && flag ==3) Kd-=0.5;
- if(flag_2==3 && flag ==3) Kd-=1;
- if(Ki<=0)Ki=0;
- break;
- }
- }
- // ke_1本次誤差 ke_2 上次誤差
- // en誤差累積 ek本次誤差減上次誤差
- void PID()
- {
-
- float ek_1,en,ek_2,ek;
- ek_1=yuzhi-temp/10;
-
- en+=ek_1;
-
- ek=ek_1-ek_2;
- ek_2=ek_1;
-
- // pwm=Kp*ek_1;
- pwm=Kp*ek_1+Ki*en+Kd*ek;
- }
- int main(void)
- {
- u8 Ki_xiao1,Ki_xiao2,Kd_xiao1,Kd_xiao2;
- u8 t,i;
-
- delay_init(); //延時函數初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
- uart_init(115200); //串口初始化為 115200
- LED_Init(); //初始化與LED連接的硬件接口
-
- OLED_Init();
- OLED_Clear();
- DS18B20_Init();
- OLED_Clear();
- KEY_Init();
- TIM3_PWM_Init(7199,9999); // 1s
-
- Kp=850;Ki=350;Kd=1.1;
- yuzhi=40;
-
- while(1)
- {
- if(flag==1)
- {
-
- OLED_ShowChar(22,35+15,'^',24);
- }
- else if(flag==2)
- {
-
- OLED_ShowChar(12*4+10,35+15,'^',24);
- }
- else if(flag==3)
- {
-
- OLED_ShowChar(12*8+5,35+15,'^',24);
- }
-
-
- if(flag_2==1)
- {
- OLED_ShowNum(0,52,0,1,12);
- OLED_ShowChar(5,52,'.',12);
- OLED_ShowNum(10,52,1,1,12);
- }
- else if(flag_2==2)
- {
- OLED_ShowNum(0,52,0,1,12);
- OLED_ShowChar(5,52,'.',12);
- OLED_ShowNum(10,52,5,1,12);
- }
- else if(flag_2==3)
- {
- OLED_ShowNum(0,52,1,1,12);
-
- }
-
- OLED_ShowChinese(0,0,0,16);
- OLED_ShowChinese(1*16,0,1,16);
- OLED_ShowChinese(2*16,0,2,16);
- OLED_ShowChinese(3*16,0,3,16);
-
- OLED_ShowNum(4*16+5,0,yuzhi,3,16);
-
- OLED_ShowChinese(0*16,16,4,16);
- OLED_ShowChinese(1*16,16,5,16);
- OLED_ShowChinese(2*16,16,2,16);
- OLED_ShowChinese(3*16,16,3,16);
-
- OLED_ShowNum(4*16+5,16,zheng+1,3,16);
-
- OLED_ShowChar(69+25,16,'.',16);
- OLED_ShowNum(69+30,16,xiao,1,16);
-
-
-
- Ki_xiao1=Ki*10 ;
- Ki_xiao2=Ki_xiao1%10;
-
- Kd_xiao1=Kd*10 ;
- Kd_xiao2=Kd_xiao1%10;
-
- OLED_ShowString(0,35,"Kp:",12);
- OLED_ShowNum(17,35,Kp,4,12);
-
- OLED_ShowString(12*3+9,35,"Ki:",12);
- OLED_ShowNum(12*4+5+9,35,Ki,3,12);
- // OLED_ShowChar(12*4+10+9,35,'.',12);
- // OLED_ShowNum(12*4+15+9,35,Ki_xiao2,1,12);
-
- OLED_ShowString(12*7,35,"Kd:",12);
- OLED_ShowNum(12*8+5,35,Kd,1,12);
- OLED_ShowChar(12*8+10,35,'.',12);
- OLED_ShowNum(12*8+15,35,Kd_xiao2,1,12);
-
- OLED_Refresh();
- read_key();
-
-
-
- PID();
- TIM_SetCompare1(TIM3,pwm);
-
-
-
-
-
- temp=DS18B20_Get_Temp();
- zheng=temp/10;
- xiao=temp%10;
-
- // i++ ;
- // temp2+=temp_numb;
- // if(i>=10)
- // {
- // temp=temp2/i;
- // i=0;
- // zheng=temp/10;
- // xiao=temp%10;
- // }
-
-
- }
- }
復制代碼
|