DS18B20是一款精度較好的溫度傳感器,最重要的是,它通過一根導(dǎo)線,既完成通訊,又給芯片供電,在MCU引腳數(shù)量比較緊張的時候,確實(shí)是個不錯的選擇。這顆芯片看起來簡單,但真正讓它跑起來,從里面讀出溫度數(shù)據(jù)可沒有想象的那么容易。這不,群里的Ryan Wang同學(xué)就被折磨得不行。難能可貴的是,在王同學(xué)終于搞定它之后,無私地分享出心得和代碼。如果你覺得這篇文章能幫到更多的同學(xué),就幫忙轉(zhuǎn)發(fā),或點(diǎn)個在看吧!
通過CUBE使能TIM2定時器,Clock Source使用internal Clock,MCU主頻為32Mhz,故Prescaler=32-1=31,Counter Mode為UP,這里注意Counter Period 官方手冊要求最低為1,經(jīng)測試設(shè)置為2時,定時器更為準(zhǔn)確。完成以上配置后,需要在程序手動調(diào)整和增加功能代碼:1. ? Cube配置TIM2定時器的基礎(chǔ)上,在程序編寫delay_us(uint16_t us)函數(shù),delay_us的精確度將直接影響DS18B20溫度數(shù)據(jù)的讀取結(jié)果。本程序使用了HAL庫(CUBE勾選配置)。void?delay_us(uint16_t?us)
{
?/*?中斷會打斷微秒延時函數(shù),
??*?但計(jì)數(shù)器計(jì)數(shù)不會停
??*?防止計(jì)數(shù)器增加到65535之后重新開始計(jì)數(shù)
??*/
????uint16_t?differ=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文件,(同文件夾下附件)其內(nèi)部函數(shù)定義根據(jù)DS18B20官方手冊進(jìn)行操作,DS18B20為one wire 通訊,對時序的要求相對嚴(yán)格,DS18B20的數(shù)據(jù)通訊通過DS18B20的data管腳進(jìn)行單片機(jī)通訊,主要流程如下:
1. DS18B20初始化
2. DS18B20接入自檢
3. DS18B20寫0xcc(SKIP ROM)
4. 寫0x44(通知傳感器進(jìn)行溫度數(shù)據(jù)采集與轉(zhuǎn)換)
5. DS18B2再次初始化
6. DS18B20再次接入自檢
7. DS18B20寫0xcc(SKIP ROM)(倒序即0011 0011,如下圖左)
8. DS18B20寫0xbe(通知傳感器進(jìn)行數(shù)傳)(倒序0111 1101,下圖右)
9. DS18B20讀一個字節(jié)
10. DS18B20再讀一個字節(jié)

3. ?以上每步操作都需要微秒級延時等待,參考DS18B20官方手冊關(guān)于“DS18B20初始化與check”,“寫0”,“寫1”,“讀0”,“讀1”的具體時序要求,注意針對不同MCU的主頻配置,在保證1微秒延時準(zhǔn)確的前提下,具體的微秒延時將有所調(diào)整。需要特別注意,在讀時序時的延時,針對32MHZ的本機(jī),在DS18B20.C中已做延時調(diào)整(參考正點(diǎn)原子DS18B20試驗(yàn)(72MHZ),使用示波器抓取各個階段波形,結(jié)合DS18B20手冊,對比調(diào)試,)若時序不對,則讀數(shù)一直為0或者85。著重理解DS18B20_data管腳的輸入和輸出模式,拉高和拉低(如DS18B20標(biāo)準(zhǔn)電路要求在data管腳接上拉電阻,那么在管腳IN和OUT模式下,如未人為拉高或拉低,則管腳電平會自動拉高)。

4. 傳感器選用的是DS18B20,因外部封裝種類繁多,此處就不放鏈接了,相關(guān)代碼可點(diǎn)擊文末“閱讀原文”進(jìn)行查看。
來源:TopSemic嵌入式
版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。單片機(jī)只會調(diào)庫和復(fù)制別人的代碼是什么水平?