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

   

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



البرنامج :
يتناول البرنامج تهيئة السجلات ADCON0, ADCON1 . يستخدم الطرف RA0/AN0 كمدخل تناظرى. فى السجل ADCON0 يتم تحديد : CHS0=0 وCHS1=1 و CHS2=1 و CHS3=1أى يتم توصيل القناة AN0 داخليا . جعل الخانة VCFG=0 يؤدى إلى اختيار جهد المصدر +5V كجهد مرجع لموديول المحول A/D .
مع ذلك فإن المترجم MikroC Pro for PIC يتضمن مكتبة تحتوى على الدالة المسماة ADC_Read() والتى (فى الوضع الافتراضى) تستخدم نبضات الساعة RC الداخلية لعمل التحويل ADC .
التعليق على البرنامج :

/*
Analog-to-digital converter
Oscillator * 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF
*/

1- التعريف بتوصيلات وحدة LCD مع الميكروكونترولر
// LCD module connections
· 6 أطراف
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 خانات تحكم
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- تعريف (إعلان) الرسائل :
// Define Messages

· الرسالة الأولى على شكل مصفوفة " [] " حروف char" " باسم "message1" تنص على " ADC Value= " يليها الإعلان عن مؤشر "*" لمتغير من نوع الحروف "char" باسم temp" " وإعطاءة قيمة ابتدائية "0000" أى نص مكون من أربع أرقام (مصفوفة صف من أربع عناصر) قيمته الابتدائية هى أصفار .

char message1[] = "ADC Value= ";
char *temp = "0000";

· تعريف (إعلان) عن متغير لحفظ نتيجة التحويل ADC
unsigned int adc_Value;

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


· كتابة الرسالة الأولى(ثابتة) " " ADC Value= بدءا من الصف الأول والعامود الأول

Lcd_Out(1,1,message1); // Write message1 in 1st row

· الدخول إلى حلقة do{….}while(1) الغير منتهية وتبدأ بتنفيذ:
do {

# قراءة المدخل التناظرى من القناة AN0 بالدالة ADC_Read(0) ثم نسخ النتيجة للمتغير adc_value

adc_value = ADC_Read(0);
# قسمة محتويات المتغير adc_value على 1000للحصول على عدد الآلاف الصحيحة وإضافة العدد 48 لتحويله إلى كود أسكى ونسخ النتيجة فى الخانة 0 (خانة الآلاف – العنصر الأول من المصفوفة ) للمتغير temp
temp[0] = adc_value/1000 + 48; // Add 48 to get the ASCII character value
# الحصول على العدد الصحيح للمئات عن طريق : قسمة محتويات المتغير adc_value على 100 ثم إيجاد باقى قسمة النتيجة على 10 وفى النهاية يتم إضافة العدد 48 لتحويل النتيجة إلى كود أسكى ونسخ النتيجة فى الخانة 1 (خانة المئات- العنصر الثانى من المصفوفة) فى المتغير temp
temp[1] = (adc_value/100)%10 + 48;

# كرر للحصول على العدد الصحيح للعشرات ونسخه فى الخانة 2 (العشرات) للمتغير temp
temp[2] = (adc_value/10)%10 + 48;

# كرر للحصول على العدد الصحيح للآحاد ونسخه فى الخانة 3 (الآحاد) للمتغير temp
temp[3] = adc_value%10 + 48;

# ثم كتابة (إرسال) محتويات المتغير temp كنص يبدأ من الصف الأول والعامود الحادى عشر حتى يتم كتابة بعد الرسالة الأولى الثابتة مباشرة .
Lcd_Out(1,11,temp);

# التأخير 2 ثانية للسماح بمشاهدة وقراءة المعروض على الشاشة
Delay_ms(2000);

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

اعلانات

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


كود:
 
/* PIC16F877 Analog-to-digital converter 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 // Define Messages char message1[] = "ADC Value= "; char *temp = "0000"; unsigned int adc_Value; void main() {
ADCON0 = 0b00000000; // Analog channel select * AN0 = DEFAULT 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); // 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); }

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

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


النتائج :









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


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


http://www.4shared.com/file/C97unxZQ/EX5-ADC-LCD1.html


الصورة الرمزية أبو معاذ 2010
أبو معاذ 2010
:: مشرف قسم الإنتاج الزراعي والحيواني والطاقة البديلة ::
تاريخ التسجيل: Feb 2010
المشاركات: 2,039
نشاط [ أبو معاذ 2010 ]
قوة السمعة:
قديم 17-04-2011, 11:03 PM المشاركة 29   
افتراضي


قمة الروعة و ما زاد من رونق هذه السلسلة الجديدة : إمكانية تحميل الدروس كل على حدة ، حفظك الله يا أستاذ .


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


قمة الروعة و ما زاد من رونق هذه السلسلة الجديدة : إمكانية تحميل الدروس كل على حدة ، حفظك الله يا أستاذ .
أخى الكريم

شكرا جزيلا لك

إن شاء الله معا نحو مستقبل أفضل

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


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


التدريب السادس مشروع إنشاء جهاز قياس فولت رقمى DVM (فولت ميتر) يعتمد على الميكروكونترولر PIC
مقدمة :
يتناول هذا المشروع إنشاء مقياس جهد رقمى بسيط DVM باستخدام الميكروكونترولر PIC16F877 . مدى القياس
0-20V ويمكن بالطبع زيادة أو نقصان مدى جهد الدخل كما ترغب بعد فهم طريقة معايرة التدريج scaling .
يقوم الميكروكونترولر بقراءة جهد الدخل من خلال أحد القنوات الثمانية وتحويله إلى عدد رقمى باستخدام المحول ADC الداخلى . بإجراء بعض العمليات الرياضية على نتيجة التحويل فأن هذا العدد الرقمى يمكن تحويله كمقياس للجهد الفعلى .
يتم عرض الجهد على وحدة LCD .

الدائرة الكهربية والوصف :
لا يمكنك تغذية إشارة الجهد 20V مباشرة إلى قناة مدخل الميكروكونترولر . هذه القيمة مرتفعة جدا عن جهد العمل وقد تسبب تلف الميكروكونترولر . لذلك فنحن نحتاج أولا إلى تخفيض جهد الدخل إلى قيمة جهد عمل آمن للميكروكونترولر . يمكن تحقيق ذلك باستخدام مقسم (مجزىء) جهد بسيط مكون من مقاومات كما فى الشكل .




باستخدام المقاومتين R1 و R2 يمكن تخفيض جهد الدخل ليتحول من المدى 0-20V ويصبح فى المدى
0-5V . لقيم المقاومات R1 و R2 المختارة يمكنك رؤية أن جهد الخرج (Vout) من مقسم الجهد هو ربع 1/4 جهد الدخل . عندما يتعدى جهد الدخل 20V فسوف يزيد جهد الخرج عن 5V وهذا يسبب ضررا للميكروكونترولر . إذا تم توصيل زنر دايود بجهد 5.1V بين طرفى المقاومة R1 فإن الخرج Vout سوف لا يزيد أبد عن 5.1V . هذا يؤدى إلى حماية الميكروكونترولر من التلف المحتمل نتيجة زيادة جهد الدخل .
يتم توصيل الجهد Vout إلى طرف القناة التناظرية AN0 للميكروكونترولر PIC16F877 .
باقى الدائرة كما هو مبين بالشكل التالى :




وحدة العرض LCD موصلة فى نظام 4-bit . إذا كانت وحدة LCD تمتلك 14 طرف فقط فلا يكون لديك إضاءة خلفية كما يمكنك تجاهل الطرفين 15 و 16 إن كانا موجودين .يتم التحكم فى التباين باستخدام المقاومة المتغيرة 5K المتصلة بين الجهد +5V والأرضى .
المفتاح الضاغط لإعادة العمل reset خارجيا مفيد لوضع النظام فى حالة ابتدائية معروفة عندما يتوقف الميكروكونترولر عن تنفيذ تلبرنامج لأى سبب .


البرنامج :


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


البرنامج :
قبل البدء فى كتابة كود هذا المشروع تحتاج لإجراء بعض العمليات الرياضية على نتيجة التحويل من تناظرى لرقمى . أنت تعلم أنه فى أى تطبيق يستخدم التحويل من تناظرى إلى رقمى يحتاج إلى جهد مرجع ثابت لكى نحصل على نتيجة رقمية دقيقة لإشارة الدخل التناظرى .إذا لم يكن جهد المرجع ثابت ومستقر فإن خرج المحول ADC سوف لا يكون له معنى أو دلالة .
فى هذا المشروع يتم اختيار جهد المرجع الموجب ليساوى جهد المصدر أى Vdd(+5V) وجهد المرجع السالب ليساوى الصفر Vss . نتيجة لذلك سوف يقوم المحول ADC بتحويل أى جهد للدخل فى المدى بين
0-5 V إلى كود عدد رقمى بين 0-1023 . مصدر الخطأ الرئيسى فى هذا المشروع هو دقة المقاومات R1 و R2

الحسابات :

أى قيمة لجهد الدخل التناظري بين 0 – 5 V تناظرها قيمة واحدة من 1024 مستوى (كعداد من 0 إلى 1023)
أقل قيمة جهد يمكن تحويلها هى التى تناظر وحدة أو قسم أو عدة واحدة من الأقسام 1024 وهذا الجهد يعبر عن دقة عملية التحويل ويسمى بالقدرة على التحليل أو دقة القياس Resolution وواضح أنها تعدل ما قيمته قسم واحد من 1024 قسم وبالتالى يمكن التعبير عنها بقسمة أقصى جهد دخل ممكن وهو 5V على عدد الاقسام الكلى وهو 1024 لنحصل على الجهد المناظر لقسم واحد فقط ( أقل جهد يمكن قياسه) أى الدقة وتكون بالصيغة :
Resolution = 5/1024 = 0.0049 V/Count or Div

إى 0.0049 V لكل قسم واحد وهو أدنى جهد يمكن الاحساس به وتحويله إلى عدد رقمى هو الواحد .
ولمعرفة عدد الأقسام N الناتجة عن التحويل والمناظرة لجهد دخل معين Vx :
5V----1024
Vx-----N
N = ( Vx/5) * 1024
Or
N = Vx / 0.0049 Div
أى نقسم الجهد على الدقة
فى هذا المشروع :
أقصى جهد دخل فعلى لهذا المشروع هو Vx من خرج مقسم الجهد والذى يمكن التعبير عنه بالصيغة :

Vx = Vin/4


Vin = 4 Vx


But:


Vx=( 5/1024) * N =0.0049 * N


Then:


Vin = 4 * 0.0049 * N = 0.02 * N


لتجنب استخدام الأعداد الحقيقية من نوع floating يتم الضرب فى 100 فنحصل على
Vin = 2*N
الخلاصة : المعادلة السابقة تربط العلاقة بين الجهد المراد قياسه Vin وعدد أقسام المحول المناظرة N الناتجة .

مثال توضيحى :
نفترض أن جهد الدخل (قبل مقسم الجهد) Vin = 4.6V عندئذ يكون الجهد الواصل لمدخل الميكروكونترولر (بعد مقسم الجهد) يساوى نسبة قسمةالجهد ونفرض أنها 0.2457 (وهى الربع تقريبا) مضروبا فى جهد الدخل المطلوب قياسه أى :
Vx = 0.2457*Vin = 1.13V
وهذا الجهد هو يناظر كود عدد تحويل تناظرى قدره (نقسم على الدقة ) :


N = 1.13/0.0049 = 231


بضرب هذا العدد فى 2 نحصل على 0462 فى شكل رقم بأربع خانات
2*231 = 0462

هذه النتيجة ذات الأربع أرقام (خانات) (0462) سوف يكون الرقمين الأولين 62 يمثلان أرقام العشرات والآحاد لكسر الجهد المقاس بينما الخانتين الأخيرتين 04يمثلان أرقام آحاد وعشرات العدد الصحيح لهذا الجهد لذلك يكون الجهد المقاس 04.62 V وسوف يتم عرض أول ثلاثة أرقام فقط لتكون (04.6 V) .
سوف نحتاج إلى تعريف الطرف RA0/AN0 كمدخل تناظرى. ويتم استخدام الجهد Vdd = +5V كجهد مرجعى للمحول ADC .
التعليق على البرنامج :



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