![]() |
#1
|
||||
|
||||
![]()
مفتاح التحويل الأوتوماتيكى للقدرة من المصدر الرئيسى إلى المولد الاحتياطى للمستشفيات والمصانع باستخدام الميكروكونترولر PIC16F877A
الخطوة الأولى والأساسية : الاحساس وبيان جهد الدخل للشبكة العمومية Mains : الدائرة الكهربية : ![]() البرنامج : كود:
///////////////////////////////////////////////////////////// // Project : ATS ( Automatic Transfer Switch) // 1- Mains voltage // PIC16F877A , 4MHz , Mikroc-Pro // Eng.F.Abdelaziz // http://www.eeecb.com/vb/index.php //5/3/2013 /////////////////////////////////////////////////////////// // LCD module connections sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; // End LCD module connections ///////////////////////////////////////////////////////////////////////// unsigned int ADC_value ; char *text = "0000"; long volt_long ; char txt1[] = "Mains Voltage: " ; ///////////////////////////////////////////////////////////////////// void main(){ TRISA=0x01 ; //RA0 => analog input Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // Clear display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off Lcd_Out(1,1,txt1); // Write text in first row //////////////////////////////////////////////////////////////////////////////////// while(1){ ADC_value = ADC_Read(0) ; // value from 0 to 1023 volt_long = (long) ADC_value * 220 /1023 ; // change to volt value from 0 to 220 ///////////////////////////////////////////////////////////////////////////////////////// ByteToStr(volt_long,text); // change volt value to text => 4 characters including null Lcd_Out(2,1,text); // display volt text => 0 to 220 ///////////////////////////////////////////////////////////////////////////////////////////// Lcd_Chr(2, 4, 'V'); // Write character "V" at row 2, column 4 after volt value } } |
#2
|
|||
|
|||
![]()
اخي الحبيب هل تستطيع ارسال الدائرة الموجودة بهذا الرابط مع الكود لاني لم اجد المشروع من ضمن المشاريع الموجدة في الرابط
http://www.dbaasco.com/vb/showthread...88%D8%B1%D9%8A |
#3
|
||||
|
||||
![]()
الخطوة الثانية :
برمجة دائرة بيان هبوط الجهد عن حد معين , 15% على سبيل المثال . برمجة دائرة بيان السرعة , ومفتاح يعتمد على السرعة . الدائرة الكهربية : ![]() البرنامج : كود:
///////////////////////////////////////////////////////////// // Project : ATS ( Automatic Transfer Switch) // 1- Mains voltage // PIC16F877A , 4MHz , Mikroc-Pro // Eng.F.Abdelaziz // http://www.eeecb.com/vb/index.php //5/3/2013 /////////////////////////////////////////////////////////////////// // LCD module connections sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; // End LCD module connections ///////////////////////////VOLT ///////////////////////////////////////////// #define UNDER_VOLTAGE PORTD.B0 unsigned long ADC_value, VOLT_VALUE ; char *VOLT = "0000"; //////////////////////////////// RPM ///////////////////////////////// #define RPM_SWITCH PORTD.B1 #define ON 1 #define OFF 0 unsigned long RPM_Value; char *RPM = "00000"; void main(){ TRISA.B0=1 ; //RA0 => analog input TRISA.B4 = 1; // Inut at RA4/T0CKI PORTA.B4=0; TRISB=0; PORTB=0; TRISD=0; //RPM Switch Output PORTD=0; OPTION_REG=0b00101000; //Prescaler(1:1) , T0CKI=1 for counter mode Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // Clear display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off ////////////////////////////////////////////////////////////////////// while(1){ /////////////////////// ADC_value = ADC_Read(0) ; // value from 0 to 1023 VOLT_VALUE = ADC_value * 220 /1023 ; // change to volt value from 0 to 220 //////////////////////////////////////////////////////////////////////////////////////////// ByteToStr(VOLT_VALUE,VOLT); // change volt value to text => 4 characters including null Lcd_Out(2,1,VOLT); // display volt text => 0 to 220 Lcd_Out(2,5,"VOLT"); ////////////////////////////////////////////////////////////////////////////////////////////// //Lcd_Chr(2, 4, 'V'); // Write character "V" at row 2, column 4 after volt value ///////////////////////////////////////////////// if(VOLT_VALUE<=185) UNDER_VOLTAGE=ON ;else UNDER_VOLTAGE=OFF; /////////////////////////////////////////////////////////// /* The counter will be active for 1 sec and the number of pulses arrived during this interval will be recorded, and multiplied by 60 to get the RPM . */ TMR0=0; //The counter will be active for 1 sec, start Delay_ms(1000); // Wait for 1 sec RPM_Value = TMR0*60; /////////////////////////////////////////////////////////////// WordToStr(RPM_Value,RPM); // change RPM value to text => 6 characters including null Lcd_Out(1,1,RPM); //////////////////////////////////////////////////// Lcd_Out(1,7,"RPM"); ////////////////////////////////////////////////// if(RPM_Value > 600) RPM_SWITCH = ON ; else RPM_SWITCH = OFF; //////////////////////////////////////////////////////////// } } |
#4
|
||||
|
||||
![]()
إضافة دائرة بيان تردد المصدر والتحكم من خلالها :
الدائرة الكهربية : ![]() البرنامج : كود:
///////////////////////////////////////////////////////////// // Project : ATS ( Automatic Transfer Switch) // 1- Mains voltage // PIC16F877A , 4MHz , Mikroc-Pro // Eng.F.Abdelaziz // http://www.eeecb.com/vb/index.php //5/3/2013 /////////////////////////////////////////////////////////////////// // LCD module connections sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; // End LCD module connections //////////////////////////////////////////////////////////// #define ON 1 #define OFF 0 ///////////////////////////VOLT ///////////////////////////////////////////// #define UNDER_VOLTAGE PORTD.B0 unsigned int ADC_value ; long VOLT_VALUE ; char *VOLT = "0000"; //////////////////////////////// RPM ///////////////////////////////// #define RPM_SWITCH PORTD.B1 unsigned long RPM_Value; char *RPM = "00000"; ////////////////////////////////////////// #define FREQUY_SWITCH PORTD.B2 unsigned long FREQUENCY_VALUE ; char *Hz = "0000"; ////////////////////////////////////////////////////////////////////// void main(){ TRISA.B0=1 ; //RA0 => analog input TRISA.B4 = 1; // Inut at RA4/T0CKI PORTA.B4=0; TRISB=0; PORTB=0; TRISD=0; //RPM Switch Output PORTD=0; OPTION_REG=0b00101000; //Prescaler(1:1) , T0CKI=1 for counter mode Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // Clear display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off ////////////////////////////////////////////////////////////////////// while(1){ /////////////////////// ADC_value = ADC_Read(0) ; // value from 0 to 1023 VOLT_VALUE = (long)ADC_value * 220 /1023 ; // change to volt value from 0 to 220 //////////////////////////////////////////////////////////////////////////////////////////// ByteToStr(VOLT_VALUE,VOLT); // change volt value to text => 4 characters including null Lcd_Out(2,1,VOLT); // display volt text => 0 to 220 //Lcd_Out(2,5,"VOLT"); ////////////////////////////////////////////////////////////////////////////////////////////// Lcd_Chr(2, 4, 'V'); // Write character "V" at row 2, column 4 after volt value ///////////////////////////////////////////////// if(VOLT_VALUE<=185) UNDER_VOLTAGE=ON ;else UNDER_VOLTAGE=OFF; /////////////////////////////////////////////////////////// /* The counter will be active for 1 sec and the number of pulses arrived during this interval will be recorded, and multiplied by 60 to get the RPM . */ TMR0=0; //The counter will be active for 1 sec, start Delay_ms(1000); // Wait for 1 sec RPM_Value = TMR0*60; FREQUENCY_VALUE = TMR0 ; /////////////////////////////////////////////////////////////// WordToStr(RPM_Value,RPM); // change RPM value to text => 6 characters including null Lcd_Out(1,1,RPM); //////////////////////////////////////////////////// Lcd_Out(1,7,"RPM"); ////////////////////////////////////////////////// if(RPM_Value > 600) RPM_SWITCH = ON ; else RPM_SWITCH = OFF; //////////////////////////////////////////////////////////// ByteToStr(FREQUENCY_VALUE,Hz); Lcd_Out(2,6,Hz); //////////////////////////////////////////////////// Lcd_Out(2,9,"Hz"); ////////////////////////////////////////////////// if(FREQUENCY_VALUE < 40) FREQUY_SWITCH = ON ; else FREQUY_SWITCH = OFF; //////////////////////////////////////////////////////////// } } |
#5
|
||||
|
||||
![]()
متميز كعادتك أستاذنا
|
#6
|
|||
|
|||
![]()
موضوع جدا رائع
|
#7
|
|||
|
|||
![]()
ما شاء الله
موضوع مميز جزاك الله خير الجزاء رجاء شرح الكود وبخاصة الجزء الخاص بالتردد وما قيمة الفولت الداخل اليه؟ وشكرا مقدما فوزي |
#8
|
|||
|
|||
![]()
السلام عليكم ورحمة الله
المنهدس فتح الله ارجو منكم شرح العملية والكود للاهمية وجزاك الله خير الجزاء فوزي |
#9
|
|||
|
|||
![]()
رائع
|
#10
|
|||
|
|||
![]()
مشكور اخي اعجبني الموضوع كثير حبدا لو ارفقت الملفات الخاصة بالمشروع تمنيت يكون ب لغة plc ببرنامج ldmicro
|
![]() |
مواقع النشر (المفضلة) |
أدوات الموضوع | |
انواع عرض الموضوع | |
|
|