 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:332
|
|
16-07-2017, 01:12 PM
المشاركة 3
|
|
تدريب تمهيدى :
الغرض :
استعراض التعامل مع المحول 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);
}
|