之間的比較 PT100溫度感測器 探針和 DS18B20模組
1) 訊號擷取的基本原理
① PT100的阻值隨溫度成比例變化 (溫度越高, 阻力越大), 但電阻變化很小, 關於 0.385 哦 / 程度;
② PT100的溫度測量範圍為-200℃ -200℃, 且在0℃時, 電阻剛好等於 100 哦;
③ PT100的工作電流應小於 5 毫安;
④ 雖然PT100的阻值隨溫度成比例變化, 其變化率 (那是, K值 K值 K值) 在不同的溫度範圍內是不同的.
2) PT100耐溫變化表
3. PT100驅動電路
1) 透過分壓法, AD擷取PT100電壓取得電阻值計算溫度
PT100在常溫水中的電阻值 (25℃25℃25℃) 是關於 109.89 哦.
單晶片輸出3.3V電壓, 電壓除以 PT100 約為:
109.89 * 0.005 = 0.54945 V
根據AD轉換公式轉換後的AD值約為:
0.54945 / 3.3 * 4096 = 681.98 ≈ 682
當溫度上升一度, 假設 PT100 的電阻僅上升 0.385 哦, 分壓的變化值約等於:
0.385 * 0.005 = 0.001925 V
根據AD轉換公式轉換後的AD值約為:
0.001925 / 3.3 * 4096 = 2.39 ≈ 2
實驗中, 發現由於stm32電源3.3V電壓不穩定, ADC採集PT100電壓波動,分壓誤差較大. 最佳化方案是設計恆定電流源電路. 透過採集PT100的電壓和恆定電流源的電流, 即可求出PT100的阻值, 然後就可以得到溫度值.
2) 基於LDO穩壓器的恆定電流源電路 (MD5333)
網路上有許多測試PT100的驅動電路, 如直流電橋電路, 基於運算放大器的恆定電流源電路, ETC. 作者在驅動電路的選擇上也花了很多功夫, 考慮到電路板的製作難度和元件數量, 最後選擇了基於LDO穩壓的恆定電流源電路 (MD5333). 電路圖如下:
在此刻, 硬體選用已基本完成. 使用的開發板是正電Atom F10ZET6 Elite Board
DS18B20模組
以便測試即時溫度與PT100溫度比較, 新增DS18B20模組進行校準比較測試
1) DS18B20簡介
DS18B20是單一匯流排溫度感測器,測試溫度範圍為-55~+125℃,精度為±0.5℃. 現場溫度以單一總線數位方式直接傳輸, 大大提高了系統的抗干擾能力. 可直接讀取被測溫度, 並可依實際需求透過簡單程式實現9~12位元數字值讀取方式. 其工作電壓範圍為3~5.5V, 並且採用多種包裝形式, 讓系統設定靈活方便. 使用者設定的設定解析度和警報溫度儲存在EEPROM中,斷電後仍保存.
2) DS18B20工作時序介紹
所有單一匯流排設備都需要嚴格的訊號時序以確保資料完整性. DS18B20有 6 訊號類型: 重設脈衝, 響應脈衝, 寫 0, 寫 1, 讀 0 並閱讀 1. 所有這些信號, 除了響應脈衝, 是主機發送的同步訊號. 並且所有命令和資料都是以位元組的低位在前發送.
① 復歸脈衝和響應脈衝
單總線上的所有通訊均以初始化序列開始. 主機輸出低電位並保持低電位至少480us產生重設脈衝. 然後主機釋放總線, 4.7K上拉電阻將單一匯流排拉高, 延遲時間15~60us, 並進入接收模式 (接收). 然後DS18B20將匯流排拉低60~240us,產生低電平響應脈衝.
② 寫入時序
寫入時序包括寫 0 計時和寫作 1 定時. 所有寫入時序至少需要 60us, 兩次獨立寫入時序之間至少需要1us恢復時間. 兩個寫入時序均從主機拉低匯流排開始. 寫 1 定時: 主機輸出低電平, 延遲2us, 然後釋放總線, 延遲60us. 寫 0 定時: 主機輸出低電平, 延遲60us, 然後延遲2us釋放總線.
③ 讀取時序
單一匯流排設備僅在主機發出讀取時序時才傳送數據. 所以, 主機發出讀取資料命令後, 必須立即產生讀取時序,以便從機可以傳輸數據. 所有讀取時序至少需要 60us, 兩次獨立的讀時序之間至少需要1us的恢復時間. 每次讀取時序均由主機發起, 這會拉低總線至少 1us. 主機必須在讀取計時期間釋放總線,並在計時開始後15us內採樣總線狀態. 典型的讀時序過程是: 主機輸出低電平延遲2us, 然後主機切換到輸入模式延遲12us, 然後讀取單一總線當前電平, 然後延遲50us.
了解單一總線時序後, 我們來看看DS18B20的典型溫度讀取過程. DS18B20的典型溫度讀取流程為: 重設 → 發送 SKIPROM (0xCC) → 傳送啟動轉換命令 (0x44) → 延遲 → 重設 → 傳送 SKIPROM 指令 (0xCC) → 發送記憶體命令 (0乙醚) → 讀取兩個位元組的數據 (IE. 溫度) 連續→結束.
3) 示意圖與CUBEMAX配置
從原理圖來看, 可以看到DS18B20透過PG11口使能開啟串口列印溫度訊息
4) 程式碼部分
程式碼部分移植了正電Atom的ds18b20函式庫並稍作修改
#ifndef __DS18B20_H
#定義__DS18B20_H
#包括 “提姆.h”
/***********************************************************************************/
/* DS18B20腳定義 */
#定義 DS18B20_DQ_GPIO_PORT GPIOG
#定義 DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#定義DS18B20_DQ_GPIO_CLK_ENABLE() 做{ __HAL_RCC_GPIOG_CLK_ENABLE(); }儘管(0) /* PG口時鐘使能 */
/**********************************************************************************************/
/* IO操作功能 */
#定義DS18B20_DQ_OUT(x) 做{ x ? \
HAL_GPIO_WritePin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_SET) : \
HAL_GPIO_WritePin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_RESET); \
}儘管(0) /* 數據連接埠輸出 */
#定義 DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* 數據連接埠輸入 */
uint8_t DS18b20_init(空白); /* 初始化DS18B20 */
uint8_t DS18b20_check(空白); /* 檢查DS18B20是否存在 */
短 ds18b20_get_溫度(空白);/* 獲取溫度 */
#恩迪夫
5. 紅外線遙控模組
1) 無線模組編碼協議
紅外線遙控廣泛採用的編碼方式有: PWM的NEC協議 (脈寬調製) 和飛利浦 PPM 的 RC-5 協議 (脈衝位置調變). 開發板自帶的遙控器採用NEC協議, 它具有以下特點:
1. 8-位元位址和8位元指令長度;
2. 地址和命令傳輸兩次 (確保可靠性);
3. PWM脈衝位置調製, 傳輸的紅外線載波的佔空比代表 “0” 和 “1”;
4. 載波頻率為38Khz;
5. 位元時間為1.125ms或2.25ms;
在NEC協議中, 如何將協定中的資料設定為 ‘0’ 或“1”? 這裡, 紅外線接收器和紅外線發射器分離.
紅外線發射器: 發送協定資料‘0’=載波訊號傳輸560us + 560使用無載波訊號傳輸
發送協定資料‘1’=載波訊號傳輸560us + 1680使用無載波訊號傳輸
紅外線發射器的位元定義如下圖所示
紅外線接收頭: 接收協定資料‘0’=560us低電平 + 560美國高層
接收協定資料‘1’=560us低電平 + 1680美國高層
NEC遠端控制指令的資料格式為: 同步終端, 位址碼, 位址反碼, 控制碼, 控制反碼. 同步碼由9ms低電平和4.5ms高電平組成. 地址代碼, 位址反碼, 控制碼, 和控制反碼都是8位元資料格式. 依低位在先、高位在後的順序發送. 使用反碼來增加傳輸的可靠性.
所以, 輸入捕捉可測量高電平脈寬,實現遙控解碼.
2) 示意圖與CUBEMAX配置
從原理圖來看, 我們可以看到無線模組透過PB9引腳使能並透過 4 TIM4通道:
TIM4_CH4的預設引腳不是PB9, 所以需要手動設定, 並且同時開啟中斷設定
3) 程式碼部分
透過tim回調函數捕獲上升沿
此時, 可以得到解碼後的訊號:
此時, 數據比較複雜,可以稍微處理一下:
效果如下:
最後兩位是解碼後的碼及其反碼. 此時, 可以定義一個巨集來調整溫度閾值:
效果如下:
紅外線部分代碼:
/* 使用者程式碼開始標題 */
/**
******************************************************************************
* @文件 : 主機程式
* @簡短的 : 主程序體
******************************************************************************
* @注意力
*
* <小時2><中心>&複製; 版權 (c) 2024 意法半導體.
* 版權所有。</中心></小時2>
*
* 該軟體組件由 ST 根據 BSD 3-Clause 許可證獲得許可,
* 這 “執照”; 除非遵守以下規定,否則您不得使用此文件
* 執照. 您可以在以下位置取得許可證副本::
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* 使用者代碼結束標頭 */
/* 包括 ——————————————————————*/
#包括 “主程式.h”
#包括 “提姆.h”
#包括 “usart.h”
#包括 “GPIO.h”
/* 私人包括 ———————————————————-*/
/* 使用者代碼開始包括 */
#包括 “stdio.h”
#包括 “字串.h”
#定義最大 157
#定義最大下降 87
#定義 MINUP 221
#定義 MINDOWN 61
/* 使用者代碼結束 包括 */
/* 私有類型定義 ———————————————————–*/
/* 使用者代碼開始 PTD */
/* 使用者代碼結束 PTD */
/* 私人定義 ————————————————————*/
/* 使用者代碼開始 PD */
/* 使用者代碼結束 PD */
/* 私有宏 ————————————————————-*/
/* 使用者程式碼開始PM */
/* 使用者代碼 結束 PM */
/* 私有變數 ———————————————————*/
/* 使用者代碼開始PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t 寬度=0;
uint16_t 緩衝區[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* 使用者代碼結束PV */
/* 私有函數原型 ———————————————–*/
無效系統時脈_配置(空白);
/* 使用者代碼開始 PFP */
/* 使用者代碼結束 PFP */
/* 私人用戶代碼 ———————————————————*/
/* 使用者代碼開始 0 */
無效 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
向上計數++;
}
無效 HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
如果(是上尉)//如果是上升沿捕獲
{
ValueUp=HAL_TIM_ReadCapturedValue(赫蒂姆,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(赫蒂姆,TIM_CHANNEL_4、TIM_ICPOLARITY_FALLING);
向上計數=0;
}
別的{
ValueDown=HAL_TIM_ReadCapturedValue(赫蒂姆,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(赫蒂姆,TIM_CHANNEL_4、TIM_ICPOLARITY_RISING);
寬度=ValueDown+upCount*65536-ValueUp;
如果(寬度>4400&&寬度<4600)
{
緩衝區ID=0;
緩衝[緩衝區ID++]=寬度;
}
否則如果(緩衝區ID>0)
{
緩衝[緩衝區ID++]=寬度;
如果(緩衝區ID>32)
{
rcvFalg=1;
緩衝區ID=0;
}
}
}
}
無效位元緩衝區2num(字元數[])
{
編號[0]=0;
編號[1]=0;
編號[2]=0;
編號[3]=0;
為了(整數i=0;我<32;我++)
{
如果(緩衝[我+1]<1000)
{
編號[我/8]=數字[我/8]<<1;
}
別的
{
編號[我/8]=數字[我/8]<<1;
編號[我/8]|=0x01;
}
}
}
/* 使用者代碼結束 0 */
/**
* @brief 應用程式入口點.
* @retval整數
*/
整數主(空白)
{
/* 使用者代碼開始 1 */
字元列印緩衝區[128]={0};
字元數[4]={0};
字符鍵=0;
/* 使用者代碼結束 1 */
/* 單晶片配置——————————————————–*/
/* 重設所有周邊, 初始化Flash介面和Systick. */
HAL_初始化();
/* 使用者程式碼開始初始化 */
/* 使用者程式碼結束初始化 */
/* 配置系統時鐘 */
系統時脈配置();
/* 使用者程式碼開始 SysInit */
/* 使用者程式碼結束 SysInit */
/* 初始化所有配置的周邊設 */
MX_GPIO_初始化();
MX_TIM4_初始化();
MX_USART1_UART_Init();
/* 使用者代碼開始 2 */
/* 使用者代碼結束 2 */
/* 無限循環 */
/* 使用者程式碼開始同時 */
HAL_GPIO_TogglePin(LED0_GPIO_埠,LED0_引腳);
HAL_TIM_Base_Start_IT(&赫蒂姆4);//定時器更新產生中斷
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
儘管 (1)
{
如果(接收錯誤)
{
為了(整數i=0;我<4;我++)
{
位元緩衝區2個數(編號);
衝刺函數(列印緩衝區,”0xx “,編號[我]);
HAL_UART_傳輸(&huart1,列印緩衝區,斯特倫(列印緩衝區),HAL_MAX_DELAY);
}
// 衝刺函數(列印緩衝區,”%你 “,緩衝[我]);
// HAL_UART_傳輸(&huart1,列印緩衝區,斯特倫(列印緩衝區),HAL_MAX_DELAY);
// }
HAL_UART_傳輸(&huart1,”\rn”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
列印函數(“%drn”,編號[3]);
如果(編號[3]==157)
{
列印函數(“111111\rn”);
}
HAL_延遲(1000);
/* 使用者代碼結束同時 */
/* 使用者代碼開始 3 */
}
/* 使用者代碼結束 3 */
}
/**
* @brief系統時脈配置
* @retval 無
*/
無效系統時脈_配置(空白)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};