التجربة الخامسه :- مقياس درجة حرارة رقمى باستخدام حساس درجة الحرارة LM35


الوصف(Description):-
مقياس الحرارة الرقمي هو اختيار جيد كمشروع للدخول إلى عالم الميكروكنترولر لأنه يوفر فرصة للتعرف على استخدام أجهزة الاستشعار لقياس اشارات العالم الحقيقى التناظرية .



يعتمد هذا المشروع على الميكروكونترولر PIC16F88 وحساس درحة الحرارة من النوع LM35 . الحساس LM35  هو حساس تناظرى يقوم بتحويل درجة الحرارة المحيطة به إلى جهد تناظرى . يوصل خرج الحساس إلى أحد المداخل التناظرية للميكروكونترولر لاستخلاص قيمة معادلة لدرجة الحرارة في الشكل الرقمي. يتم عرض درجة الحرارة المحسوبة على شاشة وحدة عرض LCD من النوع 16X2  أى سطرين بكل سطر 16حرف في شكل مقياس مئوى°C ومقياس فهرنيت°F .

المعلومات النظرية المطلوبة  ( Required Theory)
يجب اولا معرفه كيفيه استخدم المحول التناظري للميكرو ثم معرفه مواصفات مقياس الحراره lm35
اولا :- استخدام المحول التناظري للميكرو 16F88
التحويل من تناظرى لرقمى ADC ضرورى لأن الأنظمة التى تضم الميكروكونترولر تتناول القيم الرقمية بينما البيئة المحيطة الحقيقية عبارة عن إشارات تناظرية مثل درجة الحرارة والسرعة والضغط  وخرج الميكروفون ...ألخ . كل هذه الإشارات تحتاج للتحويل إلى بيانات رقمية قبل علاجها بالميكروكونترولر .
سوف نتناول طريقة قراءة إشارة تناظرية خارجية باستخدام الميكروكونترولر PIC16F88 وعرض نتيجة (خرج) التحويل (عدد رقمى ) على وحدة عرض LCD . إشارة الدخل التناظرى سوف تكون مقياس الحراره lm35
لمعرفه كيفيه استخدام المحول التناظري للميكر نفتح الداتا شيت للميكر ونقو بأختيار (ANALOG-TO-DIGITAL) من فهرس الميكرو فتظهر هذه الصور
يمكن تلخيص الصفحه الاولي الخاصه بالمحول التناظري فيما يلي
  • يولد المحول نتيجة ثنائية ذات عشر خانات 10-bit باستخدام طريقة التقريب المتتابع ,ويخزن نتائج التحويل فى السجلات  :" ADRESL "نتيجة التحويل المنخفضة" و ADRESH ""  نتيجة التحويل المرتفعة" .
  • يوجد 8 مدخل تناظرى مستقلة بالميكروكونترولر PIC16F88 . (RA0, RA1, RA2, RA3, RA4, RA5, RA6, and RA7)
  • يقوم المحول بتحويل إشارة الدخل التناظرية إلى عدد ثنائى مكون من 10 خانات .
  • أقصى دقة resolution أو كفاءة تحويل يمكن ضبطها عن طريق اختيار الجهد المرجعى السالب Vref- والجهد المرجعى الموجب Vref+ .
عمل المحول A/D  يكون تحت سيطرة خانات أربع سجلات :
v     السجل ADRESH  الذى يحتوى على البايت العلوى لنتيجة التحويل.
v     السجل ADRESL  الذى يحتوى على البايت السفلى لنتيجة التحويل .
v     السجل ADCON0  وهو سجل التحكم رقم 0
v     السجل ADCON1  وهو سجل التحكم رقم 1

يوجد معلومتين هامتين التي يجب اخذهما في  الاعتبار قبل الخوض في السجلات التي تمكنا من استخدام المحول التناظري للميكرو
   المعلومه الاولي متطلبات تحصيل (اكتساب) ACQUISITION المحول A/D
 من أجل تمكين المحولADCمن تلبية دقة محددة فإنه من الضروري توفير فترة تأخير زمنى معين بين اختيار مدخل تناظرى محدد و عملية القياس نفسها. هذا الزمن يسمى "زمن التحصيل أو الاكتساب Acquisition Timeوهو يعتمد أساسا على مقاومة المصدر.او بمعني اخر هو الوقت الازم لشحن مكثف المحول التناظري اي هو الوقت الذي يستغرقه المحول لكي يعمل هناك معادلة تستخدم لحساب هذا الزمن بدقة، وهو في أسوأ الأحوال يكون 20 ميكروثانية( ( 20µS تقريبا . لذلك ، إذا كنت ترغب في أن يكون التحويل دقيق لا ننسى هذا التفصيل المهم
 ADC   المعلومه الثانية الزمن الدورى لنبضات الساعة للمحول
يعرف الزمن اللازم لإتمام عملية تحويل لخانة واحدة باسمTAD ومطلوب أن لا يقل عن1,6 µS . ولا يزيد عن µS 6.4زمن التحويل التام من تناظرى لرقمى ونظرا لأن كلا من تردد الساعة وتردد مصدر التحويل من تناظرى لرقمى يتم تحديده برمجيا فمن الضروري اختيار أحد المجموعات المتاحة من الخانات ADCS1  و ADCS0  و ADCS2قبل بدأ قياس
الجهد للمداخل التناظرية . هذه الخانات مخزنة فى السجل ADCON0 و ADCON1
مثلا في هذه التجربه نستخدم كرستاله بتردد 4 ميجا وحيث اننا يجب الا يقل الزمن الازم للتحويل عن 1.6 ميكرو ثانيه اذا نجرب اولا ان نقسم هذا التردد علي 2 وهو الاقتراح الاول في الجدول السابق سوف ينتج 2 هذا الرقم يعتبر هو التردد الذي سوف نحصل منه علي الزمن وذلك من خلال القانون التالي
T=1/f=1/2=0.5 µS
اذا لا يصلح الاختيار الاول لان الناتج اقل من 1.6 ميكرو ثانيه نأخذ ثاني اقتراح (Tosc4)كما يلي
F=4/4=1
T=1/f=1/1 =1 µS
ايضا لا يصلح هذا الاقتراح نأخذ الاقتراح الثالث(8Tosc)
F=4/8=0.5
T=1/f=1/0.5= 2 µS

اذا  هذا الاقتراح هو الاقتراح المناسب فنضبط البتات ADCS1  و ADCS0  و ADCS2 في كلا من السجلات ADCON0 و ADCON1 كما هو موضح بالجدول
من أجل تمكين المحولA/Dمن العمل بدون مشاكل وكذلك لتجنب النتائج الغير متوقعة ، فمن الضروري النظر في ما يلي
المحول A/D لا يفرق بين الإشارات الرقمية والتناظرية. من أجل تفادي الأخطاء في القياس أو تلف الشريحة ، يجب تهيئة الأطراف كمداخل تناظرية قبل بدء عملية التحويل.الخانات المستخدمة لهذا الغرض تخزن (تحفظ) في السجلات TRIS و ANSEL (ANSELH) .
بشكل عام يمكن القول أن قياس الجهد فى المحول ويستند على مقارنة جهد الدخل مع مقياس أو مدى scale داخلى يحتوى على 1024 قسم أو علامة mark (عشر خانات أى( 2 أس عشرة تساوى 1024) أدنى علامة فى هذا التدريج تناظر جهد المرجع السالب Vref- ، بينما أعلى علامة تناظر جهد المرجع الموجب Vref+ .
الشكل التالى يبين جهود المراجع القابلة للاختيار فضلا عن قيم الحد الأدنى والحد الأقصى .
السجل  ADRESH والسجل ADRESL
النتيجة التي نحصل عليها بعد تحويل القيمة التناظرية إلى قيمة رقمية هى عدد مكون من 10 خانات(10-bit)والتى يمكن تخزينها في السجلات ADRESH وADRESL
يوجد طريقتان لمعالجة النتيجة وهما "المحازاة جهة اليسار " و " المحازاة جهة اليمين " والتى تبسط استخدامها إلى حد كبير. شكل نتيجة التحويل ويتم تحديد طريقه المحاذاه عن طريق الخانة ADFM  من السجل ADCON0 امافي حالة عدم استخدام المحول A/D يمكن استخدام هذه السجلات كسجلات للأغراض العامة.
السجل ADCON0
الخانة(CHS0-CHS2)
عن طريق هذا الخانات سوف يتم تحديد الاطراف التي نستخدمها  كدخل للأشاره التناظرية مع العلم اننا هنا لا يمكننا ان نستخدم الإ طرف واحد فقط كدخل للأشاره التناظرية علي سبيل المثال أذا اردنا ان نجعل الاشاره التناظريه علي الطرف(AN2 (RA2) فسوف نضع واحد في البت (CHS1) ونضع (0) في كلا من البت (CHS0 and CHS2)
الخانه (GO/DONE)
خانة "حالة التحول بالمحول A/D "  وهى تبين الحالة الحالية للتحويل حيث عندما تكون هذه الخانه بواحد (1)فهذا يعني التحويل بالمحول A/D فى تقدم in progress .   اما الخانة 0) ) تعنى أن التحويل قد تم أو اكتمل complete .
الخانة (ADON)
فهو المسئول عن تفعيل المحول التناظري او إلغائه حيث بوضع واحد يتم تفعيل المحول A/D وبوضع صفر يتم إلغائه
الخانة(ADCS1-ADCS0)
هي المسئوله عن تحديد Acquisition Time كما موضح بالداتا شيت  علي سبيل المثال اذا كنا نستخدم تردد ساعه 4 ميجا  وتم اختيار (Fosc/8) سوف يتم وضع واحدفي الخانه ADCS0  ووضع (صفر) في  الخانه (ADCS1) سوف يكون الوقت الازم ليعمل المحول التناظر هو 2ميكرو ثانيه كماهو موضح بالجدول التالي
السجل ADCON1
الخانة ADFM) :)
خانة "اختيار شكل نتيجة المحول A/D
قيمة الخانة 1)  )  تعنى محازات نتيجة التحويل لجة اليمين . لذلك فأن الست خانات العليا للسجل  ADRESH تكون غير مستخدمة .
قيمة الخانة 0 )   )تعنى محازاة نتيجة التحويل جهة اليسار . لذلك فإن الست خانات الأقل قيمة فى السجل  ADRESL تكون غير مستخدمة .
الخانة VCFG<1:0>) :)
خانات تحديد اطراف الجهد المرجعي حيث يتغير علي حسب المشروع المنفذ فمثلا في هذا المشروع سوف نيكون جهد المرجع صفر والجهد الموجبVREF+اي اننا سوف نستخدم الاختيار الثالث بالجدول
 السجلANSEL
باختصار :
لقياس جهد على مدخل طرف باستخدام المحولA/Dيجب فعل الآتى :
الخطوة الأولى : تهيئة (إعداد) المنفذ :
·         اكتب المنطق واحد (1) فى خانة من السجل TRIS وذلك لإعداد الطرف المقابل كمدخل .
·         اكتب المنطق واحد (1) فى خانة بالسجل ANSEL وذلك لإعداد الطرف المقابل كمدخل تناظرى .
الخطوة الثانية : تهيئة (إعداد) موديول المحول ADC :
·         إعداد جهد المرجع من السجل ADCON1.
·         اختيار نبضات الساعة للمحول ADC من السجل ADCON0 . و ADCON1
·         اختيار أحد قنوات الدخل AN0-AN6 من السجل ADCON0 .
·         اختيار شكل البيانات باستخدام الخانة ADFM من السجل ADCON1 .
·         تمكين المحولA/Dمن العمل بتحديد الخانة ADON من السجل ADCON0 .
الحساسLM35لا يحتاج إلى أى معايرة خارجية وجهد خرجه يتناسب مع درجة الحرارة . عامل مقياس scale factor  التحويل من درجة حرارة إلى جهد هو 10 mV per °C  "10 ملى فولت لكل درجة مئوية" .توجد عدة أشكال من الحساس LM35 كما فى الشكل .
قياس درجة الحرارة السالبة الأقل من الصفر يحتاج لمصدر جهد سالب وهذا المشروع يتناول فقط قياس درجة الحرارة الموجبة من الصفر وحتى 100 درجة مئوية . ويتم تحويل جهد خرج الحساس إلى عدد رقمى مكون من 10 خانات باستخدام المحول ADC الداخلى بالميكروكونترولر .وحيث أن الجهد المراد قياسه بواسطة المحول ADC يكون فى المدى من صفر إلى واحد فولت (والمناظر لدرجة حرارة من صفر حتى 100 درجة مئوية لأن كل درجة مئوية تعطى خرج قدره 10 ملى فولت) فأن المحول ADC يحتاج إلى جهد مرجع منخفض (بدلا من جهد المنبع Vdd= 5V ) للتحويل من تناظرى لرقمى وذلك للحصول على دقة قياس أفضل . يمكن الحصول على جهد المرجع المنخفض باستخدام زنر دايود ومقاومات أو يمكن استخدام دايودات فقط . يمكنك الحصول على جهد مرجع قدره 1.2V بتوصيل دايودان ومقاومة على التوالى بين طرفى مصدر الجهد كما فى الشكل التالى .
بالقياس العملى للجهد عبر الدايودان وجد   1.196 V وقياسه عمليا هام للحصول على نتائج دقيقة . كما يمكنك استخدام مقاومة 1K بدلا من المقاومة 3.6K
نحتاج لبعض العمليات الرياضية للتحويل من تناظرى لرقمى :
جهد المرجع 1.196 V والمحول ADC بسعة 10-bit ، لذلك فإن أى جهد دخل فى المدى بين  0الي1.196V سوف يتم تحويله إلى عدد رقمى فى المدى بين 0 الي 1023 .وتكون دقة التحويل  ( خارج قسمة المدى الكامل للجهد على المدى الكامل لكود عدد التحويل ليعطى الجهد لكل قسم )
  1.196/1024 = 0.001168 V/Count
لذلك يكون العدد الرقمى N للخرج المناظر لأى جهد دخل Vin  هو
 N = Vin/0.001168
مثال :
نفترض أن درجة الحرارة المحيطة هى 26.4 °C . يكون جهد خرج الحساس 264 mV (0.264 V):  .(لان خرج الحساس 10ملي فولت لكل درجه مئويه)
ويكون كود العدد لخرج المحول ADC :
 0.264/0.001168 = 226
إذا عكسنا العملية : أى أن كان لدينا فى خرج المحول ADC عدد رقمى قدره 226 يمكننا العودة للخلف بتحويله إلى جهد الدخل بضربه فى الدقة ثم نحول هذا الجهد إلى درجة الحرارة بالقسمة على عامل قياس الحساس وهو  (10 mV/°C) كما يلى :
= 226 * 0.001168 (V/Count )=0.263968  V   جهد خرج حساس الحراره
Temperature= v/10mv=0.263968/10/1000=0.263968*1000/10=26.3°
اي الحراره تساوي جهد خرج الحساس علي 10ملي فولت حيث ان الحساس يخرج 10ملي فولت لكل درجه مئويه
لتجنب استخدام الأعداد الحقيقية التى تحتوى على علامة عشرية متحركة والتى تسمى floating فقط نستخدم عملية ضرب كما يلى (الدقة كعدد صحيح) :
temperature = 226 * 1168  = 263968
عند عرض النتيجة نحتاج لوضع علامة عشرية فى المكان الرابع من اليسار .لذلك تكون درجة الحرارة المحسوبة 26.3968°C والتى هى قريبة بالفعل من الفعلية .
فى هذا المشروع سوف يتم عرض درجة الحرارة بدقة كسر عشرى واحد أى نقوم بقسمة العدد العلوى على 1000 لنحصل على 263 ويتم بيان درجة الحرارة بالشكل 26.3 °C .
بعد اشتقاق درجة الحرارة بالدرجات المئوية يمكنك تحويلها إلى الفهرنيت باستخدام المعادلة البسيطة التالية :
temperature in °F = 9 x temperature in °C /5 + 32
فى هذه الحالة يتم ضرب درجة الحرارة المئوية فى 10 فتتحول 26.3 إلى263 (للتخلص من العلامة العشرية ) ويمكنك استخدام العلاقة :
temperature in °F = 9 x temperature in °C /5 + 320
وحيث إن العدد الذى يمثل درجة الحرارة المئوية قد لا يقبل القسمة على 5 بالضبط ( العدد 263 لا يقبل القسمة على 5 ( يمكنك مرة أخرى التخلص من العلامة العشرية بالضرب مرة أخرى فى 10 وتصبح المعادلة الجديدة :
temperature in °F = 9 x temperature in °C x 10 /5 + 3200
or
temperature in °F = 18 x temperature in °C  + 3200 = 18 x 263+3200 = 7934
أى أن 79.34 °F تكافىء 26.3 °C
فى هذه التجربه سوف يتم عرض النتيحة بالشكل79.3 °F
الدائره الكهربيه
عند التوصيل العملي يتم توصيل الجهد 1.2فولت عن طريق الموحدين والمقاومه كما تم رسمهم فيما سبق
البرنامج (Software)
 sbit LCD_RS at Rb4_bit;
 sbit LCD_EN at Rb5_bit;
 sbit LCD_D4 at Rb0_bit;
 sbit LCD_D5 at Rb1_bit;
 sbit LCD_D6 at Rb2_bit;
 sbit LCD_D7 at Rb3_bit;
 sbit LCD_RS_Direction at TRISb4_bit;
 sbit LCD_EN_Direction at TRISb5_bit;
 sbit LCD_D4_Direction at TRISb0_bit;
 sbit LCD_D5_Direction at TRISb1_bit;
 sbit LCD_D6_Direction at TRISb2_bit;
 sbit LCD_D7_Direction at TRISb3_bit;
char message1[] = "Room Temperature";
char *tempC = "000.0";
char *tempF = "000.0";
unsigned int tempinF, tempinC;
unsigned long temp_value;
 void Display_Temperature() {
 if (tempinC/10000)
tempC[0] = tempinC/10000  + 48;
 else tempC[0] = ' ';
 tempC[1] = (tempinC/1000)%10 + 48;
 // convert temp_fraction to characters
 tempC[4] =  (tempinC/10)%10 + 48;
 // print temperature on LCD
 Lcd_Out(2, 1, tempC);
 if (tempinF/10000)
  tempF[0] = tempinF/10000  + 48;
 else tempF[0] = ' ';
 tempF[1] = (tempinF/1000)%10 + 48;             // Extract tens digit
 tempF[2] =  (tempinF/100)%10 + 48;
 tempF[4] =  (tempinF/10)%10  + 48;
 Lcd_Out(2, 11, tempF);
}
 void main() {
 ANSEL = 0b00001111;
 ADCON0 = 0b01000001;
 ADCON1 = 0b10100000;
  TRISb = 0b00000000;
  TRISA = 0b11111111;
  Lcd_Init();
 Lcd_Cmd(_LCD_CLEAR);
 Lcd_Cmd(_LCD_CURSOR_OFF);
 Lcd_Out(1,1,message1);
 Lcd_Chr(2,6,223);
 Lcd_Chr(2,15,223);
 Lcd_Chr(2,7,'C');
 Lcd_Chr(2,16,'F');
 do {
     temp_value = ADC_Read(0);
  temp_value = temp_value*1168;
  tempinC = temp_value/1000;
  tempinC = tempinC*10;
  tempinF = 9*tempinC/5 + 3200;
  Display_Temperature();
  Delay_ms(1000);
 } while(1);
}
شرح البرنامج

char message1[] = "Room Temperature";
الرسالة message1 مصفوفة حروف فى صف واحد وهى النص Room Temperature
char *tempC = "000.0";
char *tempF = "000.0";
الأشارة إلى سجل المتغير الذى سوف يتم فيه حفظ قيمة درجة الحرارة بالدرجات المئوية على شكل نص للعرض على الشاشة على شكل نص ذو 4 حروف بالصيغة "000.0"
الأشارة إلى سجل المتغير الذى سوف يتم فيه حفظ قيمة درجة الحرارة بالدرجات الفهرنهيت على شكل نص للعرض على الشاشة
unsigned int tempinF, tempinC;
unsigned long temp_value;
 متغيرات حفظ قيم درجات الحرارة فى المراحل المختلفة للمعالجة
 void Display_Temperature() {

فى البداية إنشاء دالة "عرض درجة الحرارة " بغرض تسهيل عملية فهم ومتابعة البرنامج فى الدالة الرئيسية وفيها :

if (tempinC/10000)
 tempC[0] = tempinC/10000  + 48;
ا اختبار وجود رقم صحيح فى الرقم (الخانة) الأول من اليسار أو الخامس من اليمين بالقسمة على 10000 وفى حالة وجود مثل هذا ا لرقم أى تحقق شرط if يتم الحصول عليه وتحويله إلى كود أسكى بإضافة العدد 48 إليه  ونسخ النتيجة إلى العنصر    رقم 0 بالمصفوفة النصية للعرض 


else tempC[0] = ' ';
  وأن لم يوجد مثل هذا الرقم فيوضع مكانه مكان فارغ فى العنصر رقم 0 فى المصفوفة النصية tempC[0]

tempC[1] = (tempinC/1000)%10 + 48;
الحصول على خانة العشرات : (القسمة على 1000 وايجاد باقى قسمة الناتح على 10 ) ثم تحويل النتيجة إلى كود أسكى بإضافة العدد 48 ونسخ النتيجة إلى العنصر رقم 1 بالمصفوفة النصية للعرض tempC[1]  . 
tempC[2] =  (tempinC/100)%10 + 48
    نكرر للحصول على خانة الآحاد  ( العنصر tempC[2] )

  لاحظ أن العنصرtempC[3] متروك لنقطة العلامة العشرية كما فى التعريف
tempC[4] =  (tempinC/10)%10 + 48
  نكرر للحصول على الكسر العشرى

;(Lcd_Out(2, 1, tempC
إ   رسال (عرض ) درجة الحرارة المئوية بدءا من الصف الثانى والعامود الأول

 تكرار الخطوات السابقة لدرجات الحرارة بالفهرنهيت
ADCON0 = 01000001 ;
   توصيل الطرف  RA0/AN0 كمدخل تناظرى ليعمل مع موديول المحول ADC وتمكين المحول من خلال البت الاول واختيار     8Tosc للحصول علي الزمن المناسب لاتمام عمليه التحويل للمحول التناظري بنجاح 
ADCON1 = 0b10100000;
"  اختيار شكل المحاذاه لنتيجة المحول A/D " (Right)   وايضا اختيار جهد مرجعي VREF+ مع الارضي

Lcd_Out(1,1,message1);
  عرض الرسالة message1 بدءا من السطر الأول والعامود الأول وتنص على Room Temperature "درجة حرارة الغرفة أو المحيط"
Lcd_Chr(2,6,223);
 Lcd_Chr(2,15,223);
  كتابة رمز درجة الحرارة  بدءا من السطر الثانى والعامود السادس (المئوية)وفى السطر الثانى والعامود الخامس عشر (الفهرنيت)  مع ملاحظه انه يوجد اختلاف بين الرقم المعبر عن هذا الرمز وهو 223 حيث اذا بحثنا عليه في الميكرو سي سوف نجده 178 ولكن الصحيح هو 223
Lcd_Chr(2,7,'C');
 Lcd_Chr(2,16,'F');
   كتابة الحرف C فى السطر الثانى والعامود السابع أى بعد رمزها وحرف F فى السطر الثانى والعامود السداس عشر أى بعد    رمزها .
  temp_value = ADC_Read(0);
  قراءة القيمة التناظرية من المدخل RA0/AN0 وتحويله إلى عدد رقمى ونسخ هذه النتيجة لسجل المتغير temp_value .
temp_value = temp_value*1168;
  ثم الضرب فى المعامل 1168 (كما تم ذكره بأعلى) ونسج النتيجة إلى المتغير temp_value
tempinC = temp_value/1000;
 القسمة على 1000 ونسخ النتيجة لسجل المتغير  tempinC
tempinC = tempinC*10;
  الضرب فى 10 ونسخ النتيجة لسجل المتغير  tempinC
tempinF = 9*tempinC/5 + 3200;
 التحويل من مئوى إلى فهرنيت
Display_Temperature();
أ خيرا استدعاء دالة عرض درحة الحرارة التى سبق إنشاءها فى البداية والتأخير لزمن قدره 1 ثانية للسماح للمحول A/D من أخذ  عينة جديدة ومعالجتها وتحديث النتائج وعرضها .
أختبار البرنامج علي Proteus


فيديو التجربه

هناك 3 تعليقات :

  1. شكرا معلومات في قمة

    ردحذف
  2. ميزان حساس الكترونى فى فاترينا دوت كوم دليل عام واكبر محرك بحث محلى فى مصر
    https://www.vatrena.com/k/2149


    ميزان معمل حساس تجدة فى فاترينا دوت كوم دليل عام واكبر محرك بحث محلى فى مصر
    https://www.vatrena.com/k/2150

    ردحذف