DS18B20是一款精度比較好的溫度傳感器,最重要的是它通過一根導線,既完成通訊,又給芯片供電,在MCU引腳數量比較緊張的時候,確實是個不錯的選擇。這顆芯片看起來簡單,但真正讓它跑起來,從里面讀出溫度數據可沒有想象的那么容易。這不,群里的Ryan Wang同學就被折磨得不行。難能可貴的是,在王同學終于搞定它之后,無私地分享出心得和代碼。如果你覺得這篇文章能幫到更多的同學,就幫忙轉發,或點個在看吧。
通過CUBE使能TIM2定時器,Clock Source使用internal Clock,MCU主頻為32Mhz,故Prescaler=32-1=31,Counter Mode為UP,這里注意Counter Period 官方手冊要求最低為1,經測試設置為2時,定時器更為準確。
完成以上配置后,需要在程序手動調整和增加功能代碼:
1. Cube配置TIM2定時器的基礎上,在程序編寫delay_us(uint16_t us)函數,delay_us的精確度將直接影響DS18B20溫度數據的讀取結果。本程序使用了HAL庫(CUBE勾選配置)
voiddelay_us(uint16_tus)
{
/*中斷會打斷微秒延時函數,
*但計數器計數不會停
*防止計數器增加到65535之后重新開始計數
*/
uint16_tdiffer=50000-us;
HAL_TIM_Base_Start(&htim2);
__HAL_TIM_SET_COUNTER(&htim2,differ);
while(differ<50000)
????{
????????differ=__HAL_TIM_GET_COUNTER(&htim2);
????}
????HAL_TIM_Base_Stop(&htim2);
}
2. 注意程序工程中DS18B20.H的定義,及DS18B20.C文件,(同文件夾下附件)其內部函數定義根據DS18B20官方手冊進行操作,DS18B20為one wire 通訊,對時序的要求相對嚴格,DS18B20的數據通訊通過DS18B20的data管腳進行單片機通訊,主要流程為:
1.DS18B20初始化
2.DS18B20接入自檢
3.DS18B20寫0xcc(SKIP ROM)
4.寫0x44(通知傳感器進行溫度數據采集與轉換)
5.DS18B2再次初始化
6.DS18B20再次接入自檢
7.DS18B20寫0xcc(SKIP ROM)(倒序即0011 0011,如下圖左)
8.DS18B20寫0xbe(通知傳感器進行數傳)(倒序0111 1101,下圖右)
9.DS18B20讀一個字節
10.DS18B20再讀一個字節
11.數據的預處理
3. 以上每步操作都需要微秒級延時等待,參考DS18B20官方手冊關于“DS18B20初始化與check”,“寫0”,“寫1”,“讀0”,“讀1”的具體時序要求,注意針對不同MCU的主頻配置,在保證1微秒延時準確的前提下,具體的微秒延時將有所調整;特別注意在讀時序時的延時,針對32MHZ的本機,在DS18B20.C中已做延時調整(參考正點原子DS18B20試驗(72MHZ),使用示波器抓取各個階段波形,結合DS18B20手冊,對比調試,)若時序不對,則讀數一直為0或者85。著重理解DS18B20_data管腳的輸入和輸出模式,拉高和拉低(如DS18B20標準電路要求在data管腳接上拉電阻,那么在管腳IN和OUT模式下,如未人為拉高或拉低,則管腳電平會自動拉高)。
4. 傳感器選用DS18B20,因外部封裝種類繁多,在此不放鏈接。
審核編輯 :李倩
-
芯片
+關注
關注
456文章
50938瀏覽量
424688 -
溫度傳感器
+關注
關注
48文章
2950瀏覽量
156183 -
定時器
+關注
關注
23文章
3251瀏覽量
115005
原文標題:DS18B20驅動程序調試總結
文章出處:【微信號:TopSemic,微信公眾號:TopSemic嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論