不少美信 DS18B20 用戶,,想要用更高精度或更快讀溫速度的單總線溫度芯片進行應(yīng)用 升級,。敏源第 4 代高精度溫度芯片 M1820(TO92S 封裝),、M1601(SOT23 封裝),、 M601(DFN8 封裝)等,最高測溫精度±0.1℃,,同時也有±0.5℃精度的產(chǎn)品,。溫度芯片內(nèi) 置 16 bit ADC,溫度轉(zhuǎn)換時間 10.5/5.5/4ms 可配置,,客戶把原有 DS18B20 應(yīng)用例程做如 下簡單修改即可:
1,、溫度轉(zhuǎn)換時間 DS18B20 溫度轉(zhuǎn)換時間最快 500ms,M1820,、M1601,、M601 系列溫度轉(zhuǎn)換時間 10.5/5.5/4ms(默認出廠配置 10.5ms),配置方式見下:
ConvertTemp(),;
Delay_ms(11),;//不同重復(fù)性下轉(zhuǎn)換時間不同,此處延時必須大于對應(yīng)的轉(zhuǎn)換時間,。
@brief 設(shè)置周期測量頻率和重復(fù)性
* @param mps 要設(shè)置的周期測量頻率(每秒測量次數(shù)),,可能為下列其一
*@arg CFG_MPS_Single:每執(zhí)行 ConvertTemp 一次,啟動一次溫度測量
*@arg CFG_MPS_Half:每執(zhí)行 ConvertTemp 一次,,啟動每秒 0.5 次重復(fù)測量
*@arg CFG_MPS_1:每執(zhí)行 ConvertTemp 一次,,啟動每秒 1 次重復(fù)測量
*@arg CFG_MPS_2:每執(zhí)行 ConvertTemp 一次,啟動每秒 2 次重復(fù)測量
*@arg CFG_MPS_4:每執(zhí)行 ConvertTemp 一次,,啟動每秒 4 次重復(fù)測量
*@arg CFG_MPS_10:每執(zhí)行 ConvertTemp 一次,,啟動每秒 10 次重復(fù)測量
* @param repeatability:要設(shè)置的重復(fù)性值,可能為下列其一
*@arg CFG_Repeatbility_Low:設(shè)置低重復(fù)性,,轉(zhuǎn)換時間 4ms
*@arg CFG_Repeatbility_Medium:設(shè)置中重復(fù)性,,轉(zhuǎn)換時間 5.5ms
*@arg CFG_Repeatbility_High:設(shè)置高重復(fù)性,轉(zhuǎn)換時間 10.5ms
* @retval 無
bool OW_SetConfig(uint8_t mps,, uint8_t repeatability)
{ uint8_t scrb[sizeof(M1820_SCRATCHPAD_READ)],;
M1820_SCRATCHPAD_READ *scr = (M1820_SCRATCHPAD_READ *) scrb;
讀 9 個字節(jié),。第 7 字節(jié)是系統(tǒng)配置寄存器,,第 8 字節(jié)是系統(tǒng)狀態(tài)寄存器。最后字節(jié)是 前 8 個的校驗和 CRC if(OW_M1820_ReadScratchpad_SkipRom(scrb) == FALSE)
{ return FALSE,; 讀暫存器組水平 }
計算接收的前 8 個字節(jié)的校驗和,,并與接收的第 9 個 CRC 字節(jié)比較。
if(scrb[8] ?。?MY_OW_CRC8(scrb,, 8))
{ return FALSE,; CRC 驗證未通過 }
scr->Cfg &= ~CFG_Repeatbility_Mask;
scr->Cfg |= repeatability,;
scr->Cfg &= ~CFG_MPS_Mask,;
scr->Cfg |= mps;
OW_M1820_WriteScratchpad_SkipRom(scrb+4),;
return TRUE,; }
2、溫度寄存器
DS18B20 分辨率 9-12bit ADC,,M1820,、M1601、M601 系列為 16bit ADC,,溫度 寄存器格式不同,,計算公式也不同,修改如下:
float M1820_OutputtoTemp(int16_t out)
{ return ((float)out/256.0 + 40.0),; }
3,、睡眠模式
M1820、M601,、M1601 系列進入睡眠時,,需要把 Scratchpad 寄存器的 9 個字節(jié)全 部讀完,無需發(fā)送發(fā)送指令,,讀取函數(shù)按如下進行修改:
bool ReadTempWaiting_SkipRom(uint16_t *iTemp)
{ uint8_t scrb[sizeof(MY18E20_SCRATCHPAD_READ)],;
MY18E20_SCRATCHPAD_READ *scr = (MY18E20_SCRATCHPAD_READ *) scrb; 讀 9 個字節(jié),。前兩個是溫度轉(zhuǎn)換結(jié)果,,最后字節(jié)是前 8 個的校驗和--CRC。 if(MY18E20_ReadScratchpad_SkipRom(scrb) == FALSE)
{ return FALSE,; 讀寄存器失敗 }
計算接收的前 8 個字節(jié)的校驗和,,并與接收的第 9 個 CRC 字節(jié)比較。 if(scrb[8] ?。?MY_OW_CRC8(scrb,, 8))
{ return FALSE; CRC 驗證未通過 }
將溫度測量結(jié)果的兩個字節(jié)合成為 16 位字,。 *iTemp=(uint16_t)scr->T_msb<<8 | scr->T_lsb,; return TRUE; }
4,、暫存器
使用 M1820,、M1601、M601 系列時,暫存器配置只需按芯片手冊定義進行修訂即 可,。
與 DS18B20 相比,,M1820、M1601,、M601 系列除了更高精 度外,,還具有更寬電壓范圍(1.8~5.5V)、更低功耗(測溫平均電 流 5μA@3.3V,,1Hz),、溫度一致性好,、測溫分辨率高等優(yōu)點,。
選型可參見下表。