قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-04-2011, 02:25 AM المشاركة 33   
افتراضي



التعليق على البرنامج :

/* Project: Digital Voltmeter based on PIC16F877
Oscillator * 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF
*/

1- تعريف أطراف توصيل الميكروكونترولر بوحدة العرض LCD
// LCD module connections

· 6 أطراف بالمنفذ PORTC
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

· و 6 خانات تحكم بسجل التحكم TRISC
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections
2- تعريف (إعلان) الرسائل والمتغيرات المستخدمة قبل الدخول للدالة الرئيسية
· الرسالة الأولى ثابتة وتنص على DVM Project .


char Message1[] = “DVM Project”;
  • تعريف متغير لحفظ نتيجة التحويل باسم ADC_Value ومتغير لحفظ جهد العرض باسم DisplayVolt
unsigned int ADC_Value, DisplayVolt;

· والاشارة إلى متغير باسم volt يحتوى على نص عرض الجهد بالصيغة 00.0

char *volt = "00.0";

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-04-2011, 02:26 AM المشاركة 34   
افتراضي


3- الدالة الرئيسية : ونبدءها بإعدادات الميكروكونترولر :
void main() {
# تهيئة الطرف RA0/AN0 كمدخل تناظرى وباقى الأطراف كمداخل / مخارج رقمية

ADCON1 = 0b00001110 ; // RA0/AN0 is analog input

# تخصيص موديول المحول داخليا للقناة AN0 .
ADCON0 = 0 ; // Analog channel select * AN0


# تهيئة جميع أطراف المنفذ PORTB والمنفذ PORTA كمخارج فيما عدا طرف الدخل التناظرى AN0
TRISB = 0b00000000; // PORTB All Outputs
TRISA = 0b00000001; // PORTA All Outputs, Except RA0

· بعد ذلك تهيئة وحدة العرض LCD لبدء العمل

Lcd_Init(); // Initialize LCD

· ومسح الشاسة
Lcd_Cmd(_LCD_CLEAR); // CLEAR display

· ومنع ظهور (عرض) المؤشر على الشاشة
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

· ثم كتابة الرسالة الثابتة وهى الرسالة الأولى : DVM Project بدءا من الصف الأول والعامود الأول
Lcd_Out(1,1,Message1);

· ثم كتابة حرف V فى الصف الثانى والعامود العاشر لتظهر بعد قيمة الجهد .

Lcd_Chr(2,10,'V');

· الدخول فى الحلقة الغير منتهية do{…} while(1) حيث يتم تنفيذ :
do {
# قراءة المدخل التناظرى من القناة رقم 0 ونسخ نتيجة التحويل إلى سجل المتغير ADC_Value .
ADC_Value = ADC_Read(0);

# ضرب محتويات سجل المتغير ADC_Value فى 2 ونسخ النتيجة لسجل المتغير DisplayVolt ( على سبيل المثال 0462 )

DisplayVolt = ADC_Value * 2;

· الحصول على العدد الصحيح لخانة الآلاف : بالقسمة على 1000 وإضافة العدد 48 لتحويل العدد السابق لكود أسكى ونسخ العدد فى الخانة رقم 0 للمتغير volt ( 0462 / 1000 = 0 كعدد صحيح ).
volt[0] = DisplayVolt/1000 + 48;

· الحصول على العدد الصحيح للمئات : بقسمة محتويات سجل المتغير DisplayVolt على 100 ثم إيجاد باقى قسمة النتيجة على 10 . ثم يضاف العدد 48 للتحويل إلى كود أسكى وتخزين النتيجة بالخانة رقم 1 بسجل المتغير volt ( 0462/100 =4 كعدد صحيح وباقى قسمة النتيجة على 10 هى العدد 4 المطلوب ) .
volt[1] = (DisplayVolt/100)%10 + 48;

· نكرر بالنسبة للعدد الصحيح للعشرات ( 0462 /10 = 46 كعدد صحيح وباقى قسمة النتيجة على 10 هى العدد 6 المطلوب "القسمة تساوى أربعة صحيح والباقى 6 وهو المطلوب )
volt[3] = (DisplayVolt/10)%10 + 48;

· ثم كتابة محتويات السجل volt بدءا من الصف الثانى والعامود الخامس
Lcd_Out(2,5,volt);

· التأخير لفترة 500 ملى ثانية للسماح بمشاهدة العرض .
delay_ms(500); // Hold for 500 ms

· تكرار العملية بصفة مستمرة لتحديث قراءة المدخل التناظرى والعرض .
} while(1);

} // End main()









اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-04-2011, 02:28 AM المشاركة 35   
افتراضي


كود:
 
/* Project: Digital Voltmeter based on PIC16F877 Oscillator * 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF
*/ // LCD module connections sbit LCD_RS at RB0_bit; sbit LCD_EN at RB1_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB0_bit; sbit LCD_EN_Direction at TRISB1_bit; sbit LCD_D4_Direction at TRISB4_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB6_bit; sbit LCD_D7_Direction at TRISB7_bit; // End LCD module connections char Message1[] = "DVM Project"; unsigned int ADC_Value, DisplayVolt; char *volt = "00.0"; void main() { ADCON0 = 0 ; // Analog channel select * AN0 ADCON1 = 0b00001110 ; // RA0/AN0 is analog input
TRISB = 0b00000000; // PORTB All Outputs TRISA = 0b00000001; // PORTA All Outputs, Except RA0 Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // CLEAR display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off Lcd_Out(1,1,Message1); Lcd_Chr(2,10,'V'); do { ADC_Value = ADC_Read(0); DisplayVolt = ADC_Value * 2; volt[0] = DisplayVolt/1000 + 48; volt[1] = (DisplayVolt/100)%10 + 48; volt[3] = (DisplayVolt/10)%10 + 48; Lcd_Out(2,5,volt); delay_ms(500); // Hold for 500 ms } while(1);} // End main()


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-04-2011, 02:31 AM المشاركة 36   
افتراضي


الملفات الكاملة للتدريب على الرابط

http://www.4shared.com/file/w5zCa_KN/ADC-LCD-DVM-PROJECT.html


hamadalla31
:: مهندس متميز ::
تاريخ التسجيل: Mar 2009
المشاركات: 585
نشاط [ hamadalla31 ]
قوة السمعة:
قديم 18-04-2011, 01:09 PM المشاركة 37   
افتراضي


بسم الله ماشاء الله اغبطك علي هذا الخير العظيم راجيا من الله ان يوفقك ويزيدك ويرضيك ويفتح لك كل ابواب وخيرات الدنيا والأخرة نحن واياكم والمؤمنين علي دعائي لمعلم الخير...................................اللهم امين


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-04-2011, 02:29 PM المشاركة 38   
افتراضي


بسم الله ماشاء الله اغبطك علي هذا الخير العظيم راجيا من الله ان يوفقك ويزيدك ويرضيك ويفتح لك كل ابواب وخيرات الدنيا والأخرة نحن واياكم والمؤمنين علي دعائي لمعلم الخير...................................اللهم امين

اللهم آمين

أخى الكريم

شكرا جزيلا لك

معا إن شاء الله نحو الأفضل

مع تمنياتى بدوام التوفيق


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-04-2011, 02:35 PM المشاركة 39   
افتراضي


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


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-04-2011, 02:37 PM المشاركة 40   
افتراضي


المعلومات النظرية :
الحساس 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): .
ويكون كود العدد لخرج المحول ADC : 0.264/0.001168 = 226
إذا عكسنا العملية : أى أن كان لدينا فى خرج المحول ADC عدد رقمى قدره 226 يمكننا العودة للخلف بتحويله إلى جهد الدخل بضربه فى الدقة ثم نحول هذا الجهد إلى درجة الحرارة بالقسمة على عامل قياس الحساس وهو (10 mV/°C) كما يلى :
temperature = 226 * 0.001168 (V/Count) / 0.01 (V/°C) = 26.4 °C
لتجنب استخدام الأعداد الحقيقية التى تحتوى على علامة عشرية متحركة والتى تسمى 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
الدائرة الكهربية :



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 04:57 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)