亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

上傳一個PID的算法(有注解)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:1104531 發表于 2025-8-13 15:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

// PID計算
unsigned int PID_Calculate(struct PID *pid, unsigned int feedback)
{
        // 偏差  設定值-ADC反饋值
    unsigned int Error = pid->SetPoint - feedback; // 偏差

    // 積分項更新(使用有符號數)
    pid->SumError += (int)Error;

    // 積分抗飽和
    if(pid->SumError > MAX_INTEGRAL) pid->SumError = MAX_INTEGRAL;
    else if(pid->SumError < -MAX_INTEGRAL) pid->SumError = -MAX_INTEGRAL;

    // 微分計算
    unsigned int dError = pid->LastError - pid->PrevError;
    pid->PrevError = pid->LastError;
    pid->LastError = Error;

    // 計算各項(使用長整型防溢出)
    unsigned long p_term = (unsigned long)pid->Proportion * Error;
    unsigned long i_term = (unsigned long)pid->Integral * (unsigned long)pid->SumError;
    unsigned long d_term = (unsigned long)pid->Derivative * dError;

    // 綜合輸出  SCALE_FACTOR這是放大倍數 運算之前進行放大,出去前回歸
    unsigned long output = (p_term + i_term + d_term) / SCALE_FACTOR;

    return (unsigned int)output;
}

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:30165 發表于 2025-8-14 17:35 | 只看該作者
沒有搞明白 PID算法主要是為了解決什么問題?比如溫度控制 。PID算法和傳統到設定控制優缺點是什么?
回復

使用道具 舉報

板凳
ID:1104531 發表于 2025-8-15 17:11 | 只看該作者
通過設定值與反饋值計算;再通過PWM進行控制
回復

使用道具 舉報

地板
ID:230500 發表于 2025-8-17 08:19 | 只看該作者
現在有了AI , 這些算法不用死記硬背了 稍微修改下 就可以用, 主要精力可以放在KP KI KD的整定上,
下面這部分是AI做的, 直接調用, 就行, 在結構體對PID初始化的時候填入整定好的參數即可運行; 但是AI也不是完全準確,他只對共用算法很準確,對STC的單片機就有點問題, PWM部分需要自己重寫,

/********************* PID計算函數 *********************/
float PID_Compute(PID_Controller *pid, float setpoint, float input) {
    float error = setpoint - input; //聲明誤差變量
    float Pout; //聲明比例變量
        float Iout; //聲明積分變量
        float Dout; //聲明微分變量

    // 死區處理(誤差小于0.3℃時不調節)
    if(fabs(error) < 0.3) {
        error = 0;
    }
   
    // 比例項
    Pout = pid->Kp * error;
   
    // 積分項(抗積分飽和)
    pid->integral += pid->Ki * error;
    if(pid->integral > pid->out_max) pid->integral = pid->out_max;
    else if(pid->integral < pid->out_min) pid->integral = pid->out_min;
    Iout = pid->integral;
       
    // 微分項
    Dout = pid->Kd * (error - pid->prev_error);
    pid->prev_error = error; // 保存誤差用于下次計算
   
    // 計算輸出PID
    pid->output = Pout + Iout + Dout;
   
    // 輸出限幅
    if(pid->output > pid->out_max) pid->output = pid->out_max;
    else if(pid->output < pid->out_min) pid->output = pid->out_min;
   
    return pid->output;
}
回復

使用道具 舉報

5#
ID:879809 發表于 2025-9-12 13:52 | 只看該作者
zhang32568 發表于 2025-8-14 17:35
沒有搞明白 PID算法主要是為了解決什么問題?比如溫度控制 。PID算法和傳統到設定控制優缺點是什么?

PID適合大慣性環節場合,比如你提到的溫控,加熱管從0瞬間火力全開,過了兩分鐘傳感器還沒有感覺到熱。這種有大慣性環節的場合,你用直接控制——溫度高了就調低加熱管功率,溫度低了就加大加熱管功率,結果必然是溫度震蕩起來,完全失控。
回復

使用道具 舉報

6#
ID:60178 發表于 2026-2-28 15:23 | 只看該作者
幾乎所有自動化控制,跟蹤穩定控制多要用到它。溫度,電流,轉速,力矩,電壓,速度,高度,導航多要用,其實一點不難。其實主要是對前幾次的誤差累加起來
回復

使用道具 舉報

7#
ID:496636 發表于 2026-3-1 11:31 | 只看該作者
發表于 2025-8-14 17:35
沒有搞明白 PID算法主要是為了解決什么問題?比如溫度控制 。PID算法和傳統到設定控制優缺點是什么?

PID就是比例、積分、微分、是用偏差進行的控制。如果沒有偏差了,那么輸出就不會有變化。
這個控制系統有模擬量輸出(或是PWM的開關量輸出)、模擬量輸入、控制器組成。
比如:用蒸汽調節閥給熱水加熱,熱水的溫度計就是模擬量輸入、蒸汽調節閥就是模擬量輸出,調節蒸汽調節閥就能控制熱水溫度,使它穩定在你需要的溫度上。
PLC系統上的PID算法大概是這樣的:
以下是位置式的PID算法
把輸入的設定值和輸入都規格化,如上面例子,這個溫度計是0-100度量程,現在溫度為50度,設定溫度為60度,那么規格化后,就是去單位后:設定溫度為0.6,現在溫度為0.5,而偏差就是0.6-0.5=0.1。
比例項輸出=偏差*比例系數,如果比例系數為2,那么比例項輸出就是20%(0.2)。
輸出=積分項+比例項+微分項。
積分項有什么作用?
接著上面的例子,純采用比例項的話,如果溫度達到58度是,偏差為0.02,乘以2,就是0.04,那調節閥輸出開度為4%,你可以看出比例的特點:偏差越大輸出越大,偏差越小,輸出越小。等接近設定值時,散熱和加熱功率相等,然后溫度就升不上去了。怎么辦,那加積分項。
積分項中的參數:積分時間的意義?如果我設了積分時間為1分鐘,采樣時間為1秒,這個時候偏差為0.02,比例輸出為4%,那一分鐘要采樣60次,每次就加4%的60分之一。同樣的意思即:如果偏差一直維持在0.02 一分鐘的話,積分項就加4%。
這樣有了個積分項,輸出就會慢慢變大了,從而微調增加輸出,使加熱的功率大于散發的功率,使溫度緩慢上升,從而達到設定溫度。
注意:積分項是有正負值的,上例中如果即時溫度大于設定溫度時,項分項會變小。
微分項有什么作用?如果一個反應釜在60度情況下準備反應,我向它滴加了物料,開始反應了,反應上升速度很快,放出的熱量很大,如果純手工操作,我根據升溫的速率(可以看上升0.1度需要多少秒)調節閥門的大小。現在的偏差很小,算出來的比例項很小,所以你得根據偏差變化的速度來增加輸出。
微分項就是根據偏差變化的速度(那是溫度變化的速度)來控制。
那么微分項中的微分時間的意思是什么?
假設微分時間設為5分鐘,意思是依這樣的溫度變化速度,5分鐘后偏差能達到多少,然后根據比例項那么算出來的值作為微分項的輸出。
如反應釜60度,滴加反應液后,每五秒上升0.1度,那么依這樣的速度溫度就會上升6度,溫度計量程為0-100,比例系數為2,那么積分項輸出就是10%,這樣溫度從60度變成60.1度時,微分項就輸出了12%的開度,這里是冷卻水的調節閥。
如果按照比例輸出的話,在60.1度時,偏差是0.001,比例項輸出為0.2%,這么猛的放熱,根本沒法控制好溫度,等你上升到66度時,比例項輸出才達到12%,你這批反應物料要報廢了。
微分項也是有正負的,如果上升到61度時,溫度變化率為0了,那么微分項就是0,如果溫度在下跌,微分項就是負值。
那有人會問,達到61度時,輸出減了12%,那怎么平衡放熱和冷卻功率,從而穩定溫度,積分項在增加呀 。
回復

使用道具 舉報

8#
ID:496636 發表于 2026-3-1 12:06 | 只看該作者
輸出=比例項+積分項+微分項
當三項加起來大于1時,輸出等于1,積分項=1-比例項-微分項(超幅,積分項也會跟著調整)
當三項加起來小于0時,輸出等于0,積分項=0-微分項-比例項
單片機中,輸出是整數,調整一下算法即可
回復

使用道具 舉報

9#
ID:4913 發表于 2026-5-21 20:24 | 只看該作者
// PID計算 unsigned int PID_Calculate(struct PID *pid, unsigned int feedback) {         // 偏差  設定值-ADC反饋值     unsigned int Error = pid->SetPoint - feedback; // 偏差      // 積分項更新(使用有符號數)     pid->SumError += (int)Error;      // 積分抗飽和     if(pid->SumError > MAX_INTEGRAL) pid->SumError = MAX_INTEGRAL;     else if(pid->SumError < -MAX_INTEGRAL) pid->SumError = -MAX_INTEGRAL;      // 微分計算     unsigned int dError = pid->LastError - pid->PrevError;     pid->PrevError = pid->LastError;     pid->LastError = Error;      // 計算各項(使用長整型防溢出)     unsigned long p_term = (unsigned long)pid->Proportion * Error;     unsigned long i_term = (unsigned long)pid->Integral * (unsigned long)pid->SumError;     unsigned long d_term = (unsigned long)pid->Derivative * dError;      // 綜合輸出  SCALE_FACTOR這是放大倍數 運算之前進行放大,出去前回歸     unsigned long output = (p_term + i_term + d_term) / SCALE_FACTOR;      return (unsigned int)output; }
回復

使用道具 舉報

10#
ID:4913 發表于 2026-5-21 20:51 | 只看該作者
// PID計算 unsigned int PID_Calculate(struct PID *pid, unsigned int feedback) {         // 偏差  設定值-ADC反饋值     unsigned int Error = pid->SetPoint - feedback; // 偏差      // 積分項更新(使用有符號數)     pid->SumError += (int)Error;      // 積分抗飽和     if(pid->SumError > MAX_INTEGRAL) pid->SumError = MAX_INTEGRAL;     else if(pid->SumError < -MAX_INTEGRAL) pid->SumError = -MAX_INTEGRAL;      // 微分計算     unsigned int dError = pid->LastError - pid->PrevError;     pid->PrevError = pid->LastError;     pid->LastError = Error;      // 計算各項(使用長整型防溢出)     unsigned long p_term = (unsigned long)pid->Proportion * Error;     unsigned long i_term = (unsigned long)pid->Integral * (unsigned long)pid->SumError;     unsigned long d_term = (unsigned long)pid->Derivative * dError;      // 綜合輸出  SCALE_FACTOR這是放大倍數 運算之前進行放大,出去前回歸     unsigned long output = (p_term + i_term + d_term) / SCALE_FACTOR;      return (unsigned int)output; }
回復

使用道具 舉報

11#
ID:60178 發表于 2026-5-23 18:55 | 只看該作者
如果不用PID控制,當加熱時全速加熱,就是到設定點附近也是,導致溫度一下超過設定溫度,溫度波動很大,你的面包可能烤焦,空調溫度時冷時熱,人不舒服。
PID開始全速加熱,在溫度逼近設定時,采用的是設定和當下溫度的差值控制,誤差大加熱大,誤差少加熱少,但有個問題,當加熱和散熱平衡時,長時間達不到設定值,比方5分鐘,這時為消除這個誤差,加入累積時間產生的誤差控制加大加熱使達到
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表