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

أدوات الموضوع

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 19-10-2014, 01:09 PM المشاركة 1   
x4 منظم الجهد قابل للبرمجه Twitter FaceBook Google+



السلام عليكم
في هذا المشروع هو لمنظم الجهد يتم برمجته على اقل جهد واعلى جهد مسموح به وزمن لاقل الجهد وزمن لاعلى الجهد وزمن أنتظار في حاله الجهد الطبيعي اضافه الى برمجه حساس الجهد وبرمجه تابات المحوله L-01 الى L-08
وهذه هي صوره حساس الجهد


وهذا هو كود مشروع
كود:
#define relay             portb
#define relay_dir         trisb
#define segment           portc
#define segment_dir       trisc
#define enable            0
#define disenable         1
#define is                ==
#define pressed           0
#define set_bit(var,pos)  var|=(1<<pos)     // 10001000 & 00001000
#define clear_bit(var,pos)  var&=~(1<<pos)// var = var&

sbit en1                at RD0_bit;
sbit en1_dir            at trisd0_bit;
sbit en2                at RD1_bit;
sbit en2_dir            at trisd1_bit;
sbit en3                at RD2_bit;
sbit en3_dir            at trisd2_bit;
sbit en4                at RD3_bit;
sbit en4_dir            at trisd3_bit;

sbit sw_ok              at RA1_bit;
sbit sw_ok_dir          at trisa1_bit;
sbit sw_inc             at RA2_bit;
sbit sw_inc_dir         at trisa2_bit;
sbit sw_dec             at RA3_bit;
sbit sw_dec_dir         at trisa3_bit;
sbit sw_exit            at RA4_bit;
sbit sw_exit_dir        at trisa4_bit;
unsigned int value=0, v_min=0 , v_max=0  , vin=0 , vin2 ;
unsigned char  cont=0 , cont1=0;
unsigned char x=0, select_en=0 , setting=0 , address=0 , kk=0 ;
char tap_transformer ,time=0 ,point=0 ,clear=0;
unsigned int   time_vmin=0, time_vmax=0 ,time_waiting=0 ;
unsigned int   time_vmin_cont=0, time_vmax_cont=0 ,time_waiting_cont=0 ;
unsigned int tap[8];
const unsigned int ratio_transformer[]={130,170,210,240,270};
float voltage=0 , factor=0;
//const char segment1[]={192,249,164,176,153,146,130,248,128,144};
const char segment1[]  ={63,6,91,79,102,109,125,7,127,111,56,64,62,118,120,113};//56=L ,64=-, 62=U ,118=H;t=120 . F=113
//****************************************************//
void InitTimer0();
void setting_transformer();
void voltage_transformer();
void protection_voltage();
void calculate_voltage();
void taping_transformer();
//*************************************************//
void micro_init()
{
 adcon1=142;
 InitTimer0();
 segment_dir=0;
 relay_dir=0;
 en1_dir=0;
 en2_dir=0;
 en3_dir=0;
 en4_dir=0;
 en1=disenable;
 en2=disenable;
 en3=disenable;
 en4=disenable;
 segment=0;// off segment
 relay=0;//relay off
 sw_ok_dir=1;
 sw_inc_dir=1;
 sw_dec_dir=1;
 sw_exit_dir=1;
 ADC_Init();
 delay_ms(25);
 //tap_transformer= EEPROM_Read(0);
 if(EEPROM_Read(1)==0xFF)
      {
       delay_ms(50);
       EEPROM_Write(1,0);
       EEPROM_Write(2,200);
       v_min=200;//default
       delay_ms(50);
      }
 else v_min=EEPROM_Read(2)+(100*EEPROM_Read(1));
 
 if(EEPROM_Read(3)==0xFF)
      {
       delay_ms(50);
       EEPROM_Write(3,0);
       EEPROM_Write(4,3);// 3 sec
       time_vmin=3;// 3 sec default
       delay_ms(50);
      }
 else time_vmin= EEPROM_Read(4)+(100*EEPROM_Read(3));
 
 if(EEPROM_Read(5)==0xFF)
      {
       delay_ms(50);
       EEPROM_Write(5,0);
       EEPROM_Write(6,245);
       v_max=245;// default
       delay_ms(50);
      }
 else v_max=EEPROM_Read(6)+(100*EEPROM_Read(5));
 
 if(EEPROM_Read(7)==0xFF)
      {
       delay_ms(50);
       EEPROM_Write(7,0);
       EEPROM_Write(8,3);
       time_vmax=3;// 3 sec default
       delay_ms(50);
      }
 else time_vmax= EEPROM_Read(8)+(100*EEPROM_Read(7));
 
 if(EEPROM_Read(25)==0xFF)
      {
       delay_ms(50);
       EEPROM_Write(25,0);
       EEPROM_Write(26,180);
       time_waiting=180;//3min  default
       delay_ms(50);
      }
 else time_waiting= EEPROM_Read(26)+(100*EEPROM_Read(25));
 
 if(EEPROM_Read(27)==0xFF)
      {
       delay_ms(50);
       EEPROM_Write(28,0);
       EEPROM_Write(27,0);
       factor=0;// deault
       delay_ms(50);
      }
 else factor= (EEPROM_Read(28)+(100*EEPROM_Read(27)))/10;
 delay_ms(250);
}
//**************************************************//
//Timer0  // 130 170 220 240 260
//Prescaler 1:32; TMR0 Preload = 100; Actual Interrupt Time : 4.992 ms

//Place/Copy this part in declaration section
void InitTimer0(){
  OPTION_REG         = 0x84;
  TMR0                 = 100;
  INTCON         = 0xA0;
}

void Interrupt()
{
 if(setting!=0)clear=0;
  if (TMR0IF_bit)
    {
     TMR0IF_bit         = 0;
     TMR0               = 100;
    //Enter your code here
    select_en++;
    cont++;
    cont1++;
    if(cont >= 200) // setting every 1s
                   {
                    cont=0;
                    time_vmin_cont++;
                    time_vmax_cont++; 
                   }
     if(cont1 >= 200)// setting every 1s
                   {
                    cont1=0;
                    time_waiting_cont++ ;
                   }
    if(select_en==5) select_en=1;
    if(select_en==1){
                     segment=0;
                     en1=enable; en2=disenable; en3=disenable;  en4=disenable;
                     if(setting is 0)
                         {
                          if((value/1000)!=0)
                                    {
                                     segment= segment1[value/1000];
                                     clear.f0=0;
                                    }
                          else { clear.f0=1;segment=0;}
                          
                         }
                     else if(setting is 1 ||setting is 3  )segment=segment1[12];
                     else if(setting is 2 || setting is 4)segment=segment1[14];
                     else if( setting is 5 )segment=segment1[10];
                     else if( setting is 6 )segment=segment1[15];
                    }
   else if(select_en==2){
                          segment=0;
                          en1=disenable; en2=enable; en3=disenable;  en4=disenable;
                          if(setting is 0)
                              {
                               if(clear.f0==1 && ((value%1000)/100)==0){ clear.f1=1;segment=0;}
                               else 
                                   {
                                    segment= segment1[(value%1000)/100];
                                    clear.f1=0;
                                   }

                              }
                          else if(setting is 1)segment=segment1[10];
                          else if(setting is 2 || setting is 4 || setting is 5 || setting is 6 )segment=segment1[11];
                          else if(setting is 3)segment=segment1[13];

                        }
    else if(select_en==3){
                          segment=0;
                          en1=disenable; en2=disenable; en3=enable;  en4=disenable;
                          if(point==0 && clear.f0==1 && clear.f1==1 && ((value%1000%100/10)==0))
                                              {
                                               segment=0;
                                              }
                          else if(point==1)segment= segment1[(value%1000%100)/10]+128;
                          else segment= segment1[(value%1000%100)/10];
                         }

    else if(select_en==4){
                          segment=0;
                          en1=disenable; en2=disenable; en3=disenable;  en4=enable;
                          segment= segment1[value%1000%100%10];
                         }

  }
}
//****************************************************************************//
void main() 
{
 micro_init();
 taping_transformer();
 while(1)
         {
          if(sw_ok is pressed) {
                                delay_ms(20);
                                while(sw_ok is pressed);
                                delay_ms(20);
                                setting_transformer();
                               }

          calculate_voltage();
          protection_voltage();
          delay_ms(100);
         }

}
//****************************************************************************//
void setting_transformer()
{
 char  value2=1, dd1=0,dd2=0 ;
 kk=0;
 time=0;
 setting=1;
 address=0;
 value=0;
 while(1)
        {
         if(sw_inc is pressed){delay_ms(250); dd1=1;}
         if(sw_dec is pressed){delay_ms(250); dd2=1;}
         if(dd1 is 1 && kk is 0)
                             {  dd1=0;
                                if(value2 <=13)value2++;
                                if(value2 is 13)
                                                {
                                                 setting=2;
                                                 time=1;
                                                 value=0;
                                                }
                                else if(value2 is 14)
                                                {
                                                 setting=6;
                                                 time=2;
                                                 value=0;
                                                }
                               else if(value2<5){
                                              setting=value2;
                                              value= 0;
                                             }
                               else if(value2 >=5 && value2 <13)
                                                             {
                                                              setting=5;
                                                              value=value2-4;
                                                             }
                             }
         else if(dd2 is 1 && kk is 0)
                              {  
                               dd2=0;
                               if(value2 !=0)  value2--;
                               if(value2 is 0) value2=1;
                               if(value2<5){
                                           setting=value2;
                                           value= 0;
                                          }
                               else if(value2 is 13){
                                                     setting=2;
                                                     time=1;
                                                     value=0;
                                                    }
                               else {
                                     setting=5;
                                     value=value2-4;
                                    }
                              }
         else if(dd1 is 1 && kk is 1)
                              {
                               dd1=0;
                               value++;
                              }
         else if(dd2 is 1 && kk is 1)
                              {
                               dd2=0;
                               if(value!=0) value--;
                              }
        if(sw_ok is pressed )
                               {
                                delay_ms(20);
                                while(sw_ok is pressed);
                                delay_ms(5);
                                point=0;
                                if(time is 1)
                                             {
                                              address=26; // 2*time=2*13=26
                                              time=0;
                                             }
                                if(time is 2)
                                             {
                                              point=1;
                                              address=28; // 2*time=2*14=28
                                              time=0;
                                             }
                               else { 
                                      address=value2*2;

                                     }
                                if(kk is 0){ value=EEPROM_Read(address)+(100*EEPROM_Read(address-1));
                                                  if(value>1000)value=200; // default value
                                                 }
                                kk++;
                                setting=0;
                               }
          if(kk is 2){
                       delay_ms(50);
                       EEPROM_Write((address-1),(value/100));
                       EEPROM_Write((address),(value%100));
                       kk=0;
                       dd1=1;
                       delay_ms(50);
                      }
         if(sw_exit is pressed){
                                setting=0;
                                point=0;
                                delay_ms(250);
                                // apdate values
                                v_min=EEPROM_Read(2)+(100*EEPROM_Read(1));
                                time_vmin= EEPROM_Read(4)+(100*EEPROM_Read(3));
                                v_max=EEPROM_Read(6)+(100*EEPROM_Read(5));
                                time_vmax= EEPROM_Read(8)+(100*EEPROM_Read(7));
                                time_waiting= EEPROM_Read(26)+(100*EEPROM_Read(25));
                                factor=(EEPROM_Read(28)+100*EEPROM_Read(27))/10;
                                delay_ms(25);
                                return;
                              }

        }

}
//***************************************************************************//
void taping_transformer()
{
 for(x=0;x<8;x++)
                  {
                    address=(x*2)+10;
                    tap[x]=EEPROM_Read(address)+(100*EEPROM_Read(address-1));
                  }
}
//**************************************************************************//
void calculate_voltage()
{
 voltage= ADC_Read(0)*4.8875;// Get 10-bit results of AD conversion
 voltage =voltage *factor;
 voltage= voltage/1000; // change from mv to volt
 voltage_transformer();
}
//****************************************************************************//
void voltage_transformer()
{
 unsigned int  measuring1=0 , measuring2=0;
 float measuring3;
 for(x=0;x<8;x++)
                  {
                    if(voltage>=tap[x-1] && voltage<tap[x] )
                                               {
                                                if((x%2)!=0)
                                                              {
                                                               set_bit(relay,3);
                                                               measuring2=ratio_transformer[3];
                                                              }
                                                else {
                                                       clear_bit(relay,3);
                                                       measuring2=ratio_transformer[4];
                                                      }
                                                if(x>=2 )
                                                         {
                                                          set_bit(relay,0);
                                                          measuring1=ratio_transformer[1];
                                                         }
                                                else  clear_bit(relay,0);
                                                if(x>=4 ){
                                                          set_bit(relay,1);
                                                          measuring1=ratio_transformer[2];
                                                         }
                                                else  clear_bit(relay,1);
                                                if(x>=6 ){
                                                          set_bit(relay,2);
                                                          measuring1=ratio_transformer[4];
                                                         }
                                                else  clear_bit(relay,2);
                                               if(x<2) measuring1=ratio_transformer[0];

                                               }
                   else if (voltage>=tap[7]){
                                             measuring1=ratio_transformer[4];
                                             measuring2=ratio_transformer[3];
                                             relay=(relay & 0xF0) +0b00001111;
                                            }
                   else if (voltage<tap[0])
                                          {
                                           measuring1=ratio_transformer[0];
                                           measuring2=ratio_transformer[4];
                                           relay=relay & 0xF0 ;
                                          }

                  }
 measuring3=(measuring2* voltage)/measuring1;
 value= measuring3;
}
//***********************************************************************//
void protection_voltage()
{
  if(value<v_min )
                    {
                     if(time_vmin_cont>=time_vmin) 
                                         {
                                           clear_bit(relay,4);// protection relay// output relay =off// output relay =off
                                           cont1=0;
                                           time_waiting_cont=0;
                                         }
                    }
  else if(value>v_max )
                     {
                      if(time_vmax_cont>=time_vmax)
                                         {
                                          clear_bit(relay,4);// protection relay// output relay =off
                                          cont1=0;
                                          time_waiting_cont=0;
                                         }
                     }
 if(value>=v_min && value<=v_max)
                                      {
                                       if(time_waiting_cont>=time_waiting)
                                                             {
                                                               set_bit(relay,4);// protection relay
                                                               // output relay =on
                                                             }
                                       cont=0;// reset time for protection
                                       time_vmin_cont=0;
                                       time_vmax_cont=0;
                                      }
}
طبعا يفضل في محاكاه أستخدام بروتيس الاصدار السابع لان الثامن فيه مشكله لايحفظ داتا في ايبروم
http://up.top4top.net/downloadf-top4...1d521-rar.html

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً Ahmed Desoky ( شكر العضو على هذه المشاركة )
اعجاب Ahmed Desoky ( أعجبته المشاركة )
اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 19-10-2014, 01:47 PM المشاركة 2   
افتراضي


شرح الكود
تعريف او أستخدام كلمات بدلا من استخدام ريجيسترات مثل relay تعني portb
و relay_dir تعني trisb بأستخدام الامر تعريف define#

كود:
#define relay             portb
#define relay_dir         trisb
#define segment           portc
#define segment_dir       trisc
#define enable            0
#define disenable         1
#define is                ==
#define pressed           0
==========================================
تعريف مايكرو لداله سيت وكلير
كود:
#define set_bit(var,pos)  var|=(1<<pos)     // 10001000 & 00001000
#define clear_bit(var,pos)  var&=~(1<<pos)// var = var&
==========================================
تعريف ماداخل ومخارج بأستحدام الامر sbit at
كود:
sbit en1                at RD0_bit;
sbit en1_dir            at trisd0_bit;
sbit en2                at RD1_bit;
sbit en2_dir            at trisd1_bit;
sbit en3                at RD2_bit;
sbit en3_dir            at trisd2_bit;
sbit en4                at RD3_bit;
sbit en4_dir            at trisd3_bit;

sbit sw_ok              at RA1_bit;
sbit sw_ok_dir          at trisa1_bit;
sbit sw_inc             at RA2_bit;
sbit sw_inc_dir         at trisa2_bit;
sbit sw_dec             at RA3_bit;
sbit sw_dec_dir         at trisa3_bit;
sbit sw_exit            at RA4_bit;
sbit sw_exit_dir        at trisa4_bit;
=======================================
تعريف المتغيرات المستخدمه
كود:
unsigned int value=0, v_min=0 , v_max=0  , vin=0 , vin2 ;
unsigned char  cont=0 , cont1=0;
unsigned char x=0, select_en=0 , setting=0 , address=0 , kk=0 ;
char tap_transformer ,time=0 ,point=0 ,clear=0;
unsigned int   time_vmin=0, time_vmax=0 ,time_waiting=0 ;
unsigned int   time_vmin_cont=0, time_vmax_cont=0 ,time_waiting_cont=0 ;
====================================
تعريف مصفوفه مجال التحكم للمحول سأشرح فيما بعد كيف نحسبها
كود:
unsigned int tap[8];
======================================
هذه تابات خارجه من محول يعني القيم التصميمه
كود:
const unsigned int ratio_transformer[]={130,170,210,240,270};
========================================
مصفوفه لتشغيل السفن السكمنت
كود:
const char segment1[]  ={63,6,91,79,102,109,125,7,127,111,56,64,62,118,120,113};//56=L ,64=-, 62=U ,118=H;t=120 . F=113
========================================
تعريف الدوال الي تمت أستخدامها في البرنامج لان ضروري تعرف الداله حتى تستطيع أستخدام داله في اي مكان دون ان يعطيك كومبايلر اي error
كود:
void InitTimer0();
void setting_transformer();
void voltage_transformer();
void protection_voltage();
void calculate_voltage();
void taping_transformer();

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

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 19-10-2014, 02:07 PM المشاركة 3   
افتراضي


تعريف داله تهيئه للمايكرو والتي أسمها
كود:
void micro_init()
حيث عرفنا ان RA0 هو طرف انلوك والباقي ديجيتل
كود:
adcon1=142;
==============================
تهيئه تايمر0
كود:
InitTimer0();
=========================
تعريف مداخل ومخارج مع أطفاء كل مخارج
كود:
 segment_dir=0;
 relay_dir=0;
 en1_dir=0;
 en2_dir=0;
 en3_dir=0;
 en4_dir=0;
 en1=disenable;
 en2=disenable;
 en3=disenable;
 en4=disenable;
 segment=0;// off segment
 relay=0;//relay off
 sw_ok_dir=1;
 sw_inc_dir=1;
 sw_dec_dir=1;
 sw_exit_dir=1;
====================================
أستدعاء او تهيئه داله القراءه انلوك ADC
كود:
ADC_Init();
===================================
قراءه اقل فولتيه من العنوان 1 و2 من ايبروم قبل ذلك نتفحص العنوان 1 الي مفروض يمثل القيمه الاكبر والعنوان 2 يمثل القيمه الاصغر وبتأكيد اذا كنا خزنا داتا فأن القيمه الاكبر لن تكون 0xFF وهي القيمه الافتراضيه مخزونه في ايبروم فأذا كان عنوان 1 = 0xFF أذن اجعل قيمه افتراضيه لاقل جهد هو 200 فولت وخزن ذلك في ايبروم لغرض التعديل عليها فيما بعد
كود:
if(EEPROM_Read(1)==0xFF)
      {
       delay_ms(50);
       EEPROM_Write(1,0);
       EEPROM_Write(2,200);
       v_min=200;//default
       delay_ms(50);
      }
اما اذا كانت هناك اصلا داتا تمت خزنها اذن نقوم بقراءتها
كود:
 else v_min=EEPROM_Read(2)+(100*EEPROM_Read(1));
وينطبق الحال على time_vmin وطبعا هو تايم الي بعدها يقوم بأطفاء ريلي الاخراج يعني لما تهبط الفولتيه عن القيمه المسموحه لها فان هناك فتره زمنيه انت تحددها والتي اسمها time_vmin وبعدها يتم أطفاء رلي اخراج
كود:
if(EEPROM_Read(3)==0xFF)
      {
       delay_ms(50);
       EEPROM_Write(3,0);
       EEPROM_Write(4,3);// 3 sec
       time_vmin=3;// 3 sec default
       delay_ms(50);
      }
 else time_vmin= EEPROM_Read(4)+(100*EEPROM_Read(3));
ايضا نفس كلام مع اقصى الجهد وزمن التاخيري قبل أطفاء ريلي الاخراج
كود:
if(EEPROM_Read(5)==0xFF)
      {
       delay_ms(50);
       EEPROM_Write(5,0);
       EEPROM_Write(6,245);
       v_max=245;// default
       delay_ms(50);
      }
 else v_max=EEPROM_Read(6)+(100*EEPROM_Read(5));
 
 if(EEPROM_Read(7)==0xFF)
      {
       delay_ms(50);
       EEPROM_Write(7,0);
       EEPROM_Write(8,3);
       time_vmax=3;// 3 sec default
       delay_ms(50);
      }
كذلك الحال لزمن الانتظار طبعا هو الزمن الي اذا كانت فولتيه ضمن normal يعني اكبر من الجهد الواطئ واقل من القيمه العظمى فأن ريلي اخراج سوف يعمل بعد فتره زمنيه time_waiting طبعا اذا لم يتم أضبطه في بادئ الامر يكون افتراضي 180 ثانيه اي 3 دقائق اما اذا تم ضبطه فسوف يقرأ قيمه مخزونه
كود:
if(EEPROM_Read(25)==0xFF)
      {
       delay_ms(50);
       EEPROM_Write(25,0);
       EEPROM_Write(26,180);
       time_waiting=180;//3min  default
       delay_ms(50);
      }
 else time_waiting= EEPROM_Read(26)+(100*EEPROM_Read(25));

=================================
هناك متغير مهم واسمه factor وهو لضبط الحساس بحيث يقرأ جهد بشكل طبيعي سنشرح فيما بعد كيفيه أحتسابه بشكل تقريبي او بشكل دقيق
كود:
if(EEPROM_Read(27)==0xFF)
      {
       delay_ms(50);
       EEPROM_Write(28,0);
       EEPROM_Write(27,0);
       factor=0;// deault
       delay_ms(50);
      }
 else factor= (EEPROM_Read(28)+(100*EEPROM_Read(27)))/10;
طبعا تلاحظون انه عند عدم برمجه محول فأن factor=0 وبتالي دائما يقرأ 0 فولت هذا لكي لاأسمح للمحول بأن تعمل دون برمجتها لان ربما تعمل بشكل خاطئ وتسبب تلف الاجهزه

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً المخترع01 ( شكر العضو على هذه المشاركة )

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 19-10-2014, 02:35 PM المشاركة 4   
افتراضي


ناتي الان الى داله تايمر0 والي منه نولد الازمنه لكل من زمن اقل جهد واعلى جهد وزمن انتظار وكذلك تشغيل سفن سكمنت بطريقه الخداع البصري

تعريف تايمر 0 لكي يعمل أنتربت كل 5ms
كود:
//Timer0  // 130 170 220 240 260
//Prescaler 1:32; TMR0 Preload = 100; Actual Interrupt Time : 4.992 ms

//Place/Copy this part in declaration section
void InitTimer0(){
  OPTION_REG         = 0x84;
  TMR0                 = 100;
  INTCON         = 0xA0;
}
=====================================
في داله أنتربت في كل 5ms يتم تنفيذ اوامر في هذه داله
طبعا لازم كل حدوث عمليه انتربت تصفير فلاك تايمر0 وأعطاءه القيمه الاوليه وهي 100
كود:
TMR0IF_bit         = 0;
     TMR0               = 100;
---------------------------------------------------------
اما هذا الكود فهو لاحتساب زمن أنتظار واقل جهد واعلى جهد طبعا تلاحظ الزمن يكون بالثواني لاني اخبرته كل 1000ms قم بزياده تايمرات بواحد
كود:
cont++;
    cont1++;
    if(cont >= 200) // setting every 1s
                   {
                    cont=0;
                    time_vmin_cont++;
                    time_vmax_cont++; 
                   }
     if(cont1 >= 200)// setting every 1s
                   {
                    cont1=0;
                    time_waiting_cont++ ;
                   }
-------------------------------------------------------------------
نأتي الان لكيفيه تشغيل سفن سكمنت
طبعا في مشروع أستخدمت سفن سكمنت ذو اربعه قطع لذا كل قطعه سوف يتم تشغيلها وأطفاء البقيه لمده 5ms وأستخدمت متغير
كود:
select_en++;
لغرض أختيار القطعه مطلوبه
طبعا يوجد متغيرات مثل setting ومن اسمه له علاقه مع عمليه الضبط يعني لما أدخل على عمليه الضبط اريد بعض الرموز تظهر لي على سفن سكمنت مثل V H V L T F
-----------------------------------------------------------------------
نأتي الان لتشغيل القطعه الاولى
انظر الكود جيدا
كود:
if(select_en==1){
                     segment=0;
                     en1=enable; en2=disenable; en3=disenable;  en4=disenable;
                     if(setting is 0)
                         {
                          if((value/1000)!=0)
                                    {
                                     segment= segment1[value/1000];
                                     clear.f0=0;
                                    }
                          else { clear.f0=1;segment=0;}
                          
                         }
                     else if(setting is 1 ||setting is 3  )segment=segment1[12];
                     else if(setting is 2 || setting is 4)segment=segment1[14];
                     else if( setting is 5 )segment=segment1[10];
                     else if( setting is 6 )segment=segment1[15];
                    }
هنا قمت بأطفاء كلي لسفن سكمنت وهذا الامر ضروري جدا لضمان عدم بقاء اي قطعه متوهجه
كود:
segment=0;
ثم فعلت الاولى وألغيت ثلاثه البقيه
كود:
 en1=enable; en2=disenable; en3=disenable;  en4=disenable;
هسى اذا كان وضع طبيعي فقط لاظهار الارقام اي setting=0 يعني لم قم بأدخال على داله الضبط فان سفن سكمنت تظهر الارقام فقط لذا اقسم القيمه الجهد على 1000 لحصل على مرتبه الرابعه مثلا 245 نقسم على 1000 اذن ناتج =0 والباقي 245 أظن يظهر لي ناتج وهو 0

طبعا متغير clear مهمته اذا يوجد 0 بأخير راح أقوم بأطفاء سفن سكمنت يعني لاأريد اظهار 0 يعني مثلا الرقم الي يظهر على سفن سكمنت بالكامل 0220 يعني لايوجد داعي لاظهار اخر الرقم وهو 0 يعني اريد أظهار فقط 220
لهذا أخبرته اذا كانت ناتج القسمه=0 أذن أطفء هذه القطعه وأجعل clear.f0=1

اما اذا كان تاج القسمه لايساوي 0 اذن سوف يظهر الرقم مع تصفير بت خاص بهذه القطعه اي clear.f0=0

كود:
if(setting is 0)
                         {
                          if((value/1000)!=0)
                                    {
                                     segment= segment1[value/1000];
                                     clear.f0=0;
                                    }
                          else { clear.f0=1;segment=0;}
                          
                         }
اما اذا كنت دخلت على الداله الضبط راح تظهر بعض الرموز وحسب مكانك في الضبط
مثلا اذا كانت setting=1 or setting=3
اظهر لي على هذه القطعه U

كود:
else if(setting is 1 ||setting is 3  )segment=segment1[12];

اما اذا كانت setting=2 or setting=4
اظهر لي على هذه القطعه t
كود:
else if(setting is 2 || setting is 4)segment=segment1[14];

اما اذا كانت setting=5
اظهر لي على هذه القطعه L
كود:
else if( setting is 5 )segment=segment1[10];
اما اذا كانت setting=6
اظهر لي على هذه القطعه F

كود:
else if( setting is 6 )segment=segment1[15];

وهكذا للقطعه الثانيه والثالثه والرابعه


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 19-10-2014 الساعة 02:55 PM
احصائية الشكر والاعجاب - 0 شكراً, 0 عدم اعجاب, 1 اعجاب
اعجاب المخترع01 ( أعجبته المشاركة )

الصورة الرمزية المخترع01
المخترع01
:: مهندس متميز ::
تاريخ التسجيل: Dec 2009
المشاركات: 397
نشاط [ المخترع01 ]
قوة السمعة:0
قديم 19-10-2014, 02:56 PM المشاركة 5   
افتراضي


مبدع كالعادة شرح جميل و مفهوم جداا

اخ حسن هل ممكن شرح لمشروع التحكم لابيك عبر المنفذ التسلسلي و تغيير قيمة PIC --- RS232
unsigned char MESSAG=22


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 19-10-2014, 04:57 PM المشاركة 6   
افتراضي


في داله الرئيسيه اولا سيتم أستدعاء داله تهيئه مايكرو
كود:
micro_init();
ثم يستدعي داله اسمها
كود:
taping_transformer();
وهذا كودها
كود:
void taping_transformer()
{
 for(x=0;x<8;x++)
                  {
                    address=(x*2)+10;
                    tap[x]=EEPROM_Read(address)+(100*EEPROM_Read(address-1));
                  }
}
طبعا هذه داله مهمه جدا وهي على أساسها سوف تعمل رليات او يعمل منظم
طبعا بأختصار راح يخزن قيم الفولتيه في مصفوفه tap وهي من نوع int
طبعا تلاحظ راح يقرأ أبتداء من عنوان 10 وتلاحظون ان معادله address دائما تكون نتيجه عدد زوجي اي 10 12 14 .... لان كما قلت مصفوفه من نوع int وبتالي تحتاج الى 2 byte لخزنها في ايبروم
الان محوله ممبرمحه الى التالي
115 130 151 170 186 210 240 270
تلاحظون عدد =8
أما كيف أحتساب هذه القيم فهي كتالي
انا عندي بأساس هذه جهود محول
كود:
const unsigned int ratio_transformer[]={130,170,210,240,270};
واريد محول تقوم بعمليه التنظيم الجهد طبعا لازم تدرس محولتك كيف تعمل وهذا ضروري حتى نضع نسب التحويل

طبعا نسبه تحويل كتالي
170/130=1.3
210/130=1.62
240/130=1.85
270/130=2.077

الان مدخل على 130 ومخرج على 270 لابد من أحدد أقصى مجال لعمل هذا bandwidth طبعا في هذه منطقه كل رليات في حاله OFF اظن افترض ان اريد جهد متاح من اقل جهد مسموح به الى 235فولت اظن دقق معي
فولتيه الخرج =235 اظن ماهو اقصى دخل مسموح به بكل بساطه
235/2.077= 113 أظن انا أختاريت 115 يعني جهد 115*2.077=238

طبعا انا أقصد 115 هو جهد دخل اذن خزنت قيمه 115 في ميموري وهي [tab[0
ماذا اذا زادت جهد دخل على 115
في تصميم هذه محول يكون ريلي رقم 4 يتحكم بأخرج و 1و2 و3 بالادخال
========================================
وفي حاله زاد جهد عن 115 راح يشتغل ريلي 4 ليخفض جهد اي تاب 240 فولت
235/1.85= 127 انا أختاريت 130
======================================
الان في حاله زاد جهد الادخال عن 130 هنا جهد خرج راح يزداد عن 235 وبتالي هنا لابد من زياده الادخال لكي يعمل على تاب 170
نسبه تحويل التصميميه = 270/170=1.588
اذن 235/1.588=147 انا وضعته 151 اي جهد يصل الى 239
في هذه منطقه ريلي رقم 1 هو الذي سوف يعمل
======================================
طبعا ماذا اذا زاد جهد عن 151 فولت أكيد راح يزداد جهد
هنا راح أخلي محوله تخفض من تاب 5 ال تاب 4
نسبه تحويل التصميميه = 270/170=1.588
اذن 235/1.588=166 أنا وضعت 170 اي 239
هنا ريلي 4 ON وكذلك ريلي 1 ON
=======================================
ماذا اذا زاد جهد دخل عن 170 اذن نشغل ريلي 2
نسبه تحويل التصميمه = 270/210=1.286
235/1.286=182
================================
وفي حاله زاد جهد عن 235 نشغل ريلي 4 ليخفض الجهد

نسبه تحويل التصميمه = 240/210=1.143
235/1.143=205
=============================
وفي حاله زاد جهد خرج
اذن ريلي3 هو راح يعمل ليزيد دخل الى تاب 270
270/270=1
235/1=235
وهو أخير تاب أذن مسموح للجهد يصل الى 235 انا وضعته 240
========================
وفي حاله زاد جهد عن 240 أذن سوف نجعل ريلي رقم 4 ON ليخفض الجهد
240/270=0.889

235/0.889=270


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 20-10-2014, 02:10 AM المشاركة 7   
افتراضي


كود:
void setting_transformer()
هذا هو كودها
كود:
void setting_transformer()
{
 char  value2=1, dd1=0,dd2=0 ;
 kk=0;
 time=0;
 setting=1;
 address=0;
 value=0;
 while(1)
        {
         if(sw_inc is pressed){delay_ms(250); dd1=1;}
         if(sw_dec is pressed){delay_ms(250); dd2=1;}
         if(dd1 is 1 && kk is 0)
                             {  dd1=0;
                                if(value2 <=13)value2++;
                                if(value2 is 13)
                                                {
                                                 setting=2;
                                                 time=1;
                                                 value=0;
                                                }
                                else if(value2 is 14)
                                                {
                                                 setting=6;
                                                 time=2;
                                                 value=0;
                                                }
                               else if(value2<5){
                                              setting=value2;
                                              value= 0;
                                             }
                               else if(value2 >=5 && value2 <13)
                                                             {
                                                              setting=5;
                                                              value=value2-4;
                                                             }
                             }
         else if(dd2 is 1 && kk is 0)
                              {  
                               dd2=0;
                               if(value2 !=0)  value2--;
                               if(value2 is 0) value2=1;
                               if(value2<5){
                                           setting=value2;
                                           value= 0;
                                          }
                               else if(value2 is 13){
                                                     setting=2;
                                                     time=1;
                                                     value=0;
                                                    }
                               else {
                                     setting=5;
                                     value=value2-4;
                                    }
                              }
         else if(dd1 is 1 && kk is 1)
                              {
                               dd1=0;
                               value++;
                              }
         else if(dd2 is 1 && kk is 1)
                              {
                               dd2=0;
                               if(value!=0) value--;
                              }
        if(sw_ok is pressed )
                               {
                                delay_ms(20);
                                while(sw_ok is pressed);
                                delay_ms(5);
                                point=0;
                                if(time is 1)
                                             {
                                              address=26; // 2*time=2*13=26
                                              time=0;
                                             }
                                if(time is 2)
                                             {
                                              point=1;
                                              address=28; // 2*time=2*14=28
                                              time=0;
                                             }
                               else { 
                                      address=value2*2;

                                     }
                                if(kk is 0){ value=EEPROM_Read(address)+(100*EEPROM_Read(address-1));
                                                  if(value>1000)value=200; // default value
                                                 }
                                kk++;
                                setting=0;
                               }
          if(kk is 2){
                       delay_ms(50);
                       EEPROM_Write((address-1),(value/100));
                       EEPROM_Write((address),(value%100));
                       kk=0;
                       dd1=1;
                       delay_ms(50);
                      }
         if(sw_exit is pressed){
                                setting=0;
                                point=0;
                                delay_ms(250);
                                // apdate values
                                v_min=EEPROM_Read(2)+(100*EEPROM_Read(1));
                                time_vmin= EEPROM_Read(4)+(100*EEPROM_Read(3));
                                v_max=EEPROM_Read(6)+(100*EEPROM_Read(5));
                                time_vmax= EEPROM_Read(8)+(100*EEPROM_Read(7));
                                time_waiting= EEPROM_Read(26)+(100*EEPROM_Read(25));
                                factor=(EEPROM_Read(28)+100*EEPROM_Read(27))/10;
                                delay_ms(25);
                                return;
                              }

        }

}
======================================
تهيئه متغيرات مع جعل setting=1 لغرض أظهار رموز على سفن سكمنت راجع شرح تشغيل قطع سفن سكمنت
كود:
 char  value2=1, dd1=0,dd2=0 ;
 kk=0;
 time=0;
 setting=1;
 address=0;
 value=0;
===================================
ندخل في لوب مستمر
dd1 متغير او فلاك flag لزياده و dd2 للنقصان
كود:
if(sw_inc is pressed){delay_ms(250); dd1=1;}
         if(sw_dec is pressed){delay_ms(250); dd2=1;}
======================================
في حاله لم تقم لاضغط على OK وضغط فقط سويج زياده او نقصان فأذن سوف يحولك بين معطيات دون تغير في قيمهم هنا تلاحظ متغير value2 هو لغرض أحتساب عدد ثوابت او رموز الي راح نظهرها على سفن سكمنت
مثلا
كود:
 else if(value2<5){
                                              setting=value2;
                                              value= 0;
                                             }
اذا كانت أقل من 5 راح تظهر رموز مثلا VL00 t-00 VH00 t-00
تلاحظها عدد 4 أذن value2 أقل من 5 لاظهار هذه رموز

==========================================
اما من 5 الى 12 لاظهار رموز L-00 L-01 L0-02 ......
كود:
else if(value2 >=5 && value2 <13)
                                                             {
                                                              setting=5;
                                                              value=value2-4;
                                                             }
==========================================

اما value2=13 فهو لاظهار رمز t-00 وهو لزمن أنتظار
كود:
 if(value2 is 13)
                                                {
                                                 setting=2;
                                                 time=1;
                                                 value=0;
                                                }
============================================

قيمه value2=14 فهو لاظهار رمز F-00 وهو خاص بالقيمه حساس الجهد
كود:
else if(value2 is 14)

                                                {
                                                 setting=6;
                                                 time=2;
                                                 value=0;
                                                }
============================================
اما أذا ضغطنا على OK راح يصبح kk=1 وبتالي سوف يتحول الى ضبط القيمه المطلوبه
كود:
else if(dd1 is 1 && kk is 1)
                              {
                               dd1=0;
                               value++;
                              }
         else if(dd2 is 1 && kk is 1)
                              {
                               dd2=0;
                               if(value!=0) value--;
                              }
واذا ضغطنا على OK مره أخرى راح يصبح KK=2 وهنا سوف يتم خزن القيمه الجديده في ايبروم
كود:
if(kk is 2){
                       delay_ms(50);
                       EEPROM_Write((address-1),(value/100));
                       EEPROM_Write((address),(value%100));
                       kk=0;
                       dd1=1;
                       delay_ms(50);
                      }
=======================================
طبعا زر OK راح يقرأ البيانات موجوده في ايبروم لغرض التعديل عليها وطبعا address هو متغير لغرض احتساب العنوان الصحيح في ايبروم
اما point فهذا اذا كان = 1 فارزه ستطهر في قطعه ثالثه من سفن سكمنت اما اذا 0 فسيتم تصفيرها

كود:
if(sw_ok is pressed )
                               {
                                delay_ms(20);
                                while(sw_ok is pressed);
                                delay_ms(5);
                                point=0;
                                if(time is 1)
                                             {
                                              address=26; // 2*time=2*13=26
                                              time=0;
                                             }
                                if(time is 2)
                                             {
                                              point=1;
                                              address=28; // 2*time=2*14=28
                                              time=0;
                                             }
                               else { 
                                      address=value2*2;

                                     }
                                if(kk is 0){ value=EEPROM_Read(address)+(100*EEPROM_Read(address-1));
                                                  if(value>1000)value=200; // default value
                                                 }
                                kk++;
                                setting=0;
                               }


========================================
اما زر خروج راح يقرأ بيانات الجديده ثم يعود الى داله الرئيسيه
كود:
if(sw_exit is pressed){
                                setting=0;
                                point=0;
                                delay_ms(250);
                                // apdate values
                                v_min=EEPROM_Read(2)+(100*EEPROM_Read(1));
                                time_vmin= EEPROM_Read(4)+(100*EEPROM_Read(3));
                                v_max=EEPROM_Read(6)+(100*EEPROM_Read(5));
                                time_vmax= EEPROM_Read(8)+(100*EEPROM_Read(7));
                                time_waiting= EEPROM_Read(26)+(100*EEPROM_Read(25));
                                factor=(EEPROM_Read(28)+100*EEPROM_Read(27))/10;
                                delay_ms(25);
                                return;
                              }

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً قطر الندى 89 ( شكر العضو على هذه المشاركة )
اعجاب قطر الندى 89 ( أعجبته المشاركة )

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 20-10-2014, 02:26 AM المشاركة 8   
افتراضي


داله حساب الجهد
كود:
void calculate_voltage()
{
 voltage= ADC_Read(0)*4.8875;// Get 10-bit results of AD conversion
 voltage =voltage *factor;
 voltage= voltage/1000; // change from mv to volt
 voltage_transformer();
}
طبعا سيتم القراءه الجهد من الحساس من جنل 0 ومن ثم نضربها في القيمه الحساس factor بعد ذلك نقسم على 1000 لتحويل الى فولت

وبعد أحتساب الجهد نستدعي الداله
كود:
 voltage_transformer();
وهي داله مسؤوله عن تشغيل رليات لغرض تنظيم الجهد

هذه صوره حساس



حساب factor
Vrms=F*V2

F=Vrms/V2

OR
(F=2.174 * (R+R2+R3)/(R2+R3

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025