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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 14-07-2017, 01:41 AM المشاركة 129   
افتراضي



كل الشكر والاحترام استاذ فتح الله
ذكرت لي ان المترجم لا يكتشف الاخطاء البرمجيه
لكن اليس هذا يعني اني يمكن ان اكتب كود طوييل يحوي كثير من الاخطاء وعند الترجمه ينتج ملف hex لكن عند العمل الفعلي تكون النتائج مختلفه ولو قليلا عن ما هو متوقع ان يكون

ثانيا استاذ ذكرت ان القيمه 288 لها مناظر ثنائي ويتم اخذ الثماني بتات الاولي فقط
لماذا
او قبل الاسئله من الذي اخذ الثماني بتات المترجم ام قواعد اللغه
السؤال هل السبب ان المايكرو من العائله f16 هو 8 بت فقط
واذا كان المايكرو 32 بت هل سياخذ اكثر من ذلك مع العلم ان كل بايت يتكون من 8 بتات
اخي الكريم شكرا سلفا
ومعذره ان كانت الاسئله غير منطقيه فانا مبتدئ
نقطه اخري هل اسئلتي تفسد تسلسل الشرح ؟؟
أخى الكريم شكرا جزيلا لك
ذكرت لي ان المترجم لا يكتشف الاخطاء البرمجيه
لكن اليس هذا يعني اني يمكن ان اكتب كود طوييل يحوي كثير من الاخطاء وعند الترجمه ينتج ملف hex لكن عند العمل الفعلي تكون النتائج مختلفه ولو قليلا عن ما هو متوقع ان يكون
هذا وارد بالفعل ويحدث فى البداية ولكن مع التمرين تقل الأخطاء البرمجية .

ثانيا استاذ ذكرت ان القيمه 288 لها مناظر ثنائي ويتم اخذ الثماني بتات الاولي فقط
لماذا
او قبل الاسئله من الذي اخذ الثماني بتات المترجم ام قواعد اللغه
السؤال هل السبب ان المايكرو من العائله f16 هو 8 بت فقط
واذا كان المايكرو 32 بت هل سياخذ اكثر من ذلك مع العلم ان كل بايت يتكون من 8 بتات
المترجم يقوم بهذا الغمل فهو يعلم تماما أن TRISB عبارة عن بايت ويقوم بنسخ الطرف الأيمن إلى الطرف الأيسر بت تلو الأخرى بدءا من البت الأدنى أهمية أى bit0 وحتى bit7 بعد ذلك لن يجد مكان لباقى البتات ومن المفترض أن نعرف نحن ذلك أيضا ونستفيد من ذلك برمجيا ، ولا علاقة لنوع الميكروكونترولر .

ومرحبا بأى استفسار

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


اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 16-07-2017, 04:13 PM المشاركة 130   
افتراضي


تدريب تمهيدى :
الغرض :
استعراض التعامل مع المحول 10-bit ADC باستخدام الميكروكونترولر PIC16F877A . جهد دخل المحول ADC يتم أخذه من مقاومة متغيرة 5K متصلة بالجهد +5V ، ويتم توصيله إلى الطرف RA0/AN0 مع أخذ جهدى المرجع الافتراضية VDD,VSS(0-5V) ، وبالتالى يكون مدى التحويل ADC من 0 إلى 1023 . سوف يتم عرض نتيجة التحويل على شاشة LCD .

الدائرة الكهربية :



البرنامج :

كود:
// LCD module connections
 sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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
// Define Messages
 char message1[] = "ADC Value= ";
 char *temp = "0000";
 unsigned int ADC_Value;
 void main() {
  Lcd_Init();                      // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);             // CLEAR display
  Lcd_Cmd(_LCD_CURSOR_OFF);        // Cursor off
  Lcd_Out(1,1,message1);           // Write message1 in 1st row
  do {
   adc_value = ADC_Read(0);
   temp[0] = adc_value/1000 + 48; // Add 48 to get the ASCII character value
   temp[1] = (adc_value/100)%10 + 48;
   temp[2] = (adc_value/10)%10 + 48;
   temp[3] = adc_value%10 + 48;
   Lcd_Out(1,11,temp);
   Delay_ms(2000);
  } while(1);
 }

مشروع جهاز قياس الجهد (فولتميتر) ، وجهاز قياس تيار (أمبيرميتر) باستخدام الميكروكونترولر PIC :
يمكن بسهولة صنع فولتميتر وأمبير ميتر باستخدام ميكروكونترولر PIC لديه موديول محول من تناظرى لرقمى ADC . سوف نستخدم الميكروكونترولر PIC16F877A ، وعرض النتيجة على وحدة عرض LCD .
موديول ADC يحول الإشارات التناظرية المطبقة على طرفه التناظرى إلى عدد ثنائى 10-bit ، وله القدرة على اختيار جهد المرجع الموجب وجهد المرجع السالب بالجهد VDD,VSS أو بجهد على الأطراف RA2,RA3 .
الدخل التناظرى إلى الميكروكونترولر PIC محدد بالجهود VDD,VSS(0-5V) التى تغذى الميكروكونترولر PIC .
فى هذا المشروع سوف يتم قياس الجهد فى المدى 0-50V ، ولتخفيضه ليكون فى مدى الميكرونترولر PIC (0-5V) فسوف نستخدم مقسم جهد مناسب .
يتم قياس تيار الحمل عن طريق تمريره خلال مقاومة صغيرة وقياس فرق الجهد بين طرفيها (محول تيار إلى جهد) ، كما هو مبين بالشكل أدناه .







يتم توصيل خرج مقسم الجهد إلى الطرف RA2 ، وتوصيل الجهد عبر مقاومة قياس التيار إلى الطرف RA3 ، كما يتم توصيل هذين الطرفين بزنر دايود 5.1V لحماية الميكروكونترولر من ارتفاع الجهد .
الحسابات :
حسابات الجهد :
جهد دخل الميكروكونترولر التناظرى Vpicv حيث :

كود:
Vpicv = ADC_result(5/1023) = 0.00489 ADC_result 
 Vpicv = 4.89 ADC_result mV
وهو نفسه جهد خرج مقسم الجهد ، ومن ثم يكون :

كود:
4.89 ADC_result = Vin (1.1/11.1)
Vin = 4.89 ADC_result * (11.1/1.1)
Vin=49.34 ADC_result mV
أى للحصول على جهد الدخل يتم ضرب نتيجة التحويل ADC فى 49.34 .
حسابات التيار :
بالمثل ، جهد دخل الميكروكونترولر التناظرى الواصل إلى الطرف RA3 والناتج عن مرور تيار الحمل فى مقاومة القياس Vpici حيث :

كود:
 Vpici = ADC_result(5/1023) = 4.89 ADC_result mV
التيار المارفى مقاومة القياس يكون :

كود:
Iin = 4.89 ADC_result / 0.1 = 48.9 ADC_result mA
أى للحصول على تيار الدخل يتم ضرب نتيجة التحويل ADC ، لهذه الحالة ، فى 48.9
ملحوظة :
مدى جهد الدخل أصبح من 0 إلى 50000 ملى فولت ، وصيغته تكون بالشكل00.0 ( خانة عشرات ، وخانة آحاد ، وخانة كسر عشرى) ، ومن ثم لاستخلاص رقم خانة العشرات فسوف يتم القسمة على 10000 ولاستخلاص رقم خانة الآحاد فسوف يتم القسمة على 1000 يتبعه إيجاد باقى خارج قسمة الناتج على 10 ، وهكذا . بالنسبة للتيار تكون صيغته 0.00 (خانة آحاد وخانتى كسر عشرى ) أى له رقم خانة آحاد فقط ، يمكن استخلاصة بالقسمة على 1000 .

البرنامج :

كود:
// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_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 TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_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
  unsigned int v,i;
  char *volt = "00.0";
  char *current = "0.00";

void main()
{
  
  CMCON = 0x07;
  TRISA = 0xFF;
  ADCON1 = 0x00;
  Lcd_Init();
  Lcd_Cmd(_LCD_CLEAR);
  Lcd_Cmd(_LCD_CURSOR_OFF);

  do
  {
    v = ADC_Read(2);
    i = ADC_Read(3);
    v = 49.34   * v ;
    i = 48.9  * i ;

    volt[0] = (v/10000)+48;
    volt[1] = ((v/1000)%10)+48;
    volt[3] = ((v/100)%10)+48;
    Lcd_Out(1,1,"Voltage = ");
    Lcd_Out(1,11,volt);
    Lcd_Out(1,16,"V");

    current[0] = (i/1000)+48;
    current[2] = ((i/100)%10)+48;
    current[3] = ((i/10)%10)+48;
    Lcd_Out(2,1,"Current = ");
    Lcd_Out(2,11,current);
    Lcd_Out(2,16,"A");
    Delay_ms(250);
  } while(1);
}

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 16-07-2017, 08:58 PM المشاركة 131   
افتراضي


أجهزة الاستشعار (الحساسات) Sensors
استخدام أجهزة الاستشعار فى أنظمة الميكروكونترولر مفيد للغاية فى الكثير من التطبيقات حيث أنها تتيح الحصول على قراءات (قياسات) لكميات طبيعية مثل درجة الحرارة والعجلة والسرعة والضغط والرطوبة وشدة الإضاءة وغيرها الكثير. هذه التطبيقات مهمة فى أنظمة التحكم وفى الروبوتات وأجهزة القياس .
جهاز استشعار درجة الحرارة LM35 :
الحساس LM35 هو جهاز فعال ذو ثلاثة أطراف يسمح بتحصيل درجة حرارة الوسط المحيط (البيئة) فى المدى من -55 إلى 150 درجة مئوية . يسهل تنفيذ التطبيقات بهذا الحساس لأن لديه فقط طرفين للتغذية وطرف لجهد الخرج والذى يتناسب مباشرة مع درجة الحرارة . يمكن تغذية هذا الحساس من مصدر جهد يتراوح بين 4 - 30 volts وخرجه يكون بقيمة 10 ملى فولت لكل درجة مئوية . الشكل التالى يبين مظهر الحساس الطبيعى ورمزه فى برنامج إيزيس :



لتنفيذ قراءة جهد خرج الحساس باستخدام الميكروكونترولر يتم استخدام موديول التحويل من تناظرى لرقمى ADC module . أقصى جهد خرج للحساس هو 1.5 volts ، عندما تكون درجة الحرارة 150 درجة مئوية. لذلك من المهم تغيير جهد المرجع الموجب للمحول من تناظرى لرقمى ، بغرض تحسين دقة قياس الجهد . فى المثال المذكور أدناه سوف يتم تحديد جهد المرجع الموجب Vref+ للمحول ADC بالقيمة 2.5 volts . بهذه الطريقة ، عندما يكون جهد الدخل التناظرى 2.5 volts فإن نتيجة التحويل من تناظرى لرقمى المناظرة تكون العدد 1023 . يمكن التعبير عن هذا المفهوم بالصيغة التالية :

كود:
Vpic = ADC_result * (2.5/1023) = 2.44 * ADC_result mV
وهو نفسه جهد خرج الحساس LM35 والذى يمكن التعبير عنه بالصيغة :

كود:
Vout = 10 * Tc mV
بمساواة المعادلتين يمكن الحصول على درجة الحرارة كما يلى :

كود:
Tc = (2.44 * ADC_result) / 10 = 0.244 * ADC_result
أى للحصول على درجة الحرارة بالدرجة المئوية يتم ضرب نتيجة التحويل ADC_result فى العامل 0.244 .
يجب استخدام هذه المعادلة عند تنفيذ التحويل من تناظرى لرقمى فى برنامج الميكروكونترولر PIC .
فى هذا الإطار يمكن استخدام الحساس والميكروكونترولر PIC16F877A فى تنفيذ البرنامج ، وفيما يلى كود البرنامج :

كود:
// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_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 TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_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 // Variables Declaration .
	unsigned int Radc, TemI;
	float Tem;
	char Text[16];

void main( void )
{
	
	//Sets the ADC module with pin AN3 
	//as positive reference voltage.
	ADCON1 = 0b11000001;
	//LCD initiation 
	Lcd_Init();
	//Clearing the cursor.
	Lcd_Cmd(_LCD_CURSOR_OFF);
	//Printing text.
	Lcd_Out( 1, 1, "Temperature :");
	while(1) //Infinite Loop.
	{
		//Reading ADC channel 0.
		Radc = ADC_Read(0);
		//Using the equation 
		Tem = 0.244*Radc;
		//Converts the result to an integer.
		TemI = Tem;
		//Integer converted to a string.
		IntToStr( TemI, Text );
		//Prints the result.
		Lcd_Out( 2, 1, Text);
		//Delay 100m  seconds.
		delay_ms(100);
	}
}
بعد تحرير وترجمة البرنامج يجب بناء دائرة برنامج إيزيس وبها الأجهزة الآتية :
16F877A, RES, LM35, LM016L كما فى الشكل التالى :




المقاومتان 330 يعملان كمقسم جهد للحصول على جهد المرجع بالقيمة 2.5 volts . خلال المحاكاة يمكنك تغيير قيمة درجة حرارة الحساس LM35 ومشاهدة النتيجة .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 16-07-2017, 09:28 PM المشاركة 132   
افتراضي


أجهزة إستشعار المسافة Distance sensors :



تستخدم أجهزة إستشعار المسافة فى قياس طول المسافة من مكان نقطة موقع الجسم العائق obstacle إلى موقع المستشعر (الحساس) . تنفيذ هذا النوع من الأجهزة مفيد فى أنظمة التحكم وفى مشاريع الروبوتات robotics.
وكحالة محددة فأنه فى هذا الجزء سوف يتم العمل بالحساس GP2D12 (الموجود ضمن برنامج إيزيس) ، هذا الحساس يستخدم تقنية إرسال الشعاع الضوئى للأشعة تحت الحمراء واستقبال إنعكاسها لتحديد المسافة . الشكل التالى يبين المظهر الطبيعى ، والأطراف ، والرمز فى برنامج إيزيس لهذا الحساس :




مثل هذا الحساس له سلوك غير خطى nonlinear ، هذا يعنى أن الخرج ليس له دالة تحويل خطية . لفهم هذا المفهوم بوضوح الرسم البيانى التالى يبين سلوك الخرج كدالة فى المسافة :



سلوك مثل هذا الحساس صعب التنفيذ ، لأنه فى بعض الحالات لا يقدم المصنع دالة تحويل مفيدة حتى يمكن استخدامها فى شكل معادلة واحدة . وعلى الرغم من ذلك فهذا لا يشكل عقبة أمام استخدام الحساس . كما هو موضح فى الداتا شيت أن المدى المؤثر من 10 إلى 80 سنتيمتر ( Effective Range: 10 to 80 cm) كما هو مبين فى الرسم البيانى .
الرسم البيانى الموضح موجود بالداتا شيت الخاص بالجهاز ويتم تنفيذه تجريبيا (نتيجة تجارب) . لوصف سلوك الحساس والحصول على دالة التحويل من الضرورى إجراء عملية رياضية تعرف باسم "الخطية" linearization . لتحقيق هذه الغاية يتم إجراء عملية "إستيفاء" interpolation بعدد معروف من نقاط الدالة ، هذه النقاط تؤخد من القياسات التجريبية . كلما زاد عدد النقاط كلما زادت دقة تقييم دالة التحويل .
لبدء هذه العملية يتم اختيار نقطتين موزعين بالتساوى . على سبيل المثال النقطة عند مسافة 10cm والنقطة عند مسافة 80cm . لكل نقطة نكون معادلة فيكون لدينا معادلتين من الدرجة الأولى فى هذه الحالة ، حيث يتم حلهما معا وإيجاد الثوابت .
لفهم هذا المفهوم ، نفترض أن المغير المستقل x يعبر عن جهد خرج الحساس بالفولت والمتغير التابع y يعبر عن المسافة بالسنتيمتر ونعتبر أن المعادلة التالية تعبر عن سلوك الحساس :



باعتبار أن y تمثل المسافة و x تمثل جهد خرج الحساس المستخدم ومن الرسم البيانى التجريبى نحصل على :



عندئذ يمكن كتابة المعادلات :

https://i11.servimg.com/u/f11/18/74/92/45/1113.jpg

ونستطيع تكوين معادلتين فى مجهولين كما يلى :



بحل المعادلين يمكن تعيين الثوابت كما يلى :

https://i11.servimg.com/u/f11/18/74/92/45/1311.jpg

بهذه الطريقة يمكن وضع صيغة لدالة التحويل للحساس كما يلى :



وحيث أن المتغير x يمثل جهد خرج الحساس مع الوضع فى الاعتبار أنه لا يزيد عن 2.5 volts ، فيجب ضبط جهد المرجع للمحول من تناظرى لرقمى عند 2.5 volts . لتحديد التحويل يتم استخدام المعادلة :



بالتعويض نحصل على صيغة دالة التحويل التالية :



الخطوة التالية هى تنفيذ كود المصدر لبرنامج يستخدم دالة التحويل وعرض هذه القيمة ، لهذا الغرض إليك كود المصدر للبرنامج التالى :

كود:
// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_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 TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_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
//Variables Declaration  .
     unsigned int Radc, DisI;
     float Dis;
     char Text[16];

void main( void )
{
     
     //Set the ADC module with pin AN3
     //as positive reference voltage.
     ADCON1 = 0b11000001;
     //Initiation LCD
     Lcd_Init();
     //Clearing the cursor.
     Lcd_Cmd(_LCD_CURSOR_OFF);
     //Printing text.
     Lcd_Out( 1, 1, "Distance:");
     
     while(1) //Infinite Loop.
     {
              //Reading analog channel 0 .
              Radc=ADC_Read(0);
              //Implementation of the transfer function Equation
              Dis = (14226.02784/Radc)-4.793814433;
              //force the result to an integer value.
              DisI=Dis;
              //convert the integer value to string.
              IntToStr( DisI, Text );
              //Print the sensor reading.
              Lcd_Out( 2, 1, Text );
              //Delay 100m-seconds.
              delay_ms(100);
     }
}

وأخيرا للتحقق من سلوك النظام يتم التنفيذ ببرنامج إيزيس بالأجهزة التالية :
16F877A, RES, LM016L, GP2D12 وتكوين الدائرة الكهربية كما فى الشكل التالى :











الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 16-07-2017, 11:23 PM المشاركة 133   
افتراضي


أجهزة الأستشعار LDR Sensors
أجهزة الاستشعار LDR هى أجهزة تتغير مقاومتها اعتمادا على شدة الضوء ، كلما ارتفعت شدة الضوء انخفضت مقاومة LDR .
هذه الأجهزة مفيدة لتحديد وجود أو غياب الإضاءة المحيطة ، لذلك فهى تستخدم فى الأنظمة التى تتطلب التحكم فى شدة الإضاءة .
الشكل التالى يبين المظهر الطبيعى والرموز فى برنامج إيزيس :




الخصائص الكهربائية لهذه الأجهزة ليست صعبة التحقيق ، حيث أنها تعمل بطريقة بسيطة ويوجد لها مجموعة متنوعة من شركات التصنيع ، أجهزة LDR أو المقاومة الضوئية متوفرة تجاريا بمختلف الأحجام ، وهذا يعنى أن مدى التغير فى المقاومة يعتمد على الحجم ، فالحجم الكبير يكون له مدى صغير والعكس بالنسبة للحجم الصغير . قد يكون التغيرفى المقاومة ليس متماثلا فى اثنين من LDR لهما نفس الحجم . هذه الأسباب تجعلها سهلة الاستخدام لقراءة المقاومة أو الجهد بين طرفيها . أبسط طريقة لاستخدام LDR هى عمل مقسم جهد مع مقاومة ثابتة .
لفهم هذا المفهوم يمكنك النظر إلى الشكل التالى :



بتطبيق النظرية الأساسية لتقسيم الجهد على الدائرة السابقة نحصل على :

كود:
Vout = Vcc * (LDR / (LDR+R))
من هذه المعادلة يمكن الحصول على المعادلة :

كود:
LDR = (Vout)(R) / (Vcc – Vout)
وحيث أن الجهد التناظرى بالقيمة Vout يدخل إلى المحول من التناظرى لرقمى ، وهو ما يعتبره الميكروكونترولر جهد دخل Vadc ، وباستخدام جهد المرجع الموجب بالقيمة 5 volts (الافتراضى) فإنه يمكن التعبير عن التحويل بالصيغة التالية :

كود:
Vadc = Radc * (5 / 1023) = Radc * 0.004887585
بالتعويض فى المعادلة السابقة وبفرض أن الجهد Vccيساوى 5 volts يمكننا الحصول على العلاقة :

كود:
LDR = (Radc)( 0.004887585) (R) / (5 – (Radc)( 0.004887585))
فى هذه الحالة الخاصة للتدريب على المحاكاة سوف نستخدم مقاومة مقسم الجهد بالقيمة 10k وبالتالى سوف تصبح معادلة LDR بالصيغة :

كود:
 LDR = (Radc) (48.87585) / (5 – (Radc)( 0.004887585))

لإدراك المفاهيم السابقة يتم تحرير وترجمة ومراقبة وتحليل كودالمصدر للبرنامج التالى :

كود:
// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_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 TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_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

//Dariables Declaration  .
     unsigned long Radc, DisI;
     char Text[16];

void main( void )
{
     
     //Initiation LCD
     Lcd_Init();
     //Cursor OFF.
     Lcd_Cmd(_LCD_CURSOR_OFF);
     //Printing text.
     Lcd_Out( 1, 1, "Resistance:");
     
     while(1) //Infinite Loop.
     {
              //Reading analog channel 0.
              Radc=ADC_Read(0);
              //Implementation the calculation of the LDR equation
              DisI = (Radc*48.87585533)/(5.0-Radc*0.004887585);
              //Convert the long integer value in string.
              LongToStr( DisI, Text );
              //Print the sensor reading.
              Lcd_Out( 2, 1, Text );
              //Delay 100m-seconds.
              delay_ms(100);
     }
}
للمحاكاة ببرنامج إيزيس يتم جلب الأجهزة التالية :
16F877A, RES, LM016L, TORCH_LDR وإنشاء الدائرة الكهربية الآتية :





الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 17-07-2017, 01:28 AM المشاركة 134   
افتراضي


أجهزة استشعار الضغط Pressure sensors :
الضغط هو متغير طبيعى، يمثل بمتجه يعرف بأنه القوة الواقعة على مساحة معينة . يتم الدلالة على الضغط بوحدات مختلفة تبعا لنظام الوحدات المستخدم ، فيمكن أن يعطى الضغط بالوحدات :
psi, Pascal, atmospheres, inches of mercury الخ.
للأغراض العملية لهذا الجزء سوف يتم العمل بحساس الضغط MPX4115 . خواص هذا الحساس تعطى بالكيلوباسكال Kilo Pascal ويمكنه قياس الضغوط فى المدى بين 15 kPa و 115 kPa، أو بين 2.18 psi و 16.7 psi.
المظهر الطبيعى وتوزيع الأطرف ومز المحاكاة فى برنامج إيزيس موضح بالشكل التالى :




يتم التنفيذ تبعا لنوع الحساس ، كل حساس يجب أن يكون له "دالة تحويل" transfer function وهى العلاقة بين الخرج والدخل ، فى حالة حساس الضغط MPX4115 تتحدد دالة التحويل بواسطة الصناع بالعلاقة :

كود:
Vout = Vs ( 0.009P – 0.095)

حيث Vout هو جهد خرج الحساس ، و P هو الضغط بالكيلوباسكال Kilo Pascal ، و Vs جهد تغذية الحساس . من هذه المعادلة يمكن الحصول على صيغة للضغط بالشكل التالى :

كود:
P = (111.111 Vout / Vs) + 10.555
عندما يتم إعداد الميكروكونترولر PIC ليعمل المحول من تناظرى لرقمىADC بدقة 10 بتات 10-bit يمكن استنتاج العلاقة التالية :

كود:
Vadc = Radc * (5 / 1023)
هذا الجهد هو نفسه جهد خرج الحساس ، بالتعويض عن Vout يمكن الحصول على المعادلة أو العلاقة التى يم استخدامها بالميكروكونترولر لقراءة الحساس ، هذه العلاقة تكون بالشكل التالى :

كود:
 P = (0.54306 Radc / Vs ) + 10.555
هنا ، فى حالتنا الخاصة ، سوف يتم استخدام جهد التغذية بقيمة 5 volts وهو الذى يغذى الميكروكونترولر والحساس ولذلك فإن Vs تساوى 5 volts , ونحصل على العلاقة النهائية لنسبة التحويل بالصيغة التالية :

كود:
P = 0.10861Radc +10.555
لاستعراض العمل الفعلى لمثل هذا الحساس راقب وحلل كود المصدر للبرنامج التالى :


كود:
// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_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 TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_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
//Variables Declaration  .
	unsigned int Radc, PreI;
	float Pre;
	char Text[16];

void main( void )
{
	
	//LCD initiation.
	Lcd_Init();
	//Clearing the cursor.
	Lcd_Cmd(_LCD_CURSOR_OFF);
	//Printing text
	Lcd_Out( 1, 1, "Pressure in KPa:");
	while(1) //Infinite Loop.
	{
		//Reading ADC channel 0.
		Radc = ADC_Read(0);
		//Using the equation
		Pre = 0.10861*Radc+10,5555;
		//Forces the result to the integer part.
		PreI = Pre;
		//Converts the integer to a string.
		IntToStr( PreI, Text );
		//prints the result.
		Lcd_Out( 2, 1, Text);
		//Delay 100 m seconds.
		delay_ms(100);
	}
}
بعد تحرير وترجمة البرنامج , يمكن تنفيذ المحاكاة ببرنامج إيزيس بجلب الأجهزة الآتية :
16F877A, MPX4115, LM016L وتكون الدائرة الكهربية كما فى الشكل التالى :






الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 17-07-2017, 03:22 PM المشاركة 135   
افتراضي


قياس درجة حرارة موجبة وسالبة باستخدام الحساس LM35
الدائرة الكهربية :

برجاء مراجعة الداتا شيت الخاصة بالحساس LM35



البرنامج :

كود:
//program Thermometer_with_LM35 + & -

// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_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 TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_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

unsigned temp;		// unsigned (int)  0 .. 65535
unsigned tempn;
short tempout ; 		//(signed) short (int)  - 128 .. 127
char Tc[5];

void main(){

TRISA  = 0xFF;  // designate PORTA as input
TRISB  = 0; //  as outputs

   Lcd_Init();                        // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);              // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
  Lcd_Out(1,1,"ENG.F.ABDELAZIZ");                // Write text in first row
  Lcd_Out(2,1,"WELCOME");                // Write text in second row
  Delay_ms(2000);
  Lcd_Cmd(_LCD_CLEAR);              // Clear display
  Lcd_Out(1,1,"ROOM TEMP.");                // Write text in first row
  while (1) {
      temp = ADC_read(0);
      tempn = ADC_read(1);
      temp = temp/2.046; // T = (Vadc mV /10) = (1/10) * ADC_READ*(5000/1023) 
      tempn = tempn/2.046;
      tempout = temp - tempn;
      shortToStr(tempout,Tc);
      Lcd_Out(2,1,Tc);
     Lcd_Chr_Cp(223); // ASCII degree character 
     Lcd_Chr_Cp('C');
    delay_ms(1000);
  }
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 17-07-2017, 09:39 PM المشاركة 136   
افتراضي


مشروع : تصميم نظام قياس درجة الحرارة يعتمد على الميكروكونترولر باستخدام مقاومة حرارية RTD نوع Pt100 .



حساس الحرارة المستخدم له معامل حرارى =0.00385 . وخواصه :



إذا فرضنا أن مقومة المصدر Rs=1K وجهد المصدر Vs=5V فإن الجهد بين طرفى الحساس RTD عند كل من نهايتى مدى درجة حرارة التشغيل تكون :



فإذا استخدمنا مكبر عمليات كسبه (تكبيرة) يساوى 5 فإن المدى الذى يرى من جهة المحول A/D سوف يكون:



وحيث أن المحول ذات 10 بت ومداه الكامل هو 5V فإن دقته أو الجهد المناظر لكل بت يكون :




ولكن مدى جهد الدخل :



ومن ثم سوف تكون دقة (حساسية) النظام حوالى واحد درجة مئوية .

المخطط الصندوقى :




الدائرة الكهربية :




مبدأ العمل :
• يتم تحويل الجهد بين طرفى الحساس RTD إلى الشكل الرقمى .
• يتم حساب مقاومة الحساس Rt باستخدام المعادلة :



• حيث Vt الجهد بين طرفى الحساس و Vs=5V و Rs=1k , بالتعويض نحصل على :



• يتم حساب درجة الحرارة من المعادلة :



• حيث t هى درجة الحرارة المقاسة بالدرجات المئوية ، و Rt هى مقاومة الحساس عند درجة الحرارة t ، و :



بالتعويض نحصل على :



حيث يمكننا حساب درجة الحرارة t بمعلومية المقاومة Rt .

البرنامج :
ملخص لخطوات البرنامج :
• إعدادات وحدة العرض .
• إعدادات الميكروكونترولر .
• إنشاء حلقة غير منتهية وفيها يتم :
# قراءة الجهد التناظرى بين طرفى الحساس RTD وتحويله إلى الشكل الرقمى .
# حساب المقاومة Rt .
# حساب درجة الحرارة t .
# عمل المقياس اللازم للتحويل إلى درجة حرارة .
# عرض درجة الحرارة على وحدة العرض LCD .
# الانتظار لثانية ثم التكرار بصفة مستمرة لتحديث البيانات .


كود:
/* This project measures the temperature with a RTD PT100  and
* then displays on a LCD
Eng.F.Abdelaziz
 */

// LCD module connections
sbit LCD_RS at RC0_bit;
sbit LCD_EN at RC1_bit;
sbit LCD_D4 at RC4_bit;
sbit LCD_D5 at RC5_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D7 at RC7_bit;
sbit LCD_RS_Direction at TRISC0_bit;
sbit LCD_EN_Direction at TRISC1_bit;
sbit LCD_D4_Direction at TRISC4_bit;
sbit LCD_D5_Direction at TRISC5_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISC7_bit;
// End LCD module connections

float rtdv,rtdr,temp,y; //  Floating-point Types
int msd, isd;
char temperature [6] ;

void main()
{

/* Initialize the microcontroller */

TRISA=0xFF;	//configure PORTA as Input direction
TRISB=0;		//configure PORTB as Output direction
TRISC=0;		//configure PORTD as Output direction
PORTA=0;	//Clear
PORTB=0;
PORTC=0;
//===============================================

  Lcd_Init();                        		// Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);               	// CLEAR display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off

  Lcd_Out(1,1,"RTD Pt100 TEMP.");

while(1) {



rtdv = ADC_Read(0);// Get RTD voltage 10-bit result

rtdv  = rtdv  *5 /1024 ; //Scale RTD voltage in Volts
rtdv  = rtdv/5; //for op amp gain

/* Calculate RTD resistance rtdr */
rtdr = rtdv*1000.0/(5.0-rtdv);

/* Calculate temperature temp */

y = 0.15274- (rtdr-100.0)*0.0002310;
if(y>= 0) y = sqrt(y) ;
temp = (y-0.39083)/(-0.0001155) ;

ByteToStr(temp,temperature); // Change to string
   Lcd_Out(2,6,temperature); // Display
   Lcd_Chr(2, 9, 223);// Add degree character
   Lcd_Chr(2, 10, 'C');// Add letter "c"
delay_ms(1000);
//==============
}

}

النتائج :










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