娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月31日(星期六)

2021年05月31日 | 也談C51實現PID算法

發布者:快樂的旅程 來源: eefocus關鍵字:C51  PID算法  整型數 手機看文章 掃描二維碼
隨時隨地手機看文章

關于PID的算法實現,很多書上都講了。


但是,最近真正要用PID算法的時候,發現書上的代碼在我們51上來實現還不是那么容易的事情。簡單的說來,就是不能直接調用。仔細分析你可以發現,教材上的、網上現行的PID實現的C語言代碼幾乎都是用浮點型的數據來做的,可以想象,如果我們的計算使用浮點數據,那我們的51單片機來運行的話會有多痛苦。


所以,本人自己琢磨著弄了一個整型變量來實現了PID算法,由于是用整型數來做的,所以也不是很精確,但是對于很多的使用場合,這個精度也夠了。關于系數和采樣電壓全部是放大10倍處理的。所以精度不是很高,但是也不是那么低,大部分的場合都夠用了。實在覺得精度不夠,可以再放大10倍或者100倍處理,但是要注意不超出整個數據類型的范圍就可以了。


本人做的是帶死區控制的PID算法。


具體的參考代碼參見下面:


typedef struct PIDValue


{


uint32 Ek_Uint32[3]; //差值保存,給定和反饋的差值

uint8 EkFlag_Uint8[3]; //符號,1則對應的Ek為負數,0為對應的Ek為正數



uint8 KP_Uint8;


uint8 KI_Uint8;

uint8 KD_Uint8;

uint8 B_Uint8; //死區電壓





uint8 KP; //顯示修改的時候用


uint8 KI; //

uint8 KD; //

uint8 B; //



uint16 Uk_Uint16; //上一時刻的控制電壓


}PIDValueStr;





PIDValueStr xdata PID;



/*******************************



**PID = Uk + (KP*E(k) - KI*E(k-1) + KD*E(k-2));


********************************/

void PIDProcess(void)

{

uint32 idata Temp[3]; //

uint32 idata PostSum; //正數和

uint32 idata NegSum; //負數和



Temp[0] = 0;


Temp[1] = 0;

Temp[2] = 0;

PostSum = 0;

NegSum = 0;



if( ADPool.Value_Uint16[UINADCH] > ADPool.Value_Uint16[UFADCH] ) //給定大于反饋,則EK為正數


{

Temp[0] = ADPool.Value_Uint16[UINADCH] - ADPool.Value_Uint16[UFADCH]; //計算Ek[0]

if( Temp[0] > PID.B_Uint8 )

{

//數值移位

PID.Ek_Uint32[2] = PID.Ek_Uint32[1];

PID.Ek_Uint32[1] = PID.Ek_Uint32[0];

PID.Ek_Uint32[0] = Temp[0];

//符號移位

PID.EkFlag_Uint8[2] = PID.EkFlag_Uint8[1];

PID.EkFlag_Uint8[1] = PID.EkFlag_Uint8[0];

PID.EkFlag_Uint8[0] = 0; //當前EK為正數



Temp[0] = (uint32)PID.KP_Uint8 * PID.Ek_Uint32[0]; // KP*EK0


Temp[1] = (uint32)PID.KI_Uint8 * PID.Ek_Uint32[1]; // KI*EK1

Temp[2] = (uint32)PID.KD_Uint8 * PID.Ek_Uint32[2]; // KD*EK2

}

}

else //反饋大于給定

{

Temp[0] = ADPool.Value_Uint16[UFADCH] - ADPool.Value_Uint16[UINADCH]; //計算Ek[0]

if( Temp[0] > PID.B_Uint8 )

{

//數值移位

PID.Ek_Uint32[2] = PID.Ek_Uint32[1];

PID.Ek_Uint32[1] = PID.Ek_Uint32[0];

PID.Ek_Uint32[0] = Temp[0];

//符號移位

PID.EkFlag_Uint8[2] = PID.EkFlag_Uint8[1];

PID.EkFlag_Uint8[1] = PID.EkFlag_Uint8[0];

PID.EkFlag_Uint8[0] = 1; //當前EK為負數



Temp[0] = (uint32)PID.KP_Uint8 * PID.Ek_Uint32[0]; // KP*EK0


Temp[1] = (uint32)PID.KI_Uint8 * PID.Ek_Uint32[1]; // KI*EK1

Temp[2] = (uint32)PID.KD_Uint8 * PID.Ek_Uint32[2]; // KD*EK2

}

}





/*以下部分代碼是講所有的正數項疊加,負數項疊加*/



if(PID.EkFlag_Uint8[0]==0)


{

PostSum += Temp[0]; //正數和

}

else

{

NegSum += Temp[0]; //負數和

} // KP*EK0



if(PID.EkFlag_Uint8[1]!=0)


{

PostSum += Temp[1]; //正數和

}

else

{

NegSum += Temp[1]; //負數和

} // - kI * EK1



if(PID.EkFlag_Uint8[2]==0)


{

PostSum += Temp[2]; //正數和

}

else

{

NegSum += Temp[2]; //負數和

} // KD * EK2



PostSum += (uint32)PID.Uk_Uint16; //



if( PostSum > NegSum ) // 是否控制量為正數


{

Temp[0] = PostSum - NegSum;

if( Temp[0] < (uint32)ADPool.Value_Uint16[UMAXADCH] ) //小于限幅值則為計算值輸出

{

PID.Uk_Uint16 = (uint16)Temp[0];

}

else

{

PID.Uk_Uint16 = ADPool.Value_Uint16[UMAXADCH]; //否則為限幅值輸出

}

}

else //控制量輸出為負數,則輸出0

{

PID.Uk_Uint16 = 0;

}

}


關鍵字:C51  PID算法  整型數 引用地址:也談C51實現PID算法

上一篇:6位數顯頻率計數器設計
下一篇:最后一頁

推薦閱讀

網上關于stm8s1003 驅動si4432的 驅動不是很多 ,我也是弄了大半天才可以和si4432 spi驅動成功。 接下來要做無線收發和組網。暫時先貼 spi驅動的spi模擬方式:main.c#include "stm8s.h" #include "mytype.h" #include"delay.h" #include "USART.h" //定義CPU內部時鐘 #define SYS_CLOCK 16 #define SPIPort GPIOC #...
Imec和Bloomlife公布了第一款可穿戴式5通道心電圖(ECG)芯片的原型,可連續準確地監測胎兒心率和移動性。利用imec的集成電路IP,Bloomlife專門制造的BeatleIC芯片,其效率足以實現長期和連續使用,紐扣電池的電池壽命約為一周。該裝置可以在非常低的振幅水平(3到15μV峰 - 峰值之間)下進行胎兒ECG數據采集。合作伙伴計劃推出消費產品,包括集成在可穿...
在科幻電影中,機器人幫助太空人工作將變成現實。日本機器人新創公司Gitai正研發一項新技術,未來可將遠程臨場(lepresence)仿真機器人送至太空,代替太空人處理艱難任務,先前該公司與日本宇宙航空研究開發機構(JAXA)合作,對機器人的實用性進行研究。 據報導,送太空人執行任務既危險又昂貴,若能遙控半自動機器人代替這項工作,宇宙航空機構預估將節...
安森美半導體的RSL10智能拍攝相機平臺實現超低功耗事件觸發成像物聯網正結合人工智能(AI),向超自動化進化發展。安森美半導體的RSL10智能拍攝相機平臺體現了這概念,為邊緣提供基于視覺的AI以實現物體自動識別和場景變化等功能。RSL10智能拍攝相機平臺設計用于支持電池供電的智能成像應用,可便攜,超低功耗,能在相關事件觸發時捕獲圖像,并為智能圖像監...

史海拾趣

小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 巴中市| 报价| 军事| 五河县| 通化市| 蕉岭县| 会理县| 那坡县| 周宁县| 南丰县| 伊川县| 佳木斯市| 宝鸡市| 莒南县| 文成县| 山西省| 泾源县| 封开县| 富民县| 光山县| 元朗区| 舟山市| 巴林右旗| 延川县| 黎城县| 延津县| 宜兴市| 张家界市| 霍邱县| 荆门市| 简阳市| 砚山县| 抚州市| 绍兴县| 云霄县| 咸阳市| 万荣县| 东台市| 彩票| 和硕县| 台江县|