مقارنة بين مستشعر درجة الحرارة PT100 التحقيق و وحدة DS18B20
1) المبدأ الأساسي لاكتساب الإشارة
① تتغير مقاومة PT100 بالتناسب مع درجة الحرارة (كلما ارتفعت درجة الحرارة, كلما زادت المقاومة), لكن تغيير المقاومة صغير جدًا, عن 0.385 أوه / درجة;
② نطاق قياس درجة الحرارة لـ PT100 هو -200 درجة مئوية -200 درجة مئوية, وعند 0 درجة مئوية, المقاومة تساوي بالضبط 100 أوه;
③ يجب أن يكون تيار العمل لـ PT100 أقل من 5 أماه;
④ على الرغم من أن مقاومة PT100 تتغير بشكل متناسب مع درجة الحرارة, معدل تغيرها (إنه, قيمة ك قيمة ك قيمة ك) يختلف في نطاقات درجات الحرارة المختلفة.
2) جدول تغيير مقاومة درجات الحرارة PT100
3. دائرة القيادة PT100
1) من خلال طريقة تقسيم الجهد, يجمع AD الجهد PT100 للحصول على قيمة المقاومة لحساب درجة الحرارة
قيمة المقاومة PT100 في الماء عند درجة حرارة الغرفة (25°25°C25°°) هو على وشك 109.89 أوه.
يقوم المتحكم الدقيق بإخراج جهد 3.3 فولت, والجهد مقسومًا على 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
في التجربة, وجد أنه بسبب الجهد 3.3 فولت غير المستقر لمصدر الطاقة stm32, قام ADC بتجميع تقلبات الجهد PT100 وكان خطأ تقسيم الجهد كبيرًا. الحل الأمثل هو تصميم دائرة مصدر تيار مستمر. عن طريق جمع جهد PT100 وتيار مصدر التيار الثابت, يمكن الحصول على مقاومة PT100, ومن ثم يمكن الحصول على قيمة درجة الحرارة.
2) دائرة مصدر تيار مستمر تعتمد على منظم LDO (MD5333)
هناك العديد من دوائر القيادة لاختبار PT100 على الإنترنت, مثل دائرة الجسر DC, دائرة مصدر تيار مستمر تعتمد على مضخم تشغيلي, إلخ. أمضى المؤلف أيضًا الكثير من الوقت في اختيار حلبة القيادة, مع الأخذ في الاعتبار صعوبة صنع اللوحة وعدد مكوناتها, وأخيراً اختار دائرة مصدر التيار المستمر بناءً على منظم LDO (MD5333). مخطط الدائرة على النحو التالي:
عند هذه النقطة, تم الانتهاء من اختيار الأجهزة بشكل أساسي. لوحة التطوير المستخدمة هي Zhengdian Atom F10ZET6 Elite Board
وحدة DS18B20
من أجل اختبار درجة الحرارة في الوقت الحقيقي ومقارنة درجة الحرارة PT100, تتم إضافة وحدة DS18B20 لاختبار مقارنة المعايرة
1) مقدمة إلى DS18B20
DS18B20 عبارة عن مستشعر درجة حرارة أحادي الناقل مع نطاق درجة حرارة اختبار يتراوح من -55 إلى +125 درجة مئوية ودقة تبلغ ± 0.5 درجة مئوية. يتم نقل درجة حرارة المجال مباشرة بطريقة رقمية أحادية الناقل, مما يحسن بشكل كبير قدرة النظام على مقاومة التدخل. يمكنه قراءة درجة الحرارة المقاسة مباشرة, ويمكن تحقيق طريقة قراءة القيمة الرقمية 9 ~ 12 بت من خلال البرمجة البسيطة وفقًا للمتطلبات الفعلية. نطاق جهد التشغيل هو 3 ~ 5.5 فولت, ويستخدم مجموعة متنوعة من أشكال التعبئة والتغليف, مما يجعل إعداد النظام مرنًا ومريحًا. يتم تخزين الدقة المحددة ودرجة حرارة التنبيه التي حددها المستخدم في 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 على الأقل. يجب على المضيف تحرير الناقل أثناء توقيت القراءة وأخذ عينة من حالة الناقل خلال 15 ثانية بعد بدء التوقيت. عملية توقيت القراءة النموذجية هي: يقوم المضيف بإخراج تأخير منخفض المستوى قدره 2us, ثم يتحول المضيف إلى تأخير وضع الإدخال بمقدار 12us, ثم يقرأ المستوى الحالي للحافلة الواحدة, ثم يؤخر 50us.
بعد فهم توقيت الحافلة الواحدة, دعونا نلقي نظرة على عملية قراءة درجة الحرارة النموذجية لـ DS18B20. عملية قراءة درجة الحرارة النموذجية لـ DS18B20 هي: إعادة تعيين → إرسال سكيبروم (0XCC) → إرسال أمر بدء التحويل (0x44) → تأخير → إعادة تعيين → إرسال أمر SKIPROM (0XCC) → إرسال أمر الذاكرة (0xbe) → قراءة بايتين من البيانات (أي. درجة حرارة) بشكل مستمر → النهاية.
3) رسم تخطيطي وتكوين CUBEMAX
من الرسم التخطيطي, يمكن ملاحظة أن DS18B20 ممكّن بواسطة منفذ PG11 لفتح المنفذ التسلسلي لطباعة معلومات درجة الحرارة
4) جزء الكود
يقوم جزء الكود بنقل مكتبة ds18b20 الخاصة بـ Zhengdian Atom وإجراء تعديلات طفيفة
#ifndef __DS18B20_H
#تعريف __DS18B20_H
#يشمل “تيم.ح”
/***********************************************************************************/
/* DS18B20 تعريف PIN */
#تعريف DS18B20_DQ_GPIO_PORT GPIOG
#حدد DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#تعريف DS18B20_DQ_GPIO_CLK_ENABLE() يفعل{ __HAL_RCC_GPIOG_CLK_ENABLE(); }بينما(0) /* تمكين ساعة منفذ PG */
/**********************************************************************************************/
/* وظيفة تشغيل الإدخال والإخراج */
#تعريف DS18B20_DQ_OUT(س) يفعل{ س ? \
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 الخاص بشركة Philips PPM (تعديل موضع النبض). يستخدم جهاز التحكم عن بعد الذي يأتي مع لوحة التطوير بروتوكول NEC, الذي لديه الميزات التالية:
1. 8-عنوان البت وطول التعليمات 8 بت;
2. يتم إرسال العنوان والأمر مرتين (لضمان الموثوقية);
3. تعديل موضع النبض PWM, مع دورة العمل لموجة الأشعة تحت الحمراء المرسلة التي تمثل “0” و “1”;
4. تردد الناقل هو 38 كيلو هرتز;
5. وقت البت هو 1.125 مللي ثانية أو 2.25 مللي ثانية;
في بروتوكول NEC, كيفية ضبط البيانات في البروتوكول ل ‘0’ أو "1"? هنا, يتم فصل جهاز استقبال الأشعة تحت الحمراء وجهاز إرسال الأشعة تحت الحمراء.
جهاز إرسال الأشعة تحت الحمراء: إرسال بيانات البروتوكول '0' = 560us من إرسال إشارة الناقل + 560لنا أي نقل إشارة الناقل
إرسال بيانات البروتوكول "1" = 560us من إرسال إشارة الناقل + 1680لنا أي نقل إشارة الناقل
يظهر تعريف البت لمرسل الأشعة تحت الحمراء في الشكل أدناه
استقبال الأشعة تحت الحمراء: تلقي بيانات البروتوكول '0' = مستوى منخفض 560us + 560لنا مستوى عال
تلقي بيانات البروتوكول '1' = مستوى منخفض 560us + 1680لنا مستوى عال
تنسيق البيانات لأمر التحكم عن بعد لشركة NEC هو: محطة المزامنة, رمز العنوان, عنوان رمز معكوس, رمز التحكم, التحكم في الكود العكسي. يتكون رمز المزامنة من مستوى منخفض يبلغ 9 مللي ثانية ومستوى مرتفع يبلغ 4.5 مللي ثانية. رمز العنوان, عنوان رمز معكوس, رمز التحكم, والرمز العكسي للتحكم كلها تنسيقات بيانات 8 بت. يتم إرسالها بترتيب البت المنخفض أولاً والبت العالي أخيرًا. يتم استخدام الرمز العكسي لزيادة موثوقية الإرسال.
لذلك, يمكن استخدام التقاط الإدخال لقياس عرض النبض للمستوى العالي لتحقيق فك تشفير التحكم عن بعد.
2) رسم تخطيطي وتكوين CUBEMAX
من الرسم التخطيطي, يمكننا أن نرى أن الوحدة اللاسلكية ممكّنة من خلال دبوس PB9 ويتم تجميعها من خلال 4 قنوات TIM4:
الدبوس الافتراضي لـ TIM4_CH4 ليس PB9, لذلك يجب ضبطه يدويًا, ويتم تشغيل إعداد المقاطعة في نفس الوقت
3) جزء الكود
التقط الحافة الصاعدة من خلال وظيفة رد الاتصال tim
في هذا الوقت, يمكن الحصول على الإشارة التي تم فك تشفيرها:
في هذا الوقت, البيانات أكثر تعقيدًا ويمكن معالجتها قليلاً:
التأثير على النحو التالي:
آخر رقمين هما الرقم الذي تم فك شفرته والرمز العكسي له. في هذا الوقت, يمكن تعريفه على أنه ماكرو لضبط عتبة درجة الحرارة:
التأثير على النحو التالي:
رمز جزء الأشعة تحت الحمراء:
/* رمز المستخدم يبدأ الرأس */
/**
******************************************************************************
* @ملف : main.c
* @مختصر : جسم البرنامج الرئيسي
******************************************************************************
* @انتباه
*
* <h2><مركز>&ينسخ; حقوق الطبع والنشر (ج) 2024 إس تي مايكروإلكترونيكس.
* جميع الحقوق محفوظة.</مركز></h2>
*
* تم ترخيص مكون البرنامج هذا بواسطة ST بموجب ترخيص BSD 3-Clause,
* ال “رخصة”; لا يجوز لك استخدام هذا الملف إلا وفقًا لـ
* رخصة. يمكنك الحصول على نسخة من الترخيص على:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* رأس نهاية رمز المستخدم */
/* يشمل ——————————————————————*/
#يشمل “main.h”
#يشمل “تيم.ح”
#يشمل “USART.H”
#يشمل “gpio.h”
/* خاص يشمل ———————————————————-*/
/* يتضمن رمز المستخدم البدء */
#يشمل “stdio.h”
#يشمل “سلسلة. ح”
#تعريف MAXUP 157
#تعريف MAXDOWN 87
#تعريف MINUP 221
#تعريف MINDOWN 61
/* نهاية رمز المستخدم تتضمن */
/* تعريف الكتابة الخاص ———————————————————–*/
/* رمز المستخدم يبدأ PTD */
/* نهاية رمز المستخدم PTD */
/* تعريف خاص ————————————————————*/
/* رمز المستخدم يبدأ PD */
/* رمز المستخدم نهاية PD */
/* ماكرو خاص ————————————————————-*/
/* رمز المستخدم يبدأ مساءً */
/* رمز المستخدم نهاية مساء */
/* المتغيرات الخاصة ———————————————————*/
/* رمز المستخدم يبدأ 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 معرف المخزن المؤقت = 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)
{
لو(com.isUpCapt)//إذا كان التقاط الحافة الصاعدة
{
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);
width=ValueDown+upCount*65536-ValueUp;
لو(عرض>4400&&عرض<4600)
{
معرف المخزن المؤقت = 0;
عازلة[معرف المخزن المؤقت++]=width;
}
وإلا إذا(معرف المخزن المؤقت>0)
{
عازلة[معرف المخزن المؤقت++]=width;
لو(معرف المخزن المؤقت>32)
{
rcvFalg=1;
معرف المخزن المؤقت = 0;
}
}
}
}
بت باطلةBuffer2num(رقم الحرف[])
{
رقم[0]=0;
رقم[1]=0;
رقم[2]=0;
رقم[3]=0;
ل(كثافة العمليات ط = 0;أنا<32;أنا ++)
{
لو(عازلة[أنا+1]<1000)
{
رقم[ط/8]=num[ط/8]<<1;
}
آخر
{
رقم[ط/8]=num[ط/8]<<1;
رقم[ط/8]|=0x01;
}
}
}
/* نهاية رمز المستخدم 0 */
/**
* @brief نقطة دخول التطبيق.
* @retval كثافة العمليات
*/
int main(فارغ)
{
/* يبدأ رمز المستخدم 1 */
حرف printbuff[128]={0};
رقم الحرف[4]={0};
مفتاح شار=0;
/* نهاية رمز المستخدم 1 */
/* تكوين MCU——————————————————–*/
/* إعادة ضبط كافة الأجهزة الطرفية, تهيئة واجهة Flash وSystick. */
HAL_Init();
/* رمز المستخدم يبدأ 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)
{
لو(com.rcvFalg)
{
ل(كثافة العمليات ط = 0;أنا<4;أنا ++)
{
bitBuffer2num(رقم);
sprintf(printbuff,”0سx “,رقم[أنا]);
HAL_UART_Transmit(&huart1,printbuff,سترين(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%ش “,عازلة[أنا]);
// HAL_UART_Transmit(&huart1,printbuff,سترين(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_Transmit(&هوارت 1,”\ص ن”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%دrn”,رقم[3]);
لو(رقم[3]==157)
{
printf(“111111\ص ن”);
}
HAL_تأخير(1000);
/* رمز المستخدم ينتهي أثناء */
/* يبدأ رمز المستخدم 3 */
}
/* نهاية رمز المستخدم 3 */
}
/**
* @ تكوين ساعة النظام وجيزة
* @retval لا شيء
*/
باطلة SystemClock_Config(فارغ)
{
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









