溫度PID控制時, 有多個溫度測量點, 但最終只有一個溫度作為反饋值參與PID控制, 我們有時會採用平均值法, 計算所有溫度的平均值來作為PID的反饋值. 但在某一路溫度探頭斷線的情況下, 溫度值為零, 這時平均值就會小很多.像這種情況下中值法比較有效. 原理如下: 對於一組溫度, 模擬量轉換為數字... ...
溫度PID控制時, 有多個溫度測量點, 但最終只有一個溫度作為反饋值參與PID控制, 我們有時會採用平均值法, 計算所有溫度的平均值來作為PID的反饋值. 但在某一路溫度探頭斷線的情況下, 溫度值為零, 這時平均值就會小很多.
像這種情況下中值法比較有效. 原理如下: 對於一組溫度, 模擬量轉換為數字量後, 對溫度值進行排序, 取中間的那個值作為PID反饋值. 如果是偶數, 取中間兩個值除以2後作為反饋值.
排序採用西門子LGF的庫中的希爾排序, 但它是FB的, 使用上還的帶個DB塊, 現修改為FC, 功能上做了簡化. 程式如下:
“LGF_ShellSortReal”函數是個排序函數, 對採集的溫度”data”.sourceArray 數組進行排序, 排序後的輸出為 “data”.destArray. 然後對”data”.destArray 採集最中間的一個值, 這樣可以刪除調最小和最大的值, 最後的結果輸出到value_1 中.
排序的數組長度最大不能操作1000, 如果有其它需求, 可以修改temp變數MAX_ARRAY_ELEMENTS.
這個函數就是取中值函數.
sourceArray 是亂序的溫度, 排序後的溫度間 destArray.
其實在現實中, 大範圍的加熱必然導致溫度不均勻, 可以採用分段加熱. 這時中值法就不是很有效了. 因為採用分段加熱後, 每段就1-2組溫度採集點, 像這種情況, 需要判斷探頭是否斷線, 如果斷線就切換另外一組, 可以中上篇博客中的error信號來判斷.