《仿人機器人原理與實戰》一3.4 熱平衡實驗進階
本節書摘來異步社區《仿人機器人原理與實戰》一書中的第3章 ,第3.1節,作者布萊恩·伯傑倫(Bryan Bergeron) 托馬斯B. 塔爾博特(Thomas B. Talbot) 王偉 魏洪興 劉斐 譯, 更多章節內容可以訪問雲棲社區“異步社區”公眾號查看。
3.4 熱平衡實驗進階
3.4.1 泵速分段控製
你應該能夠依據真實溫度和目標溫度差值的函數來改變泵速,以避免setPoint的值明顯超調。
1. 編程
如清單3-2所示,係統的Arduino代碼使用標準map()變換函數給變量pumpSpeed賦值。需要修改map函數中的變量值,以便符合你的係統。例如,在我們的實驗係統中,從熱水管中得到的熱水溫度變量hotTemp對應的熱電偶讀數值為760。你選定的值取決於熱水加熱設定值和熱電偶傳感器的響應。類似地,注意變量pumpSpeedMax,即最大泵速。如果你對管路連接有些不確定,那麼剛開始請使用較小值。
清單3-2 利用分段響應的熱平衡控製
注意,分段響應的變化性受限於熱電偶的水溫響應變量T1Temp高於變量setPoint的次數,否則泵速設定為0。
2. 操作
係統組建和操作與開關控製實驗相同。要麼往儲槽中加入確定量的熱水,要麼使用浸入式電加熱器將儲槽內的水溫升高到超過setPoint值。理想情況下,泵速分段控製的超調量小於開關控製。
3.4.2 PID控製
你應該能否發現分段速度控製的結果優於開關控製。問題在於,它是否足夠優秀?如果不是,我們能改進嗎?對這個簡單的應用來說,簡單的分段控製可能是足夠的,但當我們麵對更加複雜的係統和與PID控製相關的資源需求時,這種想法就很有價值。
假設我們沒有使用Arduino監視多個傳感器,那麼RAM(Random Access Memory,隨機存取存儲器)和處理器資源就可以節省下來,但是通常情況下並不總是這樣的。現在,我們假定簡單的分段控製不夠好,而且有足夠的計算資源。
1. 編程
如清單3-3所示,PID係統的Arduino代碼比清單3-2中的代碼要稍微複雜一下,這還多虧我們使用了Arduino Playground中的PID庫。這個庫中包含了許多我們之前討論的具體實施細節,可著重關注修正量PC、積分常數IC和微分常數DC等參數的最優值,並可關注整個係統的操作。
清單3-3 基於PID控製器的熱平衡
這段代碼的關鍵在於myPID()函數,它可在已知輸入Input(熱電偶讀數)的情況下確定輸出變量Output(馬達轉速)。調節PID算法必須要給PC、IC和DC三個常數賦新的值。清單中這些常數值是我們開始調試的最佳位置。
2. 操作
係統操作與之前的兩個例子相同,但是在確定初始條件時我們要做得更明確一些。不再是簡單地加入熱水或者插上電加熱器直到溫度超過setPoint值,而是或者向儲槽中加入定量且定溫的熱水,或者接通電加熱器並維持確定的時間。攪拌儲槽中的水,跟蹤熱電偶讀數變量Input和水泵的輸出電平變量Output。為了達到調試目的,我們暫時在主回路中增加一個延時聲明,以便實時讀取變量Input和變量Output的值,這個延時會改變PID控製器的響應。
如果實驗結果不如簡單控製好,即快速達到設定溫度而幾乎沒有超調,那麼可能需要調節PID。Arduino中自帶PID調節資源,而且本係統足夠簡單,多次嚐試和錯誤是可以接受的。Arduino中常用的PID調節資源命名為PID autotune library,在Arduino Playground中可以獲得。
另一種可能性是你的係統對於PID控製器來說很不穩定。在多次重複實驗中,可能的情況有:水溫和容積不同,儲槽絕熱性能不好,外界溫度變化,熱輻射器的轉換效率低或者管路泄露。不管何種原因,如果基本係統不支持可重複的實驗結果,那你永遠都不能確定常數的值。
另外,回顧我們討論PID微分分量的內容,係統整個微分項是常數DC的函數。在清單3-3中將DC設為0,便得到PI控製器。即使你擁有完整的PID控製器,但是調試一下PI控製器也是很不錯的,以便感受隻有PC和IC常數的係統。
3.4.3 四肢溫度響應
通過使核心體溫setPoint響應四肢溫度,我們給係統增加一些生物學模擬。對於這次改進,我們增加第二個熱電偶探頭,並利用它的讀數來修改變量setPoint。
1. 器材清單
除了基本的PID係統外,我們還需要以下器材:
- 10kΩ熱電偶
- 10kΩ、1/4W電阻
- 台燈、電吹風或其他熱源
- 壓縮空氣罐或者散熱器
3. 構造
將雙絞線與第二個熱電偶連接,並將熱電偶纏繞或固定在人體模特的脖子或其他部位。在恰當的位置安裝熱電偶,以便其能夠很容易地感受冷熱變化。
4. 編程
適用於兩個熱電偶電路的Arduino代碼如清單3-4所示。再次重申,因為我們使用了Arduino的PID庫,所以編程的工作量不大。如果熱電偶T2的讀數增加,變量setPoint的值就減小,這意味著泵馬上就要開始工作,提前啟動了冷卻過程。相反,如果向熱電偶T2噴射壓縮空氣,降低T2的溫度,那麼變量setPoint將會增大,水泵直到熱電偶T1給出一個相對更高的讀數時才會啟動。
清單3-4 適用於兩個熱電偶熱平衡係統的Arduino代碼
上述代碼與之前單熱電偶探頭代碼的最大區別在於,係統組成和評估兩個熱電偶返回值的方法不同。注意,在這段代碼中變量SetPointHigh、SetPointMid和SetPointLow的間距是不對稱的。你可以也應該嚐試一下等間距、增大或者減小賦給這些變量的值的間距。
5. 操作
到現在為止,你應該知道操作規範了。仔細加入熱水或者將電加熱器按特定方式加熱,以便在多次實驗中能夠重複這些初始條件。然後運行實驗並跟蹤輸出數據。在模擬人的生理反應時,使用動態setPoint值會幹擾PID控製器。如果過度修改變量setPoint的值,你可能需要立即利用PID庫中的SetTunings()函數來為PID算法設定新的常數。
最後更新:2017-06-21 11:01:58