0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于CW32的PID溫度控制案例分享

CW32生態(tài)社區(qū) ? 來源:CW32生態(tài)社區(qū) ? 2023-08-14 18:21 ? 次閱讀

1.PID溫控系統(tǒng)是一種常用的控制系統(tǒng),用于實現(xiàn)對溫度變量的精確控制。PID算法根據(jù)當(dāng)前的溫度誤差以及誤差的變化率,計算一個控制信號,用于調(diào)節(jié)加熱器的輸出。以下是PID算法的三個主要組成部分:

①比例(Proportional)控制:比例控制是根據(jù)當(dāng)前的溫度誤差來計算控制信號。具體而言,通過將設(shè)定溫度與實際溫度之間的差異稱為誤差,然后將誤差乘以一個比例增益參數(shù),得到一個修正值。這個修正值與控制設(shè)備的輸出信號相加,以調(diào)整溫度控制。

②積分(Integral)控制:積分控制用于處理長期的溫度誤差。它通過對溫度誤差進(jìn)行積分來計算一個積分誤差。積分誤差乘以積分增益參數(shù),并且在一段時間內(nèi)進(jìn)行積累,得到一個修正值。積分控制可以幫助消除持續(xù)的穩(wěn)態(tài)誤差,使系統(tǒng)更快地達(dá)到設(shè)定溫度。

③微分(Derivative)控制:微分控制用于處理溫度變化的速率。它通過計算溫度誤差的變化率,即誤差的導(dǎo)數(shù),得到一個微分值。微分值乘以一個微分增益參數(shù),用于調(diào)整修正值。微分控制可以幫助系統(tǒng)更快地響應(yīng)溫度變化,以防止過沖。

通過結(jié)合比例、積分和微分部分的修正值,PID控制算法可以計算出最終的控制信號。這個控制信號會被傳遞給加熱器,以控制溫度的變化。

2.本實驗用到了CW32-48大學(xué)計劃開發(fā)板OK、溫控實驗?zāi)K及Keil5開發(fā)環(huán)境。


CW32-48大學(xué)計劃開發(fā)板OK

溫控實驗?zāi)K
e0ec5ca4-3a89-11ee-9e74-dac502259ad0.png
e0fbcc7a-3a89-11ee-9e74-dac502259ad0.png
溫控模塊電路原理


4.核心代碼

mian.c:


#include "config.h"


unsigned char face = 0;       //界面變量
unsigned char face_brush = 0; //界面刷新頻率控制


void InitSystem(void)  
{
  RCC_Configuration();        //時鐘配置
  ADC_Configuration();        //ADC采集通道配置,采集NTC熱敏電阻電壓
  PID_Configuration();        //PID參數(shù)配置
  GPIO_KEYS_Configuration(); //按鍵GPIO配置
  PWM_Init();                  //兩路PWM輸出初始化
  Lcd_Init();                 //TFT屏幕初始化
  BTIM_Init();                //定時器初始化
}


void Interface(void)  //人機(jī)交互界面
{
  if ( face_brush > 200 )  //200ms刷新一次
  {
    face_brush = 0;
    switch(face)
    {
      case 0://顯示PV和SV,該界面下,可以設(shè)定SV
        TFTSHOW_STRING_HEADLINE(0,0,"  PID  Control  ");
        TFTSHOW_STRING(2,0,"REAL_Temper(℃):");
        TFTSHOW_STRING(4,0,"   P V:       ");
        TFTSHOW_FLOAT_NUMBER(4,8,pid.Pv);
        TFTSHOW_STRING(6,0,"SET_Temper(℃):");
        TFTSHOW_STRING(8,0,"   S V:       ");
        TFTSHOW_FLOAT_NUMBER(8,8,pid.set_Sv);
        break;
      case 1://該界面下,可以設(shè)定P參數(shù)
        TFTSHOW_STRING_HEADLINE(0,0,"  PID  Control  ");
        TFTSHOW_STRING(2,0,"SET PID Control:");
        TFTSHOW_STRING(4,0,"    P :       ");
        TFTSHOW_INT_NUMBER(4,8,pid.set_Kp);
        break;
      case 2://該界面下,可以設(shè)定I參數(shù)
        TFTSHOW_STRING_HEADLINE(0,0,"  PID  Control  ");
        TFTSHOW_STRING(2,0,"SET PID Control:");
        TFTSHOW_STRING(4,0,"    I :       ");
        TFTSHOW_FLOAT_NUMBER(4,8,pid.set_Ki);
        break;
      case 3://該界面下,可以設(shè)定D參數(shù)
        TFTSHOW_STRING_HEADLINE(0,0,"  PID  Control  ");
        TFTSHOW_STRING(2,0,"SET PID Control:");
        TFTSHOW_STRING(4,0,"    D :       ");
        TFTSHOW_INT_NUMBER(4,8,pid.set_Kd);
        break;
      case 4://該界面下,可以設(shè)定Out0,即修正值
        TFTSHOW_STRING_HEADLINE(0,0,"  PID  Control  ");
        TFTSHOW_STRING(2,0,"SET PID Control:");
        TFTSHOW_STRING(4,0,"   OUT0 :      ");
        TFTSHOW_INT_NUMBER(4,10,pid.set_Out0);
        break;
    }
  }
}


int main()           //主函數(shù)
{
  InitSystem();      //系統(tǒng)初始化
  while(1)
  {
    PID_Calc();      //PID運算
    Interface();     //人機(jī)交互界面
    Keys_Function(); //按鍵控制    
  }
}


pwm.c:


#include "pwm.h"


void PWM_Init(void)
{
  RCC_APBPeriphClk_Enable1(RCC_APB1_PERIPH_GTIM2,ENABLE); //使能GTIM2時鐘


  __RCC_GPIOA_CLK_ENABLE();   //使能GPIOA時鐘


  PA01_AFx_GTIM2CH2();        //打開PWM輸出通道
  PA02_AFx_GTIM2CH3();


  GPIO_InitTypeDef GPIO_InitStruct;


  GPIO_InitStruct.IT = GPIO_IT_NONE; 
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  //推挽輸出模式
  GPIO_InitStruct.Pins = GPIO_PIN_1|GPIO_PIN_2;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  GPIO_Init(CW_GPIOA, &GPIO_InitStruct);


  GTIM_InitTypeDef GTIM_Initstructure;     //通用定時器
  GTIM_Initstructure.Mode=GTIM_MODE_TIME;  //計數(shù)模式
  GTIM_Initstructure.OneShotMode=GTIM_COUNT_CONTINUE; //連續(xù)計數(shù)
  GTIM_Initstructure.Prescaler=GTIM_PRESCALER_DIV64; //預(yù)分頻
  GTIM_Initstructure.ReloadValue=2000-1; //ARR,計數(shù)重載周期2000
  GTIM_Initstructure.ToggleOutState=DISABLE;
  GTIM_TimeBaseInit(CW_GTIM2,>IM_Initstructure);


  GTIM_OCInit(CW_GTIM2,GTIM_CHANNEL3,GTIM_OC_OUTPUT_PWM_LOW); //GTIM2輸出比較,CH3、CH2
  GTIM_OCInit(CW_GTIM2,GTIM_CHANNEL2,GTIM_OC_OUTPUT_PWM_LOW); //有效占空比為低電平
  GTIM_Cmd(CW_GTIM2,ENABLE); //使能GTIM2
}


void PWM1_Output(uint32_t value)
{
  GTIM_SetCompare3(CW_GTIM2,value);  //設(shè)置GTIM2通道3的CCR
}


void PWM2_Output(uint32_t value)
{
  GTIM_SetCompare2(CW_GTIM2,value);  //設(shè)置GTIM2通道2的CCR
}


void PWM_ALL_Output(uint32_t value)  //PWM1、2同步輸出
{
  PWM1_Output(value);
  PWM2_Output(value);
}


pid.c:


#include "pid.h"


PID pid;    //定義PID結(jié)構(gòu)體變量pid


void PID_Configuration(void)   //PID參數(shù)初始化配置 
{
  pid.Sv     = 55;


  pid.Kp     = 350;  //比例系數(shù)
  pid.Ki     = 10;   //積分系數(shù)
  pid.Kd     = 38;   //微分系數(shù)


  pid.Ek_1   = 0;    //上一次偏差
  pid.T      = 400;  //PID計算周期


  pid.cnt    = 0;    
  pid.cycle  = 2000; //PWM周期
  pid.Out0   = 500;  //PID修正值


  pid.set_Sv = pid.Sv;
  pid.set_Kp = pid.Kp;
  pid.set_Ki = pid.Ki;
  pid.set_Kd = pid.Kd;
  pid.set_Out0 = pid.Out0;
}


float Get_Pv(void)  //Pv意為當(dāng)前測量值,即當(dāng)前溫度
{
  return Get_Temperture();
}


void PID_Calc(void)    //PID算法
{
  float Pout,Iout,Dout;
  float out;


  if ( pid.cnt > pid.T )   //控制計算周期
  {
    pid.cnt = 0;


    pid.Pv = Get_Pv();       
    pid.Ek = pid.Sv - pid.Pv; //計算偏差
    pid.SumEk += pid.Ek;  //偏差累積




    Pout = pid.Kp * pid.Ek;  //比例控制


    Dout = pid.Kd * (pid.Ek - pid.Ek_1);  //微分控制


    if(pid.Pv>(pid.Sv-1))   //當(dāng)測量值非常接近目標(biāo)值的時候加入積分控制
    {
      Iout = pid.Ki * pid.SumEk;           //積分控制
      out = Pout + Iout + Dout + pid.Out0; 
    }
    else   out  = Pout + Dout + pid.Out0;  //測量值距離目標(biāo)值較遠(yuǎn)時只使用PD控制


    if ( out > pid.cycle ) pid.Out = pid.cycle; //限幅
    else if ( out < 0 )    pid.Out = 0;
    else                   pid.Out = out;
    PWM_ALL_Output(pid.Out);  //控制PWM輸出
    pid.Ek_1 = pid.Ek;  //進(jìn)行下一次PID運算之前,將本次偏差變?yōu)樯洗纹?  }
}





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19035

    瀏覽量

    228452
  • 熱敏電阻
    +關(guān)注

    關(guān)注

    14

    文章

    1117

    瀏覽量

    101370
  • 加熱器
    +關(guān)注

    關(guān)注

    3

    文章

    221

    瀏覽量

    21004
  • TFT屏
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    5723
  • PID溫度控制
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    931

原文標(biāo)題:【CW32】基于CW32的PID溫度控制

文章出處:【微信號:CW32生態(tài)社區(qū),微信公眾號:CW32生態(tài)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    基于CW32的門禁綜合系統(tǒng)

    基于CW32單片機(jī)的門禁綜合系統(tǒng)是一款功能強(qiáng)大的智能門禁解決方案,它提供了三種開鎖方式:密碼開鎖、指紋開鎖和刷卡開鎖,為用戶提供方便、安全的門禁控制。該系統(tǒng)的核心控制器采用了CW32
    的頭像 發(fā)表于 12-28 11:43 ?1604次閱讀
    基于<b class='flag-5'>CW32</b>的門禁綜合系統(tǒng)

    CW32移植Free-RTOS】CW32開發(fā)者扶持計劃

    CW32配置Free-RTOS全過程,CW32開發(fā)者扶持計劃
    的頭像 發(fā)表于 04-18 09:38 ?6016次閱讀
    【<b class='flag-5'>CW32</b>移植Free-RTOS】<b class='flag-5'>CW32</b>開發(fā)者扶持計劃

    CW32快速開發(fā)入門

    CW32快速開發(fā)入門
    的頭像 發(fā)表于 04-24 18:56 ?1790次閱讀
    <b class='flag-5'>CW32</b>快速開發(fā)入門

    CW32開發(fā)者扶持計劃#CW32 #芯片

    CW32
    CW32生態(tài)社區(qū)
    發(fā)布于 :2023年05月24日 16:56:14

    CW32系列微控制器選型表分享

    CW32系列微控制器選型表
    發(fā)表于 09-15 07:30

    cw32和stm32的區(qū)別

    cw32和stm32的區(qū)別 CW32和STM32是兩種常見的單片機(jī),被廣泛應(yīng)用于各種電子設(shè)備中。在本文中,我們將深入探討CW32和STM32之間的區(qū)別和優(yōu)劣勢。 1. 硬件性能 硬件性能是衡量單片機(jī)
    的頭像 發(fā)表于 08-16 11:15 ?3715次閱讀

    cw32和gd32的區(qū)別

    推出的一款32位微控制器,它是WCH唯一以ARM Cortex-M3內(nèi)核為基礎(chǔ)的產(chǎn)品系列,Cortex-M3內(nèi)核是ARM公司的經(jīng)典內(nèi)核之一,性能穩(wěn)定,功耗低。CW32系列的主頻高達(dá)72MHz,內(nèi)置了
    的頭像 發(fā)表于 08-16 11:15 ?1749次閱讀

    基于CW32的無刷水泵方案

    基于CW32的無刷水泵方案
    的頭像 發(fā)表于 11-03 17:28 ?767次閱讀
    基于<b class='flag-5'>CW32</b>的無刷水泵方案

    基于CW32熱敏電阻采集溫度應(yīng)用

    基于CW32熱敏電阻采集溫度應(yīng)用
    的頭像 發(fā)表于 10-25 16:45 ?472次閱讀
    基于<b class='flag-5'>CW32</b>熱敏電阻采集<b class='flag-5'>溫度</b>應(yīng)用

    CW32 PWM輸出功能介紹

    CW32 PWM輸出功能介紹
    的頭像 發(fā)表于 09-27 16:12 ?702次閱讀
    <b class='flag-5'>CW32</b> PWM輸出功能介紹

    CW32實時時鐘(RTC)介紹

    CW32實時時鐘(RTC)介紹
    的頭像 發(fā)表于 10-24 15:36 ?1017次閱讀
    <b class='flag-5'>CW32</b>實時時鐘(RTC)介紹

    應(yīng)用筆記-CW32 自舉程序中使用的 ISP 協(xié)議

    CW32自舉程序中使用的ISP協(xié)議CW32控制器片上FLASH存儲器有一部分區(qū)域用于存儲BootLoader啟動程序,在芯片出廠時已編程,用戶可利用BootLoader啟動程序提供的ISP模式
    發(fā)表于 06-06 13:37 ?7次下載

    基于CW32的RC522刷卡模塊的應(yīng)用

    基于CW32的RC522刷卡模塊的應(yīng)用
    的頭像 發(fā)表于 11-02 14:53 ?947次閱讀
    基于<b class='flag-5'>CW32</b>的RC522刷卡模塊的應(yīng)用

    基于CW32的物聯(lián)網(wǎng)應(yīng)用

    CW32】基于CW32的物聯(lián)網(wǎng)應(yīng)用
    的頭像 發(fā)表于 11-02 15:55 ?664次閱讀
    基于<b class='flag-5'>CW32</b>的物聯(lián)網(wǎng)應(yīng)用

    CW32單片機(jī)在智能馬桶的應(yīng)用介紹

    和調(diào)節(jié)。本文將介紹CW32單片機(jī)在智能馬桶的詳細(xì)應(yīng)用。圖:CW32的智能馬桶控制CW32單片機(jī)在智能馬桶的應(yīng)用介紹1.溫度感應(yīng)與
    的頭像 發(fā)表于 12-20 10:09 ?533次閱讀
    <b class='flag-5'>CW32</b>單片機(jī)在智能馬桶的應(yīng)用介紹