之間的比較 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};
English
Afrikaans
العربية
বাংলা
bosanski jezik
Български
Català
粤语
中文(简体)
中文(漢字)
Hrvatski
Čeština
Nederlands
Eesti keel
Suomi
Français
Deutsch
Ελληνικά
हिन्दी; हिंदी
Magyar
Bahasa Indonesia
Italiano
日本語
한국어
Latviešu valoda
Lietuvių kalba
македонски јазик
Bahasa Melayu
Norsk
پارسی
Polski
Português
Română
Русский
Cрпски језик
Slovenčina
Slovenščina
Español
Svenska
ภาษาไทย
Türkçe
Українська
اردو
Tiếng Việt









