找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5766|回复: 1
收起左侧

STM32模糊PID控制温度控制程序原理图+LabVIEW上位机

[复制链接]
ID:327295 发表于 2020-8-16 17:52 | 显示全部楼层 |阅读模式
主要设计与实现一种基于LabVIEW的温度控制器的设计。能进行精准且快速的控温。
1、能够在LabVIEW上显示出来并且控制其温度。
2、能制冷到15摄氏度。
3、偏差能小于0.5摄氏度。
对电烤箱温度控制系统建立模型,将传统PID控制与模糊理论或遗传算法相结合,设计了一种新的PID控制器。该控制器,能够实现PID的三个参数自动整定,避免了人工整定的麻烦。仿真结果表明,这种控制算法具有结构简单、响应速度快、控制精度高、鲁棒性强的特点。
程序包括PID,PWM,DS18B20

Altium Designer画的原理图PCB
51hei.png 51hei1.png 51hei.png

单片机源程序如下:
  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, 下载次数: 140, 下载积分: 黑币 -5

硬件.zip

1.12 MB, 下载次数: 111, 下载积分: 黑币 -5

智能空调2.0.zip

385.72 KB, 下载次数: 153, 下载积分: 黑币 -5

回复

使用道具 举报

ID:587076 发表于 2020-9-23 09:37 | 显示全部楼层
好东西,做好了再来评论嘻嘻
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表