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

   

magdy_3
:: مهندس متميز ::
تاريخ التسجيل: Aug 2006
الدولة: Philippines
المشاركات: 339
نشاط [ magdy_3 ]
قوة السمعة:
قديم 17-07-2017, 02:16 AM المشاركة 9   
افتراضي



السلام عليكم
قمة الروعة لا اجد مااقوله فى هذا العطاء
جزاك الله كل خير وجعله صدقة جارية يارب العالمين

اعلانات

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 17-07-2017, 05:40 AM المشاركة 10   
افتراضي


السلام عليكم ورحمه الله

حاولت أن امسك نفسي عن الرد حتي لا افسد تنسيق الموضوع ولكن لم استطيع .. الشكر قليل بحقق مهندسنا الغالي " فتح الله عبد العزيز "

بارك الله فيك وجعله في ميزان حسناتك ...

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

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


قياس درجة حرارة موجبة وسالبة باستخدام الحساس 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 المشاركة 12   
افتراضي


مشروع : تصميم نظام قياس درجة الحرارة يعتمد على الميكروكونترولر باستخدام مقاومة حرارية 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);
//==============
}

}

النتائج :









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



قياس درجة حرارة باستخدام الحساس LM35 وعرضها على 4 وحدات سفن سيجمنت

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










البرنامج :



كود:
/*
 * Project name: Multiplexing_7-Segment 4 UNITS
     MCU:             PIC16F877A , ADC , LM35
     Oscillator:      HS, 8.0000 MHz
     SW:              mikroC PRO
*/
#define Digit1 PORTD.B0 // THOUTHAND
#define Digit2 PORTD.B1 // HUNDRED
#define Digit3 PORTD.B2 // TENS
#define Digit4 PORTD.B3 // ONES

unsigned char Display (unsigned char digit)
  {
    unsigned char pattern;
    unsigned char  SEGMENT_MAP[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    pattern =  SEGMENT_MAP[digit] ;  //The pattern to return
    return (pattern);
  }

void main() {
  unsigned char DD1,DD2, DD3,DD4 ;
  unsigned int result; //
  float scale ;
  char num ;
  ADCON1= 0;           //
  TRISA.B0=1; // AN0 INPUT
  TRISD = 0;            // Configure PORTD as outputs , COMMON CATHODES
  TRISB = 0;            // Configure PORTB as outputs ,7 SEGMENT DATA PORT

Digit1 = 0;            //Disable digit 1
Digit2 = 0;            //Disable digit 2
Digit3 = 0;            //Disable digit 3
Digit4 = 0;            //Disable digit 4


  while(1){
  result=ADC_Read(0);  // Read analog value from channel 0
  scale = result * (5000.0/1023.0); // input analog voltage
  scale = scale /10.0 ; // input temp inc for LM35
  num = scale ;
 ///////////
       DD1 = num / 1000;       //Extract DD1 from result >>THOUTHAND
       PORTB = Display(DD1);    //Display the DD1
       Digit1 = 1;             //Enable digit 1
       Delay_Ms(10);            //a short 10ms delay
       Digit1 = 0;             //Disable digit 1
 /////////
       DD2 = (num/100) % 10;        // DD2 digit >>>HUNDRED
       PORTB = Display(DD2);    //Display the DD3
       Digit2 = 1;             //Enable digit 2
       Delay_Ms(10);            //a short 10ms delay
       Digit2 = 0;             //Disable digit 2
   ////////////
   DD3 = (num/10) % 10;       //Extract DD3 from result >>TENS
       PORTB = Display(DD3);    //Display the DD3
       Digit3 = 1;             //Enable digit 3
       Delay_Ms(10);            //a short 10ms delay
       Digit3 = 0;             //Disable digit 3
   /////////
   DD4 = num % 10;       //Extract DD4 from result >>ONES
       PORTB = Display(DD4);    //Display the DD4
       Digit4 = 1;             //Enable digit 4
       Delay_Ms(10);            //a short 10ms delay
       Digit4 = 0;             //Disable digit 4
    }
}


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




تطوير للتدريب السابق بوضع حرف :"C" للإشارة إلى الدرجات المئوية .

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



البرنامج :



كود:
/*
 * Project name: Multiplexing_7-Segment 4 UNITS
     MCU:             PIC16F877A , ADC , LM35 MOD
     Oscillator:      HS, 8.0000 MHz
     SW:              mikroC PRO
*/
#define Digit1 PORTD.B0 //  DIGIT 1 FROM LEFT , THOUTHAND
#define Digit2 PORTD.B1 // DIGIT 2 FROM LEFT , HUNDRED
#define Digit3 PORTD.B2 // DIGIT 3 FROM LEFT , TENS
#define Digit4 PORTD.B3 // DIGIT 4 FROM LEFT ,  ONES

unsigned char Display (unsigned char digit)
  {
    unsigned char pattern;
    unsigned char  SEGMENT_MAP[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    pattern =  SEGMENT_MAP[digit] ;  //The pattern to return
    return (pattern);
  }

void main() {
  unsigned char DD1,DD2, DD3,DD4 ;
  unsigned int ADC_result; //
  float scale ;
  unsigned int num ;
  ADCON1= 0;           //
  TRISA.B0=1; // AN0 INPUT
  TRISD = 0;            // Configure PORTD as outputs , COMMON CATHODES
  TRISB = 0;            // Configure PORTB as outputs ,7 SEGMENT DATA PORT

Digit1 = 0;            //Disable digit 1
Digit2 = 0;            //Disable digit 2
Digit3 = 0;            //Disable digit 3
Digit4 = 0;            //Disable digit 4


  while(1){
  ADC_result=ADC_Read(0);  // Read analog value from channel 0
  scale = ADC_result * (5000.0/1023.0); // input analog voltage
  num = scale /10.0 ; // input temp inc for LM35
 ///////////
       DD1 = num / 100;       //Extract DD1 from ADC_result >>THOUTHAND
       PORTB = Display(DD1);    //Display the DD1
       Digit1 = 1;             //Enable digit 1
       Delay_Ms(10);            //a short 10ms delay
       Digit1 = 0;             //Disable digit 1
 /////////
       DD2 = (num/10) % 10;        // DD2 digit >>>HUNDRED
       PORTB = Display(DD2);    //Display the DD3
       Digit2 = 1;             //Enable digit 2
       Delay_Ms(10);            //a short 10ms delay
       Digit2 = 0;             //Disable digit 2
   ////////////
   DD3 = num % 10;       //Extract DD3 from ADC_result >>TENS
       PORTB = Display(DD3);    //Display the DD3
       Digit3 = 1;             //Enable digit 3
       Delay_Ms(10);            //a short 10ms delay
       Digit3 = 0;             //Disable digit 3
   /////////
   //DD4 = num % 10;       //Extract DD4 from ADC_result >>ONES
       PORTB = 0x39;    //Display C CHARACTER
       Digit4 = 1;             //Enable digit 4
       Delay_Ms(10);            //a short 10ms delay
       Digit4 = 0;             //Disable digit 4
    }
}


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




إزالة حرف "C" واستخدام خانة الآحاد لبيان كسر الآحاد مع عرض النقطة العشرية على وحدة السفن سيجمنت :

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




البرنامج :



كود:
/*
 * Project name: Multiplexing_7-Segment 4 UNITS
     MCU:             PIC16F877A , ADC , LM35 MOD
     Oscillator:      HS, 8.0000 MHz
     SW:              mikroC PRO
*/
#define Digit1 PORTD.B0 //  DIGIT 1 FROM LEFT , THOUTHAND
#define Digit2 PORTD.B1 // DIGIT 2 FROM LEFT , HUNDRED
#define Digit3 PORTD.B2 // DIGIT 3 FROM LEFT , TENS
#define Digit4 PORTD.B3 // DIGIT 4 FROM LEFT ,  ONES

unsigned char Display (unsigned char digit)
  {
    unsigned char pattern;
    unsigned char  SEGMENT_MAP[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    pattern =  SEGMENT_MAP[digit] ;  //The pattern to return
    return (pattern);
  }

void main() {
unsigned char DD1,DD2, DD3,DD4 ;

float result; //
unsigned int result1;
  ADCON1= 0;           //
  TRISA.B0=1; // AN0 INPUT
  TRISD = 0;            // Configure PORTD as outputs , COMMON CATHODES
  TRISB = 0;            // Configure PORTB as outputs ,7 SEGMENT DATA PORT

Digit1 = 0;            //Disable digit 1
Digit2 = 0;            //Disable digit 2
Digit3 = 0;            //Disable digit 3
Digit4 = 0;            //Disable digit 4


  while(1){
  result=ADC_Read(0);  // Read analog value from channel 0 ,0 to 1023 
  result = result * (5000.0/1023.0); // input analog voltage
  result = result /10.0 ; // input temp in C for LM35 0.0 to 150.0
   ///////////
 result = result *10.0 ; // float 0.0 to 1500.0
 result1=result; //integer 0 to 1500 to get fraction
 /////////////
       DD1 = result1 / 1000;       //Extract DD1 from result >>THOUTHAND(hundred)
       PORTB = Display(DD1);    //Display the DD1
       Digit1 = 1;             //Enable digit 1
       Delay_Ms(10);            //a short 10ms delay
       Digit1 = 0;             //Disable digit 1
 /////////
       DD2 = (result1/100) % 10;        // DD2 digit >>>HUNDRED (tens)
       PORTB = Display(DD2);    //Display the DD3
       Digit2 = 1;             //Enable digit 2
       Delay_Ms(10);            //a short 10ms delay
       Digit2 = 0;             //Disable digit 2
   ////////////
   DD3 = (result1/10) % 10;       //Extract DD3 from result >>TENS (ones)
       PORTB = Display(DD3);    //Display the DD3
       Digit3 = 1;             //Enable digit 3
       Delay_Ms(10);            //a short 10ms delay
       Digit3 = 0;             //Disable digit 3
   /////////
   DD4 = result1 % 10;       //Extract DD4 from result >>ONES(fraction)
       //PORTB = 0x39;    //Display C CHARACTER
   PORTB = Display(DD4);
       Digit4 = 1;             //Enable digit 4
       Delay_Ms(10);            //a short 10ms delay
       Digit4 = 0;             //Disable digit 4
    }
}


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


فكرة إنشاء ثرموستات باستخدام المقاومة السالبة NTC والمحول ADC ووحدة العرض LCD مع المترجم ميكرو سى
المقاومة السالبة المستخدم من النوع NTC / NTSA0WB203 وهذا النوع موجود فى برنامج ISIS .
هذه المقاومة لها معامل أو ثابت يسمى بيتا “ = 4050” ، ولها مقاومة قيمتها 20 كيلوأوم عند درجة حرارة 25 درجة مئوية .

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



يتم تشكيل مقسم جهد من مصدر جهد (بطارية ، على سبيل المثال ) والمقاومة السالبة NTC ومقاومة ثابتة R1 بقية 10 كيلوأوم ، وحساب درجة الحرارة من المعادلات التالية :



كود:
VT=VB * RT/R1+RT
VB*RT = VT*R1 + VT * RT 
VT*R1= RT(VB-VT)
RT = VT*R1/(VB-VT) = 10000VT/(5-VT)

البرنامج :

كود:
// 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
float tv,tr,temp,y;                 //Equation variables
   unsigned unsigned int value;
   int Tc ;
   char text [7] ;

void main() {

   lcd_init();
   Lcd_Cmd(_LCD_CLEAR);
  Lcd_Cmd(_LCD_CURSOR_OFF);
  Lcd_Out(1,1,"ADC NTC TEMP." );
   while (1) {
      value = ADC_Read(0);

      tv = 5.0 * value / 1023.0;

      tr = tv * 10000.0 / (5.0 - tv);

      y = log(tr/20000.0);
       y = (1.0/298.15) + (y *(1.0/4050.0));

      temp=1.0/y;
      temp = temp -273.15;
	  Tc = temp ;
	  IntToStr(Tc , text);
	  Lcd_Out(2,1,text);
          Lcd_Chr_Cp(223);
	  Lcd_Chr_Cp('C');

   }
}



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