欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1867|回復: 8
收起左側

上傳一個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 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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;
}
回復

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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%,那怎么平衡放熱和冷卻功率,從而穩定溫度,積分項在增加呀 。
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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