幾年前,我設計了一款帶有LCD顯示屏的產品。
通常LCD 液晶屏的工作溫度,常溫型的為0-50 °C,寬溫型的為-20-70 °C,超寬溫型的為-30-80 °C。
大家知道,俄羅斯和北歐國家一到冬天就被冰雪覆蓋,地凍天寒,即使在白天氣溫也可能低至-50°C。
因此,該款產品的工作溫度要求為-40°C-70°C,即要求液晶屏在-40°C仍然能正常工作。
我們的解決方案是通過NTC檢測溫度,採用PWM驅動功率電阻產生熱量加熱。
所幸產品體積比較小,而且電路板以及液晶屏被密閉在外殼內,所以只需消耗很小的功率就能實現較好加熱效果。
其實在這款產品之前,公司也有類似的由他人設計的產品,當初的方案是根據閾值控制功率電阻的導通或斷開,即:
檢測到溫度低於-15°C時,MCU的IO口輸出高電平讓NMOS導通給功率電阻供電使其發出熱量;
當檢測到溫度高於-5°C時,則輸出低電平讓NMOS斷開使功率電阻停止加熱。
這一簡陋的模糊控制的方法,不但浪費電,而且不能在低溫情況下給電子元器件和液晶屏提供-10°C的恆溫工作環境。
工作環境不好,影響了這些器器件的心情。搞不好它們就要罷工或者提前退休。
作為有幾十年工作經驗的工程師,我深知“細節決定成敗”的真諦,所以對這個加熱的方案做了一些創新:
- 電路還是那個電路,器件還是那個器件;
溫度檢測比較簡單,+3.3V的基準電壓經過NTC以及R2分壓之後送入單片機的ADC口。
MCU的PWM口通過R4限流,R5的洩流控制NMOS Q1驅動功率電阻10ohm的R3發熱。
- 控制NMOS的端口由普通的IO口改到PWM
採用頻率為1KHz,佔空比0%-100%可調的PWM信號驅動NMOS使功率電阻R3產生可調的熱量;
- 編寫MCU程序實現增量式PID控制,並根據PID算法計算的數值設定PWM的佔空比
將設定溫度固定為-10°C
從ADC口讀取出當前溫度對應的ADC值
計算設定溫度與當前溫度的差值
從其內部存儲器讀出事先整定好的比例,積分系數,算出控制量。
- 對比例係數、積分系數進行整定
PID參數的整定非常考慮能力和經驗,我的經驗是,先整定比例係數,先把控制閉環斷開,測試整個系統中輸入為1個單位時,所控制的輸出能產生多少個單位的變化。選定比例係數,使得1個單個的輸入能使輸出產生0.1左右的單位的變化。
接下選定積分系數,積分系數大概為比例係數的1/20,可採用二分法,根據測試的結果不斷調整。使得控制效果最佳,既不產生振盪,又不致使系統的反應太慢。
增量式PID控制算法如下:
<code>void
pid_init(void)
{
INT32
m_lCF, m_lCI, m_lCurU;
=(INT16)pidcon.m_uiSetAD - (INT16)pidcon.m_uiCurAD;
m_lCF
=(INT32)pidcon.m_uiKP * pidcon.m_iDU;
m_lCI
=(INT32)pidcon.m_uiKI * pidcon.m_iDU;
m_lCurU
=m_lCF + m_lCI;
=m_lCurU;
}
void
pid_cal(void)
{
INT16
m_iDU, m_iDDU;
INT32
m_lCF, m_lCI, m_lCurU;
m_iDU
=(INT16)pidcon.m_uiSetAD - (INT16)pidcon.m_uiCurAD;
m_iDDU
=m_iDU - pidcon.m_iDU;
=m_iDU;
m_lCF
=(INT32)pidcon.m_uiKP * m_iDDU;
m_lCI
=(INT32)pidcon.m_uiKI * m_iDU;
m_lCurU
=m_lCF + m_lCI;
+= m_lCurU;
< HT_AD_CURU_MIN)
{
=HT_AD_CURU_MIN;
}
> HT_AD_CURU_MAX)
{
=HT_AD_CURU_MAX;
}
}
void
pid_conduty(void)
{
U32
lduty;
lduty
=0;
=0;
> 0)
{
lduty
=(U32)pidcon.m_ulCurU / 512;
}
>= HT_PWM_PERIOD)
{
=HT_PWM_PERIOD;
}
else
{
=(U16)lduty;
}
updateduty(pidcon.m_uiDuty);
}
/<code>
最終效果非常完美
把產品放置到高低溫試驗箱,把溫度設置為-30°C,測得產品外殼內部的溫度曲線如下: