
DS18B20溫度傳感器閃爍中斷問題測驗
- 0.0測驗背景
- 0.1測驗環境
- 0.2觀察方法
- 實驗1、不關閉中斷
- 實驗1.1溫度讀取函式放在死回圈中輪詢執行
- 實驗1.2控制溫度讀取函式執行頻率400ms
- 實驗2、關閉中斷
- 實驗2.1溫度讀取函式放在死回圈中輪詢執行
- 實驗2.2控制溫度讀取函式執行頻率400ms
- 實驗3、不關閉中斷+濾波
- 實驗3.1溫度讀取函式放在死回圈中輪詢執行+限幅濾波
- 實驗3.2控制溫度讀取函式執行頻率400ms + 限幅濾波
- 實驗3.3溫度讀取函式放在死回圈中輪詢執行+中位值平均濾波
- 實驗結論
- 奇異值出現的原因:
- 是否關閉中斷:
- 推薦處理方法:
- 意外識訓:
- 原始碼
- `限幅濾波法`
- `中位值平均濾波法`
- DS18B20初始值消除方法更新
- 單獨分別控制外設重繪頻率
0.0測驗背景
測驗背景1:用DS18B20溫度傳感器測驗溫度時,顯示裝置無論選擇數碼管還是LCD等,顯示裝置均會出現閃爍的現象,
測驗背景2:據說DS18B20對時序要求嚴格,那么在對DS18B20進行時序操作時是否需要關閉中斷?
0.1測驗環境
測驗環境:
DS18B20:
MCU:STC15F2K60S2 ,晶振頻率11.0592Mhz,波特率:9600bps
0.2觀察方法
定時器動態掃描數碼管顯示:數碼管處理函式放在死回圈中,不控制資料重繪頻率,即死回圈每執行一次數碼管處理函式就執行一次,
通過串口上位機顯示資料波形,波特率:9600bps,串口發送函式1ms執行一次,即串口對溫度資料的采樣頻率為1khz,
實驗1、不關閉中斷
?即在對DS18B20進行單總線資料通信時,不關閉所有中斷,
實驗1.1溫度讀取函式放在死回圈中輪詢執行
?即將溫度讀取函式rd_temperature放在死回圈中,不控制讀取頻率,
實驗現象:
?數碼管亮度顯示穩定,但是頻繁出現奇異資料,由于奇異資料的頻繁出現導致數碼管出現閃動,
?串口資料:
?串口資料波形:
?注意左側坐標,凡是出現肉眼可見的尖峰都可以理解為溫度資料的奇異值,即錯誤資料,由于串口資料是1ms發送一次,橫坐標的單位為ms,

實驗結論:
?這是溫度資料更新最快的,但是溫度資料出現奇異值的概率比較大,
實驗1.2控制溫度讀取函式執行頻率400ms
?通過設定標志位,控制溫度讀取函式rd_temperature的執行頻率,參考往屆賽題,將溫度資料的重繪頻率設定為400ms,
實驗現象:
?數碼管亮度顯示比較穩定,沒有任何閃爍的出現,奇異值還是會出現,頻率不低,
?串口資料波形:

實驗結論:
?對比上一張波形圖,可以得出,在相同時間奇異資料的出現頻率降低了接近一倍,數碼管的顯示狀態也可以接受,可以通過再減小溫度資料的重繪頻率,來減少奇異資料的出現,付出得代價是數碼管顯示溫度得靈敏度降低了,
實驗2、關閉中斷
即在對DS18B20進行單總線資料通信時,關閉所有中斷,
實驗2.1溫度讀取函式放在死回圈中輪詢執行
?即將溫度讀取函式rd_temperature放在死回圈中,不控制讀取頻率,
實驗現象:
?數碼管亮度顯示不穩定,每個數碼管輪流出現較暗的狀態,總的來看四個數碼管出現較大的閃動,完全沒有奇異值的出現,
?數碼管出現“閃動”現象的原因分析:
??由于每次執行溫度讀取函式rd_temperature時都暫時關閉了中斷,在執行完溫度讀取函式后再打開,然而,雖然單總線onewire的驅動函式中沒有單個比較長時間的延時,但是在溫度讀取函式rd_temperature`中反復多次呼叫底層驅動,軟體延時時間累計達到了6ms, 戳👉具體詳情,
又由于在執行溫度讀取函式時關閉了中斷,6ms的時間內沒有去重繪數碼管,由于鎖存器的存在,數碼管維持在上一個狀態,這就造成了每個數碼管點亮的時間長短不一,宏觀上也就是每個數碼管的亮度不均勻且閃動,
?串口資料波形:
?注意左側坐標,所有數值都在24.44到24.75之間,大部分在24.50到24.63之間,峰峰值為0.31,完全沒有奇異值的出現,資料顯示極其穩定,

實驗結論:
?雖然上位機傳回的資料極其穩定,沒有奇異值,但是由于頻繁關閉打開中斷,造成數碼管顯示閃動,無法接受,
實驗2.2控制溫度讀取函式執行頻率400ms
?通過設定標志位,控制溫度讀取函式rd_temperature的執行頻率,參考往屆賽題,將溫度資料的重繪頻率設定為500ms,
實驗現象:
?數碼管亮度顯示比較穩定,雖然控制了溫度資料的重繪頻率為500ms,但總歸還是關閉了中斷,數碼管還是會出現輕微“閃爍”,輪流出現閃動,完全沒有奇異值的出現,
?串口資料波形:
?注意左側坐標,所有數值都在24.27到24.44之間,峰峰值為0.17,完全沒有奇異值的出現,資料顯示極其穩定,

實驗結論:
?上位機傳回的資料極其穩定,沒有奇異值,數碼管只有輕微閃動,顯示效果良好,在接受范圍之內,
實驗3、不關閉中斷+濾波
?即在對DS18B20進行單總線資料通信時,不關閉所有中斷,并且對溫度讀取函式rd_temperature讀回來的資料采取軟體濾波,來消除奇異資料,
實驗3.1溫度讀取函式放在死回圈中輪詢執行+限幅濾波
?即將溫度讀取函式rd_temperature放在死回圈中,不控制讀取頻率,
實驗現象:
?數碼管亮度顯示穩定,偶爾會發輕微閃動,偶爾出現奇異資料,不過奇異資料的峰值得到了較大的限制,
?串口資料波形:
?由于限幅濾波演算法中的峰值限制在這兒選的是10,所以奇異資料偶爾出現并且限制在35以下,

實驗結論:
?在不關閉中斷的情況下,無論是數碼管顯示效果還是上位機的波形顯示,都得到了較好的控制,
?弊端是,為了限制奇異資料,限幅濾波演算法中的峰值限制選的是10,常溫25,資料得顯示范圍被規定在15~35之間,在賽場上用手來升溫必然沒有問題,可不知道機器閱卷時會怎樣,
實驗3.2控制溫度讀取函式執行頻率400ms + 限幅濾波
?通過設定標志位,控制溫度讀取函式rd_temperature的執行頻率,參考往屆賽題,兼顧數碼管顯示溫度資料得靈敏度,將溫度資料的重繪頻率設定為400ms,
實驗現象:
?數碼管亮度顯示極其穩定,沒有任何閃爍的出現,奇異值在測驗時沒有出現,可見奇異值出現概率極低,但應該還是存在,
?串口資料波形:
?看不到尖峰脈沖的存在,峰峰值在0.1左右,

?補:不知道過了多長時間……還是會出現奇異資料,但是出現奇異值的峰值已經很小,出現的概率極低,

實驗結論:
?在不關閉中斷的情況下,無論是數碼管顯示效果還是上位機的波形顯示,都得到了更好的控制,
?限幅濾波演算法中的峰值限制選的是30,常溫25,資料得顯示范圍被規定在-5~55之間,可測溫范圍更廣,
實驗3.3溫度讀取函式放在死回圈中輪詢執行+中位值平均濾波
?即將溫度讀取函式rd_temperature放在死回圈中,不控制讀取頻率,
實驗現象:
?即使不控制溫度讀取函式和數碼管的重繪頻率,數碼管亮度顯示極其穩定,無任何閃爍閃動,沒有任何奇異資料,
?串口資料波形:
?長時間測驗結果依舊,波形穩定,外界溫度穩定時,溫度在0.07范圍內波動,

實驗結論:
?在不關閉中斷的情況下,無論是數碼管顯示效果還是上位機的波形顯示,都得到了目前最好的控制,
?并且中位值平均濾波不存在限幅濾波演算法對溫度范圍的限制,
實驗結論
奇異值出現的原因:
?DS18B20對時序要求嚴格,中斷打斷了正在進行通過單總線傳輸的資料,造成了通信誤差,
是否關閉中斷:
?個人建議:不關閉中斷,一是為了數碼管顯示,二是如果關閉中斷,溫度讀取函式就相當于6ms的延時,會降低按鍵的靈敏度,
推薦處理方法:
?不關閉中斷,并采用中位值平均濾波法,目前已知最好的方法,
?藍橋杯比賽時,為節約時間可先采用 不關閉中斷+控制溫度讀取函式執行頻率,執行頻率或者叫做重繪頻率控制在400ms或500ms均可,但是這種方法還是有一定概率出現奇異資料,造成數碼管偶爾閃動,
?雖然限幅濾波演算法簡單易記代碼量少,但是畢竟評分時是機器閱卷,不知道測驗溫度環境是多少,所以不推薦使用,
?比賽時如果時間充足,推薦使用 不關閉中斷+控制溫度讀取函式執行頻率+中位值平均濾波,
意外識訓:
?按鍵消抖演算法三行代碼竟是 消抖濾波法,
?DS18B20溫度傳感器是一階傳感器,和RC回路充放電曲線相同,👇


原始碼
限幅濾波法
/********************************************************
Amplitude_Filter()-限幅濾波法
優點:能有效克服因偶然因素引起的脈沖干擾
缺點:無法抑制那種周期性的干擾,且平滑度差
說明:
1、形參 取得當前值
2、變數說明
Old_Value:最近一次有效采樣的值,該變數為靜態區域變數
New_Value:當前采樣的值
Return_Value:回傳值
3、常量說明
A:兩次采樣的最大誤差值,該值需要使用者根據實際情況設定
入口:Old_Value,上一次有效的采樣值,形參賦值
出口:Return_Value,回傳值,本次濾波結果
********************************************************/
//#define A 50
float Amplitude_Filter(float Value)
{
float New_Value = 0;
static float Old_Value = 25; //為提高濾波效果,可根據實際測溫情況進行賦值
float Return_Value = 0;
New_Value = Value;
if( ((New_Value-Old_Value)>A) || ((Old_Value-New_Value)>A) )
Return_Value=Old_Value;
else
{
Return_Value=New_Value;
Old_Value = New_Value;
}
return(Return_Value);
}
中位值平均濾波法
/********************************************
中位值平均濾波法(又稱防脈沖干擾平均濾波法)
說明:采一組佇列去掉最大值和最小值,相當于“中位值濾波法”+“算術平均濾波法”,
優點:融合了兩種濾波的優點,對于偶然出現的脈沖性干擾,可消
除有其引起的采樣值偏差,對周期干擾有良好的抑制作用,
平滑度高,適于高頻振蕩的系統,
缺點:測量速度慢
*********************************************/
//#define N 12
float Median_Average_Filter(float Value)
{
static unsigned char num = 0;
unsigned char i,j;
float temp=0,sum=0,value=25;
static float xdata value_buf[N]={25.0,25.0,25.0,25.0,25.0,25.0,25.0,25.0,25.0,25.0,25.0,25.0}; //存放采樣資料的陣列
if(num++ == N) num = 0;
value_buf[num] = Value;
//采樣值從小到大排列(冒泡法)
for(j=0;j<N-1;j++) //遍歷整個陣列
{
for(i=0;i<N-j;i++)
{
if(value_buf[i]>value_buf[i+1])
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
for(i=1;i<N-1;i++)
sum += value_buf[i];
value = sum/(N-2);
return(value);
}
DS18B20初始值消除方法更新
uchar puc_SEG_Code[8]= {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
void main(void)
{
Init();
Timer1Init();
UartInit();
temperature = rd_temperature()/16.0;
while(temperature == 85.0)
{
temperature = rd_temperature()/16.0;
}
//最后開中斷
ET1 = 1;
EA = 1;
while(1)
{
……
……
單獨分別控制外設重繪頻率
void temperature_Proc(void)
{
if(uc_temp_Flag) return;
uc_temp_Flag = 1;
//EA = 0;
temperature = rd_temperature()/16.0;
//temperature = Amplitude_Filter(temperature); //限幅濾波法
temperature = Median_Average_Filter(temperature);//中位值平均濾波法
//EA = 1;
}
完整工程0積分下載
濾波演算法參考1
濾波演算法參考2
??
??
??
??
彩 蛋
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/275047.html
標籤:其他
上一篇:C語言-2(學習C語言的第二天)

