標(biāo)題: 單片機怎么判斷某個數(shù)據(jù)范圍?才不會在臨界值不穩(wěn)定,大佬請指教 [打印本頁]

作者: guoqiang881245    時間: 2022-7-20 15:00
標(biāo)題: 單片機怎么判斷某個數(shù)據(jù)范圍?才不會在臨界值不穩(wěn)定,大佬請指教
如何判斷某個數(shù)據(jù)范圍,且不會被在臨界值跳動,造成判斷不穩(wěn)定。比如判斷一個溫度36.3-36.9,亮起第一個燈,36.9-37.3亮起第二個燈。如果在36.9中間跳動一會,就會出現(xiàn)一下兩個燈亮,一下一個燈亮,如何解決這個問題,大佬們幫幫忙提個方案,有示例代碼更好。萬分感謝!
作者: Hephaestus    時間: 2022-7-20 18:10
加一段滯回hysteresis唄。超過36.95才亮起第二個燈,低于36.85才亮起第一個燈,并熄滅第二個燈。
作者: lkc8210    時間: 2022-7-20 21:42
1. 輸入數(shù)值濾波后才比較
2. 比較范圍加死區(qū)。如判斷一個溫度36.3-36.9,亮起第一個燈,36.9-37.3亮起第二個燈

代碼就寫為
  1. if(ADC>= 36.4 && ADC <= 36.8)
  2. {
  3.         led1 = On;
  4. }
  5. else
  6. {
  7.         led1 = Off;
  8. }
  9. if(ADC>= 37。0 && ADC <= 37.2)
  10. {
  11.         led2 = On;
  12. }
  13. else
  14. {
  15.         led2 = Off;
  16. }
復(fù)制代碼





作者: Y_G_G    時間: 2022-7-20 22:53
如果單片機有足夠的空間,你又不在乎效率的話,可以參考一下這個,這個是我一個鋰電池電量指示函數(shù)
你參考一下,大概原理就是電壓變化量超過0.05V時才進行比較,不會在臨界點來回跳的
//────────────────────────────────────────────
void Battry_Voltage_Disp(float Bat_Voltage)                                                //電池電壓處理,用于顯示指示燈和自動關(guān)機
{                                                                                                                                //Bat_Voltage為當(dāng)前電池電壓
        float a;                                                                                                        //Last_Voltage為全局變量
        a=Bat_Voltage-Last_Voltage;                                                                         //本次電壓值和上次電壓進行比較
        a=fabs(a);                                                                                                         //絕對值
if(a>0.05)                                                                                         
                        {                               
                                 Last_Voltage=Bat_Voltage;                                                //電池電壓變化超過0.05V,保存為上次電壓
                                a=Bat_Voltage;
                                if(a<2.9)ON=0;                                                                        //關(guān)機電壓:2.9V               
                                else if(a<3.35)Flash_light();                                        //指示燈:閃燈                               
                                else if((a>3.35)&&(a<3.55))Red_light();                        //指示燈:紅燈                                               
                                else if((a>3.55)&&(a<3.65))Orange_light();                //指示燈:橙燈
                                else         Green_light();                                                        //指示燈:綠燈
                        }
                       
}
//─────────────────────────────────────────────────


作者: guoqiang881245    時間: 2022-7-21 20:29
Y_G_G 發(fā)表于 2022-7-20 22:53
如果單片機有足夠的空間,你又不在乎效率的話,可以參考一下這個,這個是我一個鋰電池電量指示函數(shù)
你參考一 ...

你好,感謝你江湖救急,謝謝!想問下 Last_Voltage全局變量數(shù)據(jù)類型和初始值是多少?另外fabs絕對值是多少?
作者: Y_G_G    時間: 2022-7-22 07:10
guoqiang881245 發(fā)表于 2022-7-21 20:29
你好,感謝你江湖救急,謝謝!想問下 Last_Voltage全局變量數(shù)據(jù)類型和初始值是多少?另外fabs絕對值是 ...

Last_Voltage為浮點型呀,初始值為0.00
Bat_Voltage為電池電壓,是ADC計算好了的浮點型數(shù)據(jù)
a=Bat_Voltage-Last_Voltage;         //本次電壓值和上次電壓進行比較
a的值就是本次電壓和上次電壓的相差值,有正值也有負(fù)值,所以進行絕對值運算
變化超過0.05V就進行處理,不然的話,還是上次比較的結(jié)果
這個0.05V是可以改的,你調(diào)試的時候自己改一下,感覺良好就行
作者: slf252    時間: 2022-7-22 08:10
設(shè)置上下閾值,軟件模擬一個施密特觸發(fā)器
作者: guoqiang881245    時間: 2022-7-22 18:38
Y_G_G 發(fā)表于 2022-7-22 07:10
Last_Voltage為浮點型呀,初始值為0.00
Bat_Voltage為電池電壓,是ADC計算好了的浮點型數(shù)據(jù)
a=Bat_Voltag ...

好的  明白了,很感謝你的講解




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1