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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6910|回復: 1
打印 上一主題 下一主題
收起左側

STM32模糊PID控制溫度控制程序原理圖+LabVIEW上位機

[復制鏈接]
跳轉到指定樓層
樓主
主要設計與實現一種基于LabVIEW的溫度控制器的設計。能進行精準且快速的控溫。
1、能夠在LabVIEW上顯示出來并且控制其溫度。
2、能制冷到15攝氏度。
3、偏差能小于0.5攝氏度。
對電烤箱溫度控制系統建立模型,將傳統PID控制與模糊理論或遺傳算法相結合,設計了一種新的PID控制器。該控制器,能夠實現PID的三個參數自動整定,避免了人工整定的麻煩。仿真結果表明,這種控制算法具有結構簡單、響應速度快、控制精度高、魯棒性強的特點。
程序包括PID,PWM,DS18B20

Altium Designer畫的原理圖PCB


單片機源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "oled.h"
  4. #include <stdio.h>
  5. #include "ds18b20.h"
  6. #include "ds18b20_2.h"
  7. #include "pid.h"
  8. #include "stm32f10x.h"
  9. #include "usart.h"
  10. #include "PWM_Output.h"

  11. static TIM_OCInitTypeDef PWMBASE;
  12. static uint16_t per_tmp;
  13. extern float Kp;
  14. extern float Ki;
  15. extern float Kd;
  16. static int ind;
  17. static unsigned char tmp2[60];

  18. void init_pwm(uint16_t per, uint16_t pre)
  19. {
  20.     TIM_TimeBaseInitTypeDef TIMBASE;
  21.    
  22.     GPIO_InitTypeDef GPIOBASE;
  23.    
  24.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  25.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  26.    
  27.     GPIOBASE.GPIO_Mode = GPIO_Mode_AF_PP;
  28.     GPIOBASE.GPIO_Speed = GPIO_Speed_50MHz;
  29.     GPIOBASE.GPIO_Pin = GPIO_Pin_8;
  30.     GPIO_Init(GPIOB, &GPIOBASE);
  31.    
  32.     PWMBASE.TIM_OCMode = TIM_OCMode_PWM1;
  33.     PWMBASE.TIM_OutputState = TIM_OutputState_Enable;
  34.     PWMBASE.TIM_Pulse = per / 2;
  35.     PWMBASE.TIM_OCPolarity = TIM_OCPolarity_High;
  36.    
  37.     TIM_OC3Init(TIM4, &PWMBASE);
  38.    
  39.     TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);

  40.     TIMBASE.TIM_ClockDivision = TIM_CKD_DIV1;
  41.     TIMBASE.TIM_CounterMode = TIM_CounterMode_Up;
  42.     TIMBASE.TIM_Period = per - 1;
  43.     TIMBASE.TIM_Prescaler = pre;
  44.     TIM_TimeBaseInit(TIM4, &TIMBASE);
  45.         
  46.     TIM_ARRPreloadConfig(TIM4, ENABLE);
  47.    
  48.     TIM_Cmd(TIM4, ENABLE);
  49.    
  50.     per_tmp = per;
  51. }

  52. void Cold_pwm(uint16_t pwm1)
  53. {
  54.     if (pwm1 > per_tmp) pwm1 = per_tmp;
  55.    
  56.     PWMBASE.TIM_Pulse = pwm1;
  57.     TIM_OC3Init(TIM4, &PWMBASE);
  58. }
  59. void Fan_pwm(uint16_t pwm1)
  60. {
  61.     if (pwm1 > per_tmp) pwm1 = per_tmp;
  62.    
  63.     PWMBASE.TIM_Pulse = pwm1;
  64.     TIM_OC2Init(TIM4, &PWMBASE);
  65. }

  66. void Fan_Init(void)
  67. {
  68.         GPIO_InitTypeDef GPIO_InitStructure;
  69.         
  70.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  71.         
  72.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  73.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  74.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  75.         GPIO_Init(GPIOB, &GPIO_InitStructure);   

  76.         GPIO_SetBits(GPIOB, GPIO_Pin_7);
  77. }
  78. float USART_Scanf(void)
  79. {
  80.         if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET)
  81.         {
  82.                 tmp2[ind++] = (USART_ReceiveData(USART2));
  83.                 ind = 0;
  84.                 while (ind < 5)
  85.                 {
  86.                         while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET)
  87.                         {}
  88.                         tmp2[ind++] = (USART_ReceiveData(USART2));
  89.                 }
  90.                         tmp2[ind] = '\0';
  91.                         ind = 0;
  92.                         if(tmp2[4] == 'C')
  93.                         {
  94.                                 return(tmp2[0]-0x30)*10 + (tmp2[1]-0x30) + (tmp2[3]-0x30)*0.1;
  95.                         }
  96.         }
  97.         return 0;
  98. }
  99. int main(void)
  100. {
  101.         u8 datH[30];
  102.         u8 datL[30];
  103.         u8 Radiator[30];
  104.         u16 Kpf[7] = {10000, 10000, 10000, 5000, 4000, 0, 0};
  105.         
  106.         float set = 0;
  107.         float set_USART = 0;
  108.         u8 set_key[3] = {' ', ' ', ' '};
  109.         float dat0 = 0;
  110.         float dat1 = 0;
  111.         float PRO = 0;        //放置PID返回值,防止pid運算多次
  112.         int i = 0;
  113.         
  114.         init_pwm(10000,72);
  115.         delay_init();        
  116.         OLED_Init();                        //初始化OLED   
  117.         OLED_Clear();
  118.         DS18B20_Init();
  119.         DS18B20_Init_2();
  120.         USART2_Config();
  121. //        printf("\r\nInit OK");
  122.         Fan_Init();
  123.         
  124.         set = 20.00;
  125.         Cold_pwm(10000);
  126.         Fan_pwm(0);

  127.         while(1)
  128.         {
  129.                 i++;
  130.                 //printf("%d\r\n", i);
  131.                 dat0 = DS18B20_Get_Temp();
  132.                 dat0 = dat0/10;
  133.                 dat1 = DS18B20_Get_Temp_2();
  134.                 dat1 = dat1/10;
  135.                 set_USART = USART_Scanf();
  136.                 if(set_USART != 0)
  137.                 {
  138.                         set = set_USART;
  139.                 }

  140.                 if((dat0 - set) > 15)
  141.                 {
  142.                         Kp = Kpf[0];
  143.                 }
  144.                 else if((dat0 - set) > 3 && (dat0 - set) <= 5)
  145.                 {
  146.                         Kp = Kpf[1];
  147.                 }
  148.                 else if((dat0 - set) > 2 && (dat0 - set) <= 3)
  149.                 {
  150.                         Kp = Kpf[2];
  151.                 }
  152.                 else if((dat0 - set) <= 2 && (dat0 - set) >= 0.5)
  153.                 {
  154.                         Kp = Kpf[3];
  155.                 }
  156.                 else if((dat0 - set) < 0.5 && (dat0 - set) >= 0)
  157.                 {
  158.                         Kp = Kpf[4];
  159.                 }
  160.                 else if((dat0 - set) <= 0)
  161.                 {
  162.                         Kp = Kpf[5];
  163.                 }
  164.                
  165.                 if((dat0 - set) >= 0)
  166.                 {
  167.                         Cold_pwm(0);
  168.                 }
  169.                 else
  170.                 {
  171.                         Cold_pwm(10000);
  172.                 }
  173.                
  174.                 if(dat1 >= 43)
  175.                 {
  176.                         OLED_ShowString(0, 0, "WARNING");
  177.                 }
  178.                 else
  179.                 {
  180.                         OLED_ShowString(0, 0, "         ");
  181.                 }
  182.                         
  183.                 PRO = inc_pid(dat0, set);
  184.                 //printf("  PWM:%.2f%%",(PRO/100));
  185.                 //printf("  Fan:%.2f",dat1);
  186.                 Fan_pwm(PRO);
  187.                
  188. //                sprintf(pwm, "PWM:%.2f%", (PRO/100));
  189.                 sprintf(datH, "Current:%.2f", dat0);
  190.                 sprintf(Radiator, "Radiator:%.2f", dat1);
  191.                
  192. //                OLED_ShowString(0, 0, pwm);
  193.                 OLED_ShowString(0, 4, datL);
  194.                 OLED_ShowString(0, 6, Radiator);

  195.                 sprintf(datL, "Setting:%.2f", set);
  196.                 OLED_ShowString(0, 2, datH);
  197.                 if(i == 23)
  198.                 {
  199.                         i = 0;
  200.                         printf("A%.2fB%.2fD",dat0,dat1 );
  201.                 }
  202.         }
  203. }

復制代碼

下載(設計中還存在一些瑕疵,希望各位大佬指導):

上位機.zip

54.8 KB, 下載次數: 143, 下載積分: 黑幣 -5

硬件.zip

1.12 MB, 下載次數: 117, 下載積分: 黑幣 -5

智能空調2.0.zip

385.72 KB, 下載次數: 158, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:587076 發表于 2020-9-23 09:37 | 只看該作者
好東西,做好了再來評論嘻嘻
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.av在线| 黄色大片免费播放 | 午夜电影一区二区 | 二区av| 精品国产欧美 | 男人的天堂视频网站 | 全免一级毛片 | 日韩在线免费视频 | 国产欧美精品 | 亚洲成人午夜在线 | 国产99热精品 | 精品国产欧美 | www.4567| 日韩欧美视频 | 色香蕉在线 | 国产精品欧美一区二区 | 欧美一级二级三级视频 | 亚洲精品乱码久久久久v最新版 | www.47久久青青| 日韩有码一区二区三区 | 成人精品在线 | 色综合天天天天做夜夜夜夜做 | 久久久久久91 | 国产一区欧美 | 色免费看 | 玖草资源 | 国产精品免费一区二区三区四区 | 日韩在线电影 | 亚洲精品欧美 | 欧美在线成人影院 | 黄色网址在线免费观看 | 国产精品永久免费观看 | 中文在线一区二区 | 亚洲人成在线观看 | 国产乱码精品一区二区三区中文 | 中文字幕高清 | 国产精品片 | 午夜小视频在线播放 | 亚洲国产aⅴ精品一区二区 免费观看av | 久久久性 | 亚洲精品一区二区三区蜜桃久 |