久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3622|回復(fù): 7
收起左側(cè)

自整定PID溫控51單片機(jī)STM32程序源碼 PCB原理圖資料

  [復(fù)制鏈接]
ID:859423 發(fā)表于 2023-6-11 15:01 | 顯示全部樓層 |閱讀模式
全新熱偶自整定PID溫控51芯片 STM32單片機(jī)都有

STM32單片機(jī)原理圖和PCB文件:
51hei.png 51hei.png

51單片機(jī)原理圖和PCB文件:
51hei.png
51hei.png


部分51單片機(jī)程序:
  1. int pid_calc(float set_temp ,float now_temp )// pid計(jì)算  set_temp 為設(shè)定的溫度  now_temp  代表實(shí)際輸入的當(dāng)前溫度值  0 - 100的輸出值
  2. {
  3. Error = set_temp - now_temp;                 // 偏差
  4. if(( Error < max_value_error  ) && ( Error > (min_value_error)  ))//只有在一定的溫差范圍內(nèi)才pid計(jì)算
  5.     {   
  6.     SumError += Error;
  7.     dError    = LastError - PrevError;   // 當(dāng)前微分
  8.     PrevError = LastError;
  9.     LastError = Error;
  10.     temp_pid  =  (int)((Proportion * Error) + (Integral * SumError) + (Derivative * dError));   
  11.     //temp_pid  =  (int)(temp_pid * 0.5) ;//輸出比例控制
  12.         }
  13. else//只有開(kāi)關(guān)作用
  14.     {
  15.     if( Error >= max_value_error )//遠(yuǎn)大于當(dāng)前溫度,加熱
  16.         {
  17.         temp_pid = 100;
  18.         //temp_pid = 80;
  19.                 }
  20.     else if( Error <= (min_value_error) )//遠(yuǎn)小于當(dāng)前溫度,不加熱
  21.         {
  22.         temp_pid = 0;
  23.         }
  24.     }
  25. if( temp_pid < 0 )
  26.     {
  27.     temp_pid = 0;
  28.     }
  29. else if( temp_pid > 100 )
  30.     {
  31.     temp_pid = 100;
  32.     }
  33. return temp_pid;
  34. }


  35. void pid_con(void)//由計(jì)算結(jié)果控制輸出
  36. {

  37. //適用于 pwm
  38. //每200ms根據(jù)結(jié)果改變一次輸出電壓的值
  39. if( pwm_con_time_flag == 1)
  40.         {
  41.         pwm_con_time_flag = 0;
  42.         
  43.         //lcd_s_12864_light_1;delay_ms(10);lcd_s_12864_light_0;//test

  44.         //set_pwm_value(40 + (uchar)(pid_result * (((float)(237-40))/100.0)) );
  45.         set_pwm_value(40 + (uchar)(pid_result * 1.97) );//跟上面這句話等價(jià)
  46.         
  47.         }

  48. }


  49. void pid_pro(void)//pid 自整定及控制輸出 ppppppppppppppppppppppppppppp
  50. {
  51. //每200ms獲得一次溫度
  52. if( get_now_temp_flag == 1)//200ms秒獲得一次溫度
  53.         {
  54.         get_now_temp_flag = 0;
  55.         
  56.         //lcd_s_12864_light_1;delay_ms(10);lcd_s_12864_light_0;//test

  57.         PV_value = read_max6675_temper();
  58.         }

  59. if     ( pid_tune_flag == 1 )//自整定階段  完畢之后轉(zhuǎn)成pid控制
  60.         {
  61.         //自整定ok后自動(dòng)轉(zhuǎn)為pid階段
  62.         //自整定失敗的情況下 讓基本參數(shù)恢復(fù)默認(rèn)值

  63.         if( pid_self_sec_flag == 1 )//自整定過(guò)程  0.2秒1次
  64.                 {
  65.                 pid_self_sec_flag = 0;
  66.                 dis_tune_once_flag = 1;//0.2秒顯示1次基本信息
  67.                 //lcd_s_12864_light_0;delay_ms(10);lcd_s_12864_light_1;//test

  68.                 pid_self_time_sec++;
  69.                 if(pid_self_time_sec > (3600*3)) // 如果總的自整定時(shí)間大于了3/5=0.6個(gè)小時(shí),則說(shuō)明整定失敗
  70.                         {
  71.                         pid_self_time_sec = 0;                        
  72.                         //lcd_s_12864_light_0;delay_ms(10);lcd_s_12864_light_1;//test
  73.                         LcmClear();//清屏
  74.                         comm_dis_once_flag    = 1;
  75.                         special_dis_once_flag = 1;
  76.                         pid_tune_flag = 0;//那么將自動(dòng)退出自整定過(guò)程 同時(shí)采用默認(rèn)值  進(jìn)入pid階段
  77.                         KC = 1.0;//臨界比例系數(shù)  初始默認(rèn)的值
  78.                         TC = 40; //振蕩周期    初始默認(rèn)的值

  79.                         }

  80.                 if(( pid_self_first_status_flag == 1) || ( pid_self_first_status_flag == 0))//0 設(shè)定溫度 低于 當(dāng)前溫度  //1設(shè)定溫度 高于 或者 等于  當(dāng)前溫度  啟動(dòng)加熱
  81.                         {

  82.                         //lcd_s_12864_light_0;delay_ms(10);lcd_s_12864_light_1;//test

  83.                         //基本on/off控制
  84.                         if( SV_value >= PV_value )//啟動(dòng)加熱
  85.                                 {
  86.                                 cool_ack_counter = 0;
  87.                                 hot_ack_counter++;
  88.                                 if(hot_ack_counter > 3)//連續(xù)3次都是一樣的結(jié)果 說(shuō)明確定 SV_value >= PV_value
  89.                                         {
  90.                                        
  91.                                         ssr_con_1;
  92.                                         //pwm_con_1;//一旦pwm參與將不能通過(guò)操作io的形式控制該口線
  93.                                         set_pwm_value(237);//全速加熱

  94.                                         if(once_add_1_flag == 0)
  95.                                                 {
  96.                                                 once_add_1_flag = 1;
  97.                                                 zero_across_counter++;
  98.                                                 
  99.                                                 //lcd_s_12864_light_0;delay_ms(10);lcd_s_12864_light_1;//test
  100.                                                 
  101.                                                 if(zero_across_counter == 3 )
  102.                                                         {
  103.                                                         TIME_LOW = pid_self_time_sec - 3;//此時(shí)的時(shí)間不是最低溫度對(duì)應(yīng)的時(shí)間
  104.                                                         }
  105.                                                 }
  106.                                         }
  107.                                 }
  108.                         else//當(dāng)前溫度 大于 設(shè)定溫度 停止加熱
  109.                                 {
  110.                                 
  111.                                 //lcd_s_12864_light_0;delay_ms(10);lcd_s_12864_light_1;//test
  112.                                                                
  113.                                 hot_ack_counter = 0;
  114.                                 cool_ack_counter++;
  115.                                 if(cool_ack_counter > 3)
  116.                                         {
  117.                                         ssr_con_0;
  118.                                         set_pwm_value(40);//不加熱
  119.                                         if(once_add_1_flag == 1)
  120.                                                 {
  121.                                                 once_add_1_flag = 0;
  122.                                                 zero_across_counter++;
  123.                                                 if(zero_across_counter == 3 )
  124.                                                         {
  125.                                                         TIME_LOW = pid_self_time_sec - 3;//此時(shí)的時(shí)間不是最低溫度對(duì)應(yīng)的時(shí)間
  126.                                                         }
  127.                                                 }
  128.                                         }
  129.                                 }

  130.                         //最低溫度 出現(xiàn)在 zero_across_counter = 3 的階段
  131.                         //最高溫度 出現(xiàn)在 zero_across_counter = 4 的階段
  132.                         if((zero_across_counter == 3 ) || (zero_across_counter == 4 ))
  133.                                 {                                
  134.                                 pid_self_calc_buffer[k_pid_self_counter] = PV_value;
  135.                                 k_pid_self_counter++;
  136.                                 if(k_pid_self_counter > 3)//0--3 共4個(gè)元素
  137.                                         {
  138.                                         k_pid_self_counter = 0;
  139.                                         enable_calc_min_max_flag = 1;
  140.                                         }
  141.                                 if(enable_calc_min_max_flag == 1)//只要有4個(gè)值,就可以計(jì)算了 后面來(lái)的值覆蓋了前面的值
  142.                                         {
  143.                                         //去掉最小值 最大值 取剩下2個(gè)值的平均值
  144.                                         sum_temp = 0.0;  //先清0
  145.                                         min_temp = 1024.0;
  146.                                         max_temp = 0.0;
  147.                                                 
  148.                                         for(k_max_min = 0; k_max_min < 4; k_max_min++ )
  149.                                                 {                                                
  150.                                                 if(pid_self_calc_buffer[k_max_min] <= min_temp)
  151.                                                         {
  152.                                                         min_temp = pid_self_calc_buffer[k_max_min];
  153.                                                         }
  154.                                                 if(pid_self_calc_buffer[k_max_min] >= max_temp)
  155.                                                         {
  156.                                                         max_temp = pid_self_calc_buffer[k_max_min];
  157.                                                         }                                                
  158.                                                 sum_temp = (sum_temp + pid_self_calc_buffer[k_max_min]);
  159.                                                 }
  160.                                         sum_temp =  sum_temp - min_temp - max_temp ;
  161.                                        
  162.                                        
  163.                                         //pid_self_first_status_flag = 1 時(shí) 最低溫度出現(xiàn)在3階段
  164.                                         //pid_self_first_status_flag = 0 時(shí) 最低溫度出現(xiàn)在4階段
  165.                                         if(pid_self_first_status_flag == 1)
  166.                                                 {
  167.                                                 if(zero_across_counter == 3 )//最低溫度
  168.                                                         {
  169.                                                         aver_temp = (sum_temp/2.0);                                       
  170.                                                         if( aver_temp <= T_LOW )
  171.                                                                 {
  172.                                                                 T_LOW = aver_temp;
  173.                                                                 }                                
  174.                                                         }
  175.                                                 else if(zero_across_counter == 4 )//最高溫度
  176.                                                         {
  177.                                                         aver_temp = (sum_temp/2.0);
  178.                                                         if( aver_temp >= T_Hight )
  179.                                                                 {
  180.                                                                 T_Hight = aver_temp;
  181.                                                                 }
  182.                                                         }
  183.                                                 }
  184.                                         else if(pid_self_first_status_flag == 0)
  185.                                                 {
  186.                                                 if(zero_across_counter == 4 )//最低溫度
  187.                                                         {
  188.                                                         aver_temp = (sum_temp/2.0);                                       
  189.                                                         if( aver_temp <= T_LOW )
  190.                                                                 {
  191.                                                                 T_LOW = aver_temp;
  192.                                                                 }                                
  193.                                                         }
  194.                                                 else if(zero_across_counter == 3 )//最高溫度
  195.                                                         {
  196.                                                         aver_temp = (sum_temp/2.0);
  197.                                                         if( aver_temp >= T_Hight )
  198.                                                                 {
  199.                                                                 T_Hight = aver_temp;
  200.                                                                 }
  201.                                                         }
  202.                                                 }
  203.                                         }
  204.                                 }
  205.                         else if(zero_across_counter == 5 )//4次過(guò)0 則說(shuō)明出現(xiàn)了振蕩 整定成功
  206.                                 {
  207.                                 zero_across_counter = 0;                                
  208.                                 pid_tune_flag = 0;//進(jìn)入pid階段
  209.                                 //pid_tune_flag = 1;//test
  210.                                 TIME_Hight = pid_self_time_sec - 3;//此時(shí)的時(shí)間不是最高溫度對(duì)應(yīng)的時(shí)間
  211.                                 LcmClear();//清屏
  212.                                 comm_dis_once_flag    = 1;
  213.                                 special_dis_once_flag = 1;                                
  214.                                 //dis_4_line_as_null();//清除最后一行的內(nèi)容
  215.                                 //計(jì)算 T_Hight T_LOW TIME_Hight TIME_LOW 這4個(gè)值
  216.                                 //根據(jù)以上4個(gè)值  KC 與 TC 的值便會(huì)計(jì)算出來(lái)
  217.                                 
  218.                                 KC = 12.7/(T_Hight - T_LOW);
  219.                                 KC = 5.0 * KC;//因?yàn)槭?.2s一次 所以擴(kuò)大5倍
  220.                                 TC = 1 * (TIME_Hight - TIME_LOW);//如果記錄了 最低溫度 與 最高溫度對(duì)應(yīng)的時(shí)間 那么沿用這個(gè)公式:TC = 2 * (TIME_Hight - TIME_LOW);
  221.                                 }
  222.                         }
  223.                 //顯示具體的值  測(cè)試用
  224.                 //dis_pid_self_value(); //test
  225.                 }
  226.         }
  227. else if( pid_tune_flag == 0 )//pid 階段  默認(rèn)開(kāi)機(jī)進(jìn)入此階段
  228.         {
  229.         //0 算出 臨界增益 KC 及 振蕩周期 TC
  230.         // KC = (4*d)/(3.14*A)  ---> d = 5(輸出幅值) ; A = 記錄的溫度最高值與最低值的差值的0.5倍 即:(T_Hight - T_LOW)*0.5
  231.         // KC = (4*5)/(3.14*((T_Hight - T_LOW)*0.5)) = 40/3.14/(T_Hight - T_LOW) =  12.7/(T_Hight - T_LOW)
  232.         // KC = 12.7/(T_Hight - T_LOW)
  233.         // TC = 2 * (TIME_Hight - TIME_LOW) ---> 2 * ( 高點(diǎn)溫度對(duì)應(yīng)時(shí)間 - 低點(diǎn)溫度對(duì)應(yīng)時(shí)間 )
  234.         // TC = 2 * (TIME_Hight - TIME_LOW)
  235.         //1 算出 具體的比例系數(shù) 積分秒數(shù) 微分秒數(shù)
  236.         //Proportion = 0.6*KC
  237.         //I_value    = 0.5*TC
  238.         //D_value    = 0.125*TC
  239.         //2 算出具體的 比例帶 積分系數(shù) 微分系數(shù)
  240.         //P_value     = (1/Proportion)*100
  241.         //Integral          = Proportion/I_value = (0.6*KC)/(0.5*TC)
  242.         //Derivative  = Proportion*D_value = (0.6*KC)*(0.125*TC)  
  243.         //3顯示用的3個(gè)變量的值
  244.         //P_value     = (1/Proportion)*100  百分比
  245.         //I_value     = 0.5*TC                                秒
  246.         //D_value     = 0.125*TC                        秒
  247.         //4pid計(jì)算用的3個(gè)變量的值
  248.         //Proportion  = 0.6*KC
  249.         //Integral          = Proportion/I_value = (0.6*KC)/(0.5*TC)
  250.         //Derivative  = Proportion*D_value = (0.6*KC)*(0.125*TC)  
  251.         
  252.         //KC = 21.4;//test
  253.         //TC = 471;//test
  254.         
  255.         if(enable_pid_sec_flag == 1)//進(jìn)入pid時(shí),0.2秒計(jì)算1次
  256.                 {
  257.                 enable_pid_sec_flag = 0;
  258.                
  259.                 //lcd_s_12864_light_0;delay_ms(10);lcd_s_12864_light_1;//test

  260.                 if(KC > 1666.0 )
  261.                         {
  262.                         KC = 1666.0;//對(duì)應(yīng) 比例帶為 0.1%
  263.                         }
  264.                 else if(KC < 0.5 )
  265.                         {
  266.                         KC = 0.5;//對(duì)應(yīng) 比例帶為 200.0%
  267.                         }
  268.                 if(TC > 7200 )
  269.                         {
  270.                         TC = 7200;
  271.                         }
  272.                 else if(TC < 8 )
  273.                         {
  274.                         TC = 8;
  275.                         }
  276.                
  277.                 Proportion  = 0.6*KC;//先算 比例系數(shù)
  278.                
  279.                 P_value     = ((1/Proportion)*100);     //比例帶  百分比
  280.                 I_value     = (int)(0.5*TC);                        //積分    秒
  281.                 D_value     = (int)(0.125*TC);                        //微分    秒
  282.                 //限幅處理
  283.                 if(P_value > 200.0)
  284.                         {
  285.                         P_value = 200.0;
  286.                         }
  287.                 else if(P_value < 0.0)
  288.                         {
  289.                         P_value = 0.0;
  290.                         }
  291.                 if(I_value > 3600)
  292.                         {
  293.                         I_value = 3600;
  294.                         }
  295.                 else if(I_value < 0)
  296.                         {
  297.                         I_value = 0;
  298.                         }
  299.                 if(D_value > 900)
  300.                         {
  301.                         D_value = 900;
  302.                         }
  303.                 else if(D_value < 0)
  304.                         {
  305.                         D_value = 0;
  306.                         }
  307.                
  308.                 Proportion  = 0.6*KC;
  309.                 Integral        = (0.6*KC)/(0.5*TC);
  310.                 Derivative  = (0.6*KC)*(0.125*TC);
  311.                
  312.                 pid_result = pid_calc(SV_value,PV_value);
  313.                 }
  314.         
  315.         pid_con();//根據(jù)上一步的結(jié)果控制輸出
  316.         
  317.         }

  318. }
復(fù)制代碼

下載:
STM32單片機(jī)程序+原理圖.7z (1.59 MB, 下載次數(shù): 133)

評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
mashuiyou + 5 共享資料的黑幣獎(jiǎng)勵(lì)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:277290 發(fā)表于 2023-6-12 08:22 | 顯示全部樓層
有空研究一下,謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:230225 發(fā)表于 2023-6-21 08:17 | 顯示全部樓層
mashuiyou 發(fā)表于 2023-6-12 08:22
有空研究一下,謝謝分享!

謝謝分享!下載學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

ID:338503 發(fā)表于 2024-8-7 08:26 | 顯示全部樓層

下載下來(lái),有空研究一下,謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:338503 發(fā)表于 2024-8-7 08:30 | 顯示全部樓層
請(qǐng)問(wèn)樓主,STM32程序是用什么軟件編的?
回復(fù)

使用道具 舉報(bào)

ID:97678 發(fā)表于 2024-8-7 17:45 | 顯示全部樓層
51單片機(jī)的程序這么多的警告。!
可以把無(wú)錯(cuò)誤的程序文件發(fā)一下嗎?
回復(fù)

使用道具 舉報(bào)

ID:1042173 發(fā)表于 2024-8-9 18:27 | 顯示全部樓層
jovew 發(fā)表于 2024-8-7 17:45
51單片機(jī)的程序這么多的警告。!
可以把無(wú)錯(cuò)誤的程序文件發(fā)一下嗎?

那是STM32程序吧?你當(dāng)518位單片機(jī)用了?
回復(fù)

使用道具 舉報(bào)

ID:97678 發(fā)表于 2024-8-10 07:46 | 顯示全部樓層
QQQQ987 發(fā)表于 2024-8-9 18:27
那是STM32程序吧?你當(dāng)518位單片機(jī)用了?

有C51 的程序。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天干视频 | 四虎影院在线免费观看 | 天色综合网 | 国产一区三区在线 | 99精品国产一区二区青青牛奶 | 伊人久久综合 | 九九久久精品视频 | 亚洲人成在线观看 | 黄色免费在线观看 | av电影手机在线看 | 欧美久久一级 | 蜜桃传媒av| 中文字幕精品一区 | 国产精品一区二区三区免费观看 | 大香在线伊779 | 一区二区免费在线观看 | 91在线视频在线观看 | 亚洲最新在线视频 | h片在线看 | 成人在线视频免费看 | 日韩精品一区二区三区视频播放 | 成人免费小视频 | 老司机精品福利视频 | 韩国成人在线视频 | 欧美日韩中文在线 | 国产97色| 久久久蜜桃一区二区人 | 久久国产精品免费一区二区三区 | 黄色毛片黄色毛片 | 国产精品成人国产乱一区 | 日韩免费高清视频 | 欧美精品中文 | 99精品国产一区二区青青牛奶 | 色爱综合网 | 国产2区| 97国产精品视频人人做人人爱 | 一级黄在线观看 | 黄色网页在线观看 | 国产精品无码久久久久 | 精品福利在线 | 国产日产精品一区二区三区四区 |