فناوری سنسور دما

کاوشگر سنسور دما (طراحی مدار عملکردی DS18B20 و PT100)

شماتیک DS18B20 و پیکربندی CUBEMAX

مقایسه بین سنسور دما PT100 کاوشگر و ماژول DS18B20
1) اصل اساسی دریافت سیگنال
① مقاومت PT100 متناسب با دما تغییر می کند (هر چه دما بالاتر باشد, هر چه مقاومت بیشتر باشد), اما تغییر مقاومت بسیار کوچک است, در مورد 0.385 اوه / درجه;
② محدوده اندازه گیری دما PT100 -200℃ -200℃ است, و در 0℃, مقاومت دقیقا برابر است 100 اوه;
③ جریان کاری PT100 باید کمتر از 5 mA;
④ اگرچه مقاومت PT100 متناسب با دما تغییر می کند, نرخ تغییر آن (این است, K مقدار K مقدار K مقدار) در محدوده دمایی مختلف متفاوت است.

2) جدول تغییر مقاومت دما PT100

جدول تغییر مقاومت دما PT100

3. مدار درایو PT100

مدار درایو PT100

مدار درایو PT100

1) از طریق روش تقسیم ولتاژ, AD ولتاژ PT100 را جمع آوری می کند تا مقدار مقاومت را برای محاسبه دما بدست آورد
مقدار مقاومت PT100 در آب در دمای اتاق (25℃25℃25℃) در مورد است 109.89 اوه.
میکروکنترلر ولتاژ 3.3 ولت خروجی می دهد, و ولتاژ تقسیم بر PT100 تقریباً است:
109.89 ∗ 0.005 = 0.54945 حرفهای

مقدار AD تبدیل شده طبق فرمول تبدیل AD تقریباً است:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682

زمانی که دما یک درجه افزایش یابد, با فرض اینکه مقاومت PT100 فقط افزایش می یابد 0.385 اوه, مقدار تغییر ولتاژ تقسیم تقریباً برابر است:
0.385 ∗ 0.005 = 0.001925 حرفهای

مقدار AD تبدیل شده طبق فرمول تبدیل AD تقریباً است:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2

در آزمایش, مشخص شد که به دلیل ولتاژ ناپایدار 3.3 ولت منبع تغذیه stm32, ADC نوسانات ولتاژ PT100 را جمع آوری کرد و خطای تقسیم ولتاژ بزرگ بود. راه حل بهینه سازی طراحی مدار منبع جریان ثابت است. با جمع آوری ولتاژ PT100 و جریان منبع جریان ثابت, مقاومت PT100 را می توان به دست آورد, و سپس مقدار دما را می توان بدست آورد.

2) مدار منبع جریان ثابت بر اساس تنظیم کننده LDO (MD5333)
مدارهای رانندگی زیادی برای آزمایش PT100 در اینترنت وجود دارد, مانند مدار پل DC, مدار منبع جریان ثابت بر اساس تقویت کننده عملیاتی, OTC. نویسنده همچنین زمان زیادی را برای انتخاب مدار رانندگی صرف کرده است, با توجه به سختی ساخت برد و تعداد اجزا, و در نهایت مدار منبع جریان ثابت بر اساس رگولاتور LDO را انتخاب کرد (MD5333). نمودار مدار به شرح زیر است:

مدار منبع جریان ثابت رگولاتور LDO (MD5333)

مدار منبع جریان ثابت رگولاتور LDO (MD5333)

در این مرحله, انتخاب سخت افزار اساسا تکمیل شده است. برد توسعه مورد استفاده Zhengdian Atom F10ZET6 Elite Board است

ماژول DS18B20
به منظور آزمایش دمای زمان واقعی و مقایسه دمای PT100, ماژول DS18B20 برای تست مقایسه کالیبراسیون اضافه شده است

1) مقدمه ای بر DS18B20
DS18B20 یک سنسور دمای تک اتوبوس با محدوده دمای آزمایشی -55 ~ + 125 درجه سانتیگراد و دقت ± 0.5 درجه سانتیگراد است.. دمای میدان مستقیماً به روش دیجیتال تک باس منتقل می شود, که تا حد زیادی توانایی ضد تداخل سیستم را بهبود می بخشد. می تواند به طور مستقیم دمای اندازه گیری شده را بخواند, و می تواند یک روش خواندن ارزش دیجیتال 9 تا 12 بیتی را از طریق برنامه نویسی ساده با توجه به نیازهای واقعی تحقق بخشد. محدوده ولتاژ کاری آن 3 تا 5.5 ولت است, و از انواع فرم های بسته بندی استفاده می کند, تنظیم سیستم را انعطاف پذیر و راحت می کند. وضوح تنظیم شده و دمای هشدار تنظیم شده توسط کاربر در EEPROM ذخیره می شود و پس از قطع برق همچنان ذخیره می شود..

طراحی مدار DS18B20

طراحی مدار DS18B20

2) مقدمه ای بر زمان بندی کار DS18B20
همه دستگاه های تک باس برای اطمینان از یکپارچگی داده ها به زمان بندی دقیق سیگنال نیاز دارند. DS18B20 دارد 6 انواع سیگنال: ریست پالس, پالس پاسخ, نوشتن 0, نوشتن 1, خواندن 0 و بخوانید 1. همه این سیگنال ها, به جز پالس پاسخ, سیگنال های همزمان ارسال شده توسط میزبان هستند. و تمام دستورات و داده ها ابتدا با بیت کم بایت ارسال می شوند.

DS18B20 ریست پالس و پالس پاسخ

DS18B20 ریست پالس و پالس پاسخ

① پالس و پالس پاسخ را بازنشانی کنید
تمام ارتباطات در یک گذرگاه با یک دنباله اولیه شروع می شود. میزبان سطح پایینی را خروجی می دهد و سطح پایین را برای حداقل 480 us نگه می دارد تا پالس تنظیم مجدد ایجاد کند.. سپس میزبان اتوبوس را آزاد می کند, و مقاومت 4.7K pull-up تک باس را بالا می کشد, با تاخیر 15~60 us, و وارد حالت دریافت می شود (Rx). سپس DS18B20 گذرگاه را به مدت 60 ~ 240 us به پایین می کشد تا یک پالس پاسخ سطح پایین ایجاد کند..

زمان نوشتن DS18B20

زمان نوشتن DS18B20

② زمان بندی را بنویسید
زمان نوشتن شامل نوشتن است 0 زمان بندی و نوشتن 1 زمان بندی. همه زمان‌بندی‌های نوشتن حداقل به 60 us نیاز دارند, و حداقل 1 واحد زمان بازیابی بین دو زمان نوشتن مستقل مورد نیاز است. هر دو زمان نوشتن با پایین کشیدن اتوبوس توسط میزبان شروع می شود. بنویسید 1 زمان بندی: میزبان سطح پایینی را خروجی می دهد, تاخیر برای 2 ما, و سپس اتوبوس را رها می کند, تاخیر 60 us. بنویسید 0 زمان بندی: میزبان سطح پایینی را خروجی می دهد, تاخیر برای 60 us, و سپس اتوبوس را با تاخیر 2 us آزاد می کند.

زمان خواندن DS18B20

زمان خواندن DS18B20

③ زمان بندی را بخوانید
دستگاه‌های تک باس تنها زمانی داده‌ها را به میزبان منتقل می‌کنند که میزبان زمان‌بندی خواندن را صادر کند. از این رو, پس از اینکه میزبان دستور خواندن داده ها را صادر کرد, یک زمان‌بندی خواندن باید فوراً ایجاد شود تا برده بتواند داده‌ها را منتقل کند. همه زمان‌بندی‌های خواندن حداقل به 60 us نیاز دارند, و حداقل 1 واحد زمان بازیابی بین دو زمان خواندن مستقل مورد نیاز است. هر زمان خواندن توسط میزبان آغاز می شود, که اتوبوس را برای حداقل 1 ما پایین می کشد. میزبان باید در طول زمان‌بندی خواندن، گذرگاه را آزاد کند و پس از شروع زمان‌بندی، در عرض 15 ما از وضعیت اتوبوس نمونه‌برداری کند.. فرآیند زمان‌بندی خواندن معمولی است: میزبان تاخیر سطح پایین 2 us را خروجی می دهد, سپس میزبان به تاخیر حالت ورودی 12 us تغییر می دهد, سپس سطح فعلی تک اتوبوس را می خواند, و سپس 50 us را به تاخیر می اندازد.

DS18B20 پورت سریال را برای چاپ اطلاعات دما باز می کند

DS18B20 پورت سریال را برای چاپ اطلاعات دما باز می کند

پس از درک زمان بندی تک اتوبوس, بیایید نگاهی به فرآیند معمولی خواندن دمای DS18B20 بیندازیم. فرآیند خواندن دمای معمولی DS18B20 است: بازنشانی → ارسال SKIPROM (0XCC) → ارسال دستور تبدیل شروع (0x44) ← تاخیر ← بازنشانی ← ارسال فرمان SKIPROM (0XCC) → دستور ارسال حافظه (0xbe) → خواندن دو بایت داده (یعنی. درجه حرارت) پیوسته → پایان.

3) نمودار شماتیک و پیکربندی CUBEMAX
از نمودار شماتیک, مشاهده می شود که DS18B20 توسط پورت PG11 برای باز کردن پورت سریال برای چاپ اطلاعات دما فعال شده است.

شماتیک DS18B20 و پیکربندی CUBEMAX

شماتیک DS18B20 و پیکربندی CUBEMAX

رابط سنسور دما و رطوبت DS18B20

رابط سنسور دما و رطوبت DS18B20

4) بخش کد
بخش کد، کتابخانه ds18b20 Zhengdian Atom را پیوند می دهد و تغییرات جزئی ایجاد می کند.

#ifndef __DS18B20_H
#__DS18B20_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_temperature کوتاه(باطل);/* دما را دریافت کنید */

#endif

5. ماژول کنترل از راه دور مادون قرمز
1) پروتکل کدگذاری ماژول بی سیم

روش های کدگذاری پرکاربرد برای کنترل از راه دور مادون قرمز هستند: پروتکل NEC PWM (مدولاسیون عرض پالس) و پروتکل RC-5 فیلیپس PPM (مدولاسیون موقعیت پالس). کنترل از راه دور همراه با برد توسعه از پروتکل NEC استفاده می کند, که دارای ویژگی های زیر می باشد:

1. 8-آدرس بیت و طول دستورالعمل 8 بیتی;

2. آدرس و فرمان دو بار ارسال می شود (برای اطمینان از قابلیت اطمینان);

3. مدولاسیون موقعیت پالس PWM, با چرخه وظیفه حامل مادون قرمز ارسالی نشان دهنده “0” وت “1”;

4. فرکانس حامل 38 کیلوهرتز است;

5. زمان بیت 1.125 میلی ثانیه یا 2.25 میلی ثانیه است;

در پروتکل NEC, چگونه داده های موجود در پروتکل را تنظیم کنیم ‘0’ یا "1"? اینجا, گیرنده مادون قرمز و فرستنده مادون قرمز از هم جدا شده اند.

فرستنده مادون قرمز: ارسال داده های پروتکل '0' = 560 us از انتقال سیگنال حامل + 560ما از هیچ انتقال سیگنال حامل

ارسال داده های پروتکل '1' = 560 us از انتقال سیگنال حامل + 1680ما از هیچ انتقال سیگنال حامل

تعریف بیت فرستنده مادون قرمز در شکل زیر نشان داده شده است

گیرنده مادون قرمز: داده های پروتکل "0" = 560 us سطح پایین را دریافت کنید + 560سطح بالا ما

داده های پروتکل "1" = سطح پایین 560 us را دریافت کنید + 1680سطح بالا ما

فرمت داده فرمان کنترل از راه دور NEC است: ترمینال همگام سازی, کد آدرس, کد معکوس آدرس, کد کنترل, کد معکوس را کنترل کنید. کد همگام سازی از یک سطح پایین 9 میلی ثانیه و یک سطح بالا 4.5 میلی ثانیه تشکیل شده است. کد آدرس, کد معکوس آدرس, کد کنترل, و کدهای معکوس کنترل همه فرمت های داده 8 بیتی هستند. آنها به ترتیب بیت اول کم و بیت آخر ارسال می شوند. کد معکوس برای افزایش قابلیت اطمینان انتقال استفاده می شود.

از این رو, ضبط ورودی می تواند برای اندازه گیری عرض پالس سطح بالا برای دستیابی به رمزگشایی کنترل از راه دور استفاده شود.
2) نمودار شماتیک و پیکربندی CUBEMAX

از نمودار شماتیک, می بینیم که ماژول بی سیم از طریق پین PB9 فعال شده و از طریق آن جمع می شود 4 کانال های TIM4:

پین پیش‌فرض TIM4_CH4 PB9 نیست, بنابراین باید به صورت دستی تنظیم شود, و تنظیم وقفه همزمان روشن می شود

3) بخش کد
لبه بالارونده را از طریق عملکرد برگشت به تماس tim ثبت کنید

در این زمان, سیگنال رمزگشایی شده را می توان به دست آورد:

در این زمان, داده ها پیچیده تر هستند و می توانند کمی پردازش شوند:

اثر به شرح زیر است:
دو رقم آخر رمزگشایی و کد معکوس آن است. در این زمان, می توان آن را به عنوان یک ماکرو برای تنظیم آستانه دما تعریف کرد:

اثر به شرح زیر است:

کد قطعه مادون قرمز:

/* سربرگ CODE BEGIN */
/**
******************************************************************************
* فایل @ : main.c
* @ مختصر : بدنه برنامه اصلی
******************************************************************************
* @توجه
*
* <h2><مرکز>&کپی کنید; حق چاپ (ج) 2024 STMicroelectronics.
* تمامی حقوق محفوظ است.</مرکز></h2>
*
* این مؤلفه نرم افزاری توسط ST تحت مجوز BSD 3-Clause مجوز دارد,
* را “مجوز”; شما نمی توانید از این فایل استفاده کنید مگر با رعایت موارد
* مجوز. شما می توانید یک کپی از مجوز را در:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* سربرگ کد کاربر پایان */
/* شامل می شود ——————————————————————*/
#شامل بودن “main.h”
#شامل بودن “زمان”
#شامل بودن “usart.h”
#شامل بودن “gpio.h”

/* خصوصی شامل ———————————————————-*/
/* USER CODE BEGIN شامل */
#شامل بودن “stdio.h”
#شامل بودن “رشته.h”
#MAXUP را تعریف کنید 157
#MAXDOWN را تعریف کنید 87
#MINUP را تعریف کنید 221
#MINDOWN را تعریف کنید 61
/* کد کاربر پایان شامل */

/* تایپ دف خصوصی ———————————————————–*/
/* کد کاربر BEGIN PTD */

/* کد کاربر پایان PTD */

/* تعریف خصوصی ————————————————————*/
/* کد کاربر BEGIN PD */
/* کد کاربر پایان PD */

/* ماکرو خصوصی ————————————————————-*/
/* کد کاربر شروع PM */

/* کد کاربر پایان PM */

/* متغیرهای خصوصی ———————————————————*/

/* کد کاربر BEGIN 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 */

/* نمونه های اولیه عملکرد خصوصی ———————————————–*/
باطل SystemClock_Config(باطل);
/* کد کاربر شروع PFP */

/* کد کاربر پایان PFP */

/* کد کاربری خصوصی ———————————————————*/
/* کد کاربر شروع 0 */
باطل HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
HAL_TIM_IC_CaptureCallback را باطل کنید(TIM_HandleTypeDef *htim)
{
اگر(isUpCapt)//اگر در حال افزایش است گرفتن لبه
{
ValueUp=HAL_TIM_ReadCapturedValue(هتیم هتیم,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(هتیم هتیم,TIM_CHANNEL_4، TIM_ICPOLARITY_FALLING);
upCount=0;
}
دیگر{
ValueDown=HAL_TIM_ReadCapturedValue(هتیم هتیم,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(هتیم هتیم,TIM_CHANNEL_4، TIM_ICPOLARITY_RISING);
width=ValueDown+upCount*65536-ValueUp;
اگر(عرض>4400&&عرض<4600)
{
bufferId=0;
بافر[bufferId++]=عرض;
}
دیگر اگر(bufferId>0)
{
بافر[bufferId++]=عرض;
اگر(bufferId>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
bitBuffer2num خالی(شماره کاراکتر[])
{
تعداد[0]=0;
تعداد[1]=0;
تعداد[2]=0;
تعداد[3]=0;
برای(int i=0;من<32;i++)
{
اگر(بافر[i+1]<1000)
{
تعداد[i/8]= تعداد[i/8]<<1;
}
دیگر
{
تعداد[i/8]= تعداد[i/8]<<1;
تعداد[i/8]|=0x01;
}
}
}
/* کد کاربر پایان 0 */

/**
* @brief نقطه ورود برنامه.
* @retval int
*/
int اصلی(باطل)
{
/* کد کاربر شروع 1 */
char printbuff[128]={0};
شماره کاراکتر[4]={0};
کلید کاراکتر = 0;
/* کد کاربر پایان 1 */

/* پیکربندی MCU——————————————————–*/

/* بازنشانی تمام تجهیزات جانبی, رابط Flash و Systick را راه اندازی می کند. */
HAL_Init();

/* کد کاربر BEGIN Init */

/* USER CODE END Init */

/* ساعت سیستم را پیکربندی کنید */
SystemClock_Config();

/* کد کاربر شروع SysInit */

/* کد کاربر پایان SysInit */

/* تمام تجهیزات جانبی پیکربندی شده را راه اندازی کنید */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* کد کاربر شروع 2 */

/* کد کاربر پایان 2 */

/* حلقه بی نهایت */
/* کد کاربر شروع می شود */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//به روز رسانی تایمر یک وقفه ایجاد می کند
HAL_TIM_IC_Start_IT(&htim4، TIM_CHANNEL_4);//
در حالی که (1)
{
اگر(rcvFalg)
{
برای(int i=0;من<4;i++)
{
bitBuffer2num(تعداد);
sprintf(چاپگر,”0xx “,تعداد[من]);
HAL_UART_Transmit(&huart1,printbuff,استرس(چاپگر),HAL_MAX_DELAY);
}
// sprintf(چاپگر,”%تو “,بافر[من]);
// HAL_UART_Transmit(&huart1,printbuff,استرس(چاپگر),HAL_MAX_DELAY);
// }
HAL_UART_Transmit(&هارت 1،”\rn”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
چاپی(“%drn”,تعداد[3]);
اگر(تعداد[3]==157)
{
چاپی(“111111\rn”);
}
HAL_تاخیر(1000);
/* کد کاربر به پایان می رسد */

/* کد کاربر شروع 3 */
}
/* کد کاربر پایان 3 */
}

/**
* @ مختصر پیکربندی ساعت سیستم
* @retval هیچکدام
*/
باطل SystemClock_Config(باطل)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};