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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3613|回復: 7
收起左側

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

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

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

51單片機原理圖和PCB文件:
51hei.png
51hei.png


部分51單片機程序:
  1. int pid_calc(float set_temp ,float now_temp )// pid計算  set_temp 為設定的溫度  now_temp  代表實際輸入的當前溫度值  0 - 100的輸出值
  2. {
  3. Error = set_temp - now_temp;                 // 偏差
  4. if(( Error < max_value_error  ) && ( Error > (min_value_error)  ))//只有在一定的溫差范圍內才pid計算
  5.     {   
  6.     SumError += Error;
  7.     dError    = LastError - PrevError;   // 當前微分
  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//只有開關作用
  14.     {
  15.     if( Error >= max_value_error )//遠大于當前溫度,加熱
  16.         {
  17.         temp_pid = 100;
  18.         //temp_pid = 80;
  19.                 }
  20.     else if( Error <= (min_value_error) )//遠小于當前溫度,不加熱
  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)//由計算結果控制輸出
  36. {

  37. //適用于 pwm
  38. //每200ms根據結果改變一次輸出電壓的值
  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) );//跟上面這句話等價
  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 )//自整定階段  完畢之后轉成pid控制
  60.         {
  61.         //自整定ok后自動轉為pid階段
  62.         //自整定失敗的情況下 讓基本參數恢復默認值

  63.         if( pid_self_sec_flag == 1 )//自整定過程  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)) // 如果總的自整定時間大于了3/5=0.6個小時,則說明整定失敗
  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;//那么將自動退出自整定過程 同時采用默認值  進入pid階段
  77.                         KC = 1.0;//臨界比例系數  初始默認的值
  78.                         TC = 40; //振蕩周期    初始默認的值

  79.                         }

  80.                 if(( pid_self_first_status_flag == 1) || ( pid_self_first_status_flag == 0))//0 設定溫度 低于 當前溫度  //1設定溫度 高于 或者 等于  當前溫度  啟動加熱
  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 )//啟動加熱
  85.                                 {
  86.                                 cool_ack_counter = 0;
  87.                                 hot_ack_counter++;
  88.                                 if(hot_ack_counter > 3)//連續3次都是一樣的結果 說明確定 SV_value >= PV_value
  89.                                         {
  90.                                        
  91.                                         ssr_con_1;
  92.                                         //pwm_con_1;//一旦pwm參與將不能通過操作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;//此時的時間不是最低溫度對應的時間
  104.                                                         }
  105.                                                 }
  106.                                         }
  107.                                 }
  108.                         else//當前溫度 大于 設定溫度 停止加熱
  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;//此時的時間不是最低溫度對應的時間
  126.                                                         }
  127.                                                 }
  128.                                         }
  129.                                 }

  130.                         //最低溫度 出現在 zero_across_counter = 3 的階段
  131.                         //最高溫度 出現在 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個元素
  137.                                         {
  138.                                         k_pid_self_counter = 0;
  139.                                         enable_calc_min_max_flag = 1;
  140.                                         }
  141.                                 if(enable_calc_min_max_flag == 1)//只要有4個值,就可以計算了 后面來的值覆蓋了前面的值
  142.                                         {
  143.                                         //去掉最小值 最大值 取剩下2個值的平均值
  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 時 最低溫度出現在3階段
  164.                                         //pid_self_first_status_flag = 0 時 最低溫度出現在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次過0 則說明出現了振蕩 整定成功
  206.                                 {
  207.                                 zero_across_counter = 0;                                
  208.                                 pid_tune_flag = 0;//進入pid階段
  209.                                 //pid_tune_flag = 1;//test
  210.                                 TIME_Hight = pid_self_time_sec - 3;//此時的時間不是最高溫度對應的時間
  211.                                 LcmClear();//清屏
  212.                                 comm_dis_once_flag    = 1;
  213.                                 special_dis_once_flag = 1;                                
  214.                                 //dis_4_line_as_null();//清除最后一行的內容
  215.                                 //計算 T_Hight T_LOW TIME_Hight TIME_LOW 這4個值
  216.                                 //根據以上4個值  KC 與 TC 的值便會計算出來
  217.                                 
  218.                                 KC = 12.7/(T_Hight - T_LOW);
  219.                                 KC = 5.0 * KC;//因為是0.2s一次 所以擴大5倍
  220.                                 TC = 1 * (TIME_Hight - TIME_LOW);//如果記錄了 最低溫度 與 最高溫度對應的時間 那么沿用這個公式:TC = 2 * (TIME_Hight - TIME_LOW);
  221.                                 }
  222.                         }
  223.                 //顯示具體的值  測試用
  224.                 //dis_pid_self_value(); //test
  225.                 }
  226.         }
  227. else if( pid_tune_flag == 0 )//pid 階段  默認開機進入此階段
  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 * ( 高點溫度對應時間 - 低點溫度對應時間 )
  234.         // TC = 2 * (TIME_Hight - TIME_LOW)
  235.         //1 算出 具體的比例系數 積分秒數 微分秒數
  236.         //Proportion = 0.6*KC
  237.         //I_value    = 0.5*TC
  238.         //D_value    = 0.125*TC
  239.         //2 算出具體的 比例帶 積分系數 微分系數
  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個變量的值
  244.         //P_value     = (1/Proportion)*100  百分比
  245.         //I_value     = 0.5*TC                                秒
  246.         //D_value     = 0.125*TC                        秒
  247.         //4pid計算用的3個變量的值
  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)//進入pid時,0.2秒計算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;//對應 比例帶為 0.1%
  263.                         }
  264.                 else if(KC < 0.5 )
  265.                         {
  266.                         KC = 0.5;//對應 比例帶為 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;//先算 比例系數
  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();//根據上一步的結果控制輸出
  316.         
  317.         }

  318. }
復制代碼

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

評分

參與人數 2黑幣 +55 收起 理由
mashuiyou + 5 共享資料的黑幣獎勵!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

謝謝分享!下載學習下
回復

使用道具 舉報

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

下載下來,有空研究一下,謝謝分享!
回復

使用道具 舉報

ID:338503 發表于 2024-8-7 08:30 | 顯示全部樓層
請問樓主,STM32程序是用什么軟件編的?
回復

使用道具 舉報

ID:97678 發表于 2024-8-7 17:45 | 顯示全部樓層
51單片機的程序這么多的警告!!!
可以把無錯誤的程序文件發一下嗎?
回復

使用道具 舉報

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

那是STM32程序吧?你當518位單片機用了?
回復

使用道具 舉報

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

有C51 的程序。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 四虎在线观看 | 美国十次成人欧美色导视频 | 欧美综合久久 | 成人av一区二区在线观看 | 亚洲一区高清 | 一区二区免费在线观看 | 在线观看免费福利 | 99久久精品国产一区二区三区 | 亚洲精品久 | 亚洲一区二区在线播放 | 精品国产乱码久久久久久蜜臀 | 国产精品日韩一区二区 | 国产精品久久久久久妇女 | 国产黄色网址在线观看 | 国产激情一区二区三区 | 玖玖玖在线| 孰女乱色一区二区三区 | 一区二区精品在线 | 色视频成人在线观看免 | 日本一区二区三区在线观看 | 亚洲国产高清免费 | 在线视频91 | 欧美精品综合 | 日本在线免费观看 | 午夜黄色 | 日韩中文久久 | 日韩成人高清 | 性高朝久久久久久久3小时 av一区二区三区四区 | 日日射夜夜骑 | 国产中文字幕网 | 国产成人av在线播放 | 成人在线观看黄 | 久久精品成人热国产成 | 一区二区三区视频在线观看 | 精品国产一区二区三区四区在线 | 午夜影院在线观看 | 欧美日韩亚洲系列 | 欧美精品在线免费观看 | 日韩一级电影免费观看 | 国产污视频在线 | 色婷婷av一区二区三区软件 |