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

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

احمد شهيد جواد
:: مهندس متميز ::
تاريخ التسجيل: Apr 2015
الدولة: العراق
المشاركات: 324
نشاط [ احمد شهيد جواد ]
قوة السمعة:0
قديم 06-06-2018, 02:14 PM المشاركة 1   
افتراضي منظم جهد بالمايكروكنترولر Twitter FaceBook Google+



السلام عليكم ورحمة الله وبركاته

رمضان كريم على الجميع وكل عام وانتم بألف خير ..

هذا منظم جهد يعمل على رفع الجهد من 95 وتخفيضه من 270 بواسطة المتحكم
PIC16F877A

الكود

كود:

sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB2_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D7 at RB5_bit;

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;

#define relay1           portd.f7
#define relay2           portd.f6
#define relay3           portd.f5
#define relay4           portd.f4
#define relay5           portc.f7
#define relay6           portc.f6
#define led_check        portd.f1



#define relay1_dir       trisd.f7
#define relay2_dir       trisd.f6
#define relay3_dir       trisd.f5
#define relay4_dir       trisd.f4
#define relay5_dir       trisc.f7
#define relay6_dir       trisc.f6
#define led_check_dir    trisd.f1

#define sw1              portc.f2
#define sw2              portc.f3
#define sw3              portd.f0

#define sw1_dir          trisc.f2
#define sw2_dir          trisc.f3
#define sw3_dir          trisd.f0

#define led_low              portc.f4
#define led_normal           portd.f3
#define led_high             portd.f2

#define led_low_dir           trisc.f4
#define led_normal_dir        trisd.f3
#define led_high_dir         trisd.f2

char x=0;  float read_sensor_input; float read_sensor_output;
char txt[15]; char txt1[15];  char normal=0;    int ss;
char st[8];
char flag_data[8];    char time_counter[8];
int time_data[8];
float factor=73.3333;

void micro()
{
 
   PSA_bit=1;
  PS0_bit=1;
  PS1_bit=1;
  PS2_bit=1;
 lcd_init();
 lcd_cmd(1);
 lcd_cmd(12);
 
 ADC_Init();
 TRISA.F3=1;
 TRISA.f5=1;
 relay1_dir=0;
 relay2_dir=0;
 relay3_dir=0;
 relay4_dir=0;
 relay5_dir=0;
 relay6_dir=0;
 
 sw1_dir=1;
 sw2_dir=1;
 sw3_dir=1;
 
 led_low_dir=0;
 led_normal_dir=0;
 led_high_dir=0;
 
 led_low=1;
 led_normal=1;
 led_high=1;
 
 relay1=0;
 relay2=0;
 relay3=0;
 relay4=0;
 relay5=0;
 relay6=0;
 
 TRISC.f0=0;
 TRISC.f1=0;
 TRISC.f5=0;
 TRISb.f6=0;
 TRISb.f7=0;
 TRISE=0x00;
 PORTE=0x00;
 PORTC.F0=0;
 PORTC.F1=0;
 PORTC.F5=0;
 PORTB.F6=0;
 PORTB.F7=0;
 
 led_check_dir=0;
 led_check=0;
 lcd_out(1,4, "HELLO");


 for(x=0;x<6;x++){ led_check=!led_check; Delay_ms(500);asm clrwdt;}

 for(x=0;x<8;x++){ flag_data[x]=0;}
  lcd_cmd(1);
}


void InitTimer1(){
  T1CON         = 0x01;
  TMR1IF_bit         = 0;
  TMR1H         = 0x06;
  TMR1L         = 0x00;
  TMR1IE_bit         = 1;
  INTCON         = 0xC0;
}

void Interrupt(){
  if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H         = 0x06;
    TMR1L         = 0x00;

factor=73.3333;
 
if(time_data[0]==0){ time_counter[0]=0;}
else if(time_counter[0]==1)
{
 st[0]++;
 if(st[0]>=32){ st[0]=0; time_counter[0]++;}

}

//////////////////////////////////////////////
if(time_data[1]==0){ time_counter[1]=0;}
else if(time_counter[1]==1)
{
 st[1]++;
 if(st[1]>=32){ st[1]=0; time_counter[1]++;}

}
//////////////////////////////////////////////
if(time_data[2]==0){ time_counter[2]=0;}
else if(time_counter[2]==1)
{
 st[2]++;
 if(st[2]>=32){ st[2]=0; time_counter[2]++;}

}
/////////////////////////////////////////////////
if(time_data[3]==0){ time_counter[3]=0;}
else if(time_counter[3]==1)
{
 st[3]++;
 if(st[3]>=32){ st[3]=0; time_counter[3]++;}

}
////////////////////////////////////////////////////
if(time_data[4]==0){ time_counter[4]=0;}
else if(time_counter[4]==1)
{
 st[4]++;
 if(st[4]>=32){ st[4]=0; time_counter[4]++;}

}
/////////////////////////////////////////////////////
if(time_data[5]==0){ time_counter[5]=0;}
else if(time_counter[5]==1)
{
 st[5]++;
 if(st[5]>=32){ st[5]=0; time_counter[5]++;}

}
///////////////////////////////////////////////////////
if(time_data[6]==0){ time_counter[6]=0;}
else if(time_counter[6]==1)
{
 st[6]++;
 if(st[6]>=32){ st[6]=0; time_counter[6]++;}

}
//////////////////////////////////////////////////
if(time_data[7]==0){ time_counter[7]=0;}
else if(time_counter[7]==1)
{
 st[7]++;
 if(st[7]>=32){ st[7]=0; time_counter[7]++;}

}
//////////////////////////////////////////////////////
if(time_data[8]==0){ time_counter[8]=0;}
else if(time_counter[0]==1)
{
 st[8]++;
 if(st[8]>=32){ st[8]=0; time_counter[8]++;}

}

  }
}


/*void store_float(unsigned int adres, float sayi){
eeprom_write(adres,lo(sayi));
delay_ms(20);
eeprom_write(adres+1,hi(sayi));
delay_ms(20);
eeprom_write(adres+2,higher(sayi));
delay_ms(20);
eeprom_write(adres+3,highest(sayi));
delay_ms(20);
}


float read_float(unsigned int adres){
float th;
lo(th)=eeprom_read(adres);
hi(th)=eeprom_read(adres+1);
higher(th)=eeprom_read(adres+2);
highest(th)=eeprom_read(adres+3);
return th;
}*/

void read_analoge()
{
 read_sensor_input=0.0;

 for(x=0;x<50;x++)
 {
 
 read_sensor_input+=adc_read(0);


 Delay_ms(1);
  }
 read_sensor_input=read_sensor_input/50;
  }

 
 
void main() 
{
  micro();

  InitTimer1();

  while(1)
  {

   

   Delay_ms(1000);
   
   read_analoge();

  
   read_sensor_input=(read_sensor_input*5000)/1023;

    read_sensor_input/=1000;

    floatToStr(read_sensor_input,txt);
    lcd_out(1,1,"V_son=");
     for(x=0;x<14;x++)
    {

   if(txt[x]!=' '){lcd_chr_cp(txt[x]);}

    }

    read_sensor_input*= factor;

    floatToStr(read_sensor_input,txt);
    lcd_out(2,1,"V_High=");
     for(x=0;x<14;x++)
    {

   if(txt[x]!=' '){lcd_chr_cp(txt[x]);}


    }
  
  
  
  
   

   // step  1
    ////////////////////////////////////////////////////
    if( read_sensor_input>95 && read_sensor_input <110)
    {
     if(flag_data[0]==0){
                          flag_data[0]=1; time_data[0]=1; time_counter[0]=0;

                          for(x=0;x<8;x++){ if(flag_data[x]!=0){ flag_data[x]=0;} }
                        }
    if(time_counter[0]>=3)
    {
     relay2=1;

     relay1=0; relay3=0; relay4=0; relay5=0; //relay6=0;
     flag_data[0]=0;
    }}
    
        else  if( read_sensor_input>95 && read_sensor_input <110)
    {
    if( relay2==1 && relay1==0 && relay3==0 && relay4==0 && relay5==0)
         {
      relay6=1;
     
         }

    }
   //////////////////////////////////////////////////////

   // step 2
   ///////////////////////////////////////////////////////
 else  if( read_sensor_input >110 && read_sensor_input < 124)
   {

       if(flag_data[1]==0){
                          flag_data[1]=1; time_data[1]=1; time_counter[1]=0;

                          for(x=0;x<8;x++){ if(flag_data[x]!=1){ flag_data[x]=0;} }
                          }
   if(time_counter[1]>=3)
   {
    relay2=1; relay5=1;

    relay1=0; relay3=0; relay4=0; //relay6=0;
    time_counter[1]=0;
   }}
    else  if( read_sensor_input >110 && read_sensor_input < 124)
      {
     if(relay2==1 && relay5==1 && relay1==0 && relay3==0 && relay4==0)
          {
        relay6=1;
          }
       }
 // step 3
 /////////////////////////////////////////////////////////
 else if( read_sensor_input>124 && read_sensor_input<141)
 {
      if(flag_data[2]==0){
                          flag_data[2]=1; time_data[2]=1; time_counter[2]=0;

                          for(x=0;x<8;x++){ if(flag_data[x]!=2){ flag_data[x]=0;} }
                        }
    
   if(time_counter[2]>=3)
   {
 relay1=1; relay2=1;

 relay3=0; relay4=0; relay5=0;   // relay6=0;
  
 time_counter[2]=0;
   }
 }
 
 if( read_sensor_input>124 && read_sensor_input<141)
 {
  if(relay1==1 && relay2==1 && relay3==0 && relay4==0 && relay5==0)
   {
    relay6=1;
   }

 }

 // step 4
 //////////////////////////////////////////////////////////
 else if( read_sensor_input>142 && read_sensor_input<=160)
 {
      if(flag_data[3]==0){
                          flag_data[3]=1; time_data[3]=1; time_counter[3]=0;

                          for(x=0;x<8;x++){ if(flag_data[x]!=3){ flag_data[x]=0;} }
                        }
   
   if(time_counter[3]>=3)
   {
   relay1=1; relay2=1;  relay5=1;

  relay3=0;  relay4=0; //relay6=0;

  time_counter[3]=0;
 }  }

    else if( read_sensor_input>142 && read_sensor_input<=160)
 {
  if(relay1==1  && relay2==1 && relay5==1 && relay3==0 && relay4==0 )
   {
    relay6=1;
   }
 }
 // step 5
 //////////////////////////////////////////////////////////
 else if( read_sensor_input>161 && read_sensor_input<169)
 {
     if(flag_data[4]==0){
                          flag_data[4]=1; time_data[4]=1; time_counter[4]=0;

                          for(x=0;x<8;x++){ if(flag_data[x]!=4){ flag_data[x]=0;} }
                        }
  if(time_counter[4]>=3)
  {
  relay3=1;

  relay1=0; relay2=0; relay4=0; relay5=0; //relay6=0;
  flag_data[4]=0;
 } }
  else  if( read_sensor_input>161 && read_sensor_input<169)
 {
  
  if( relay3==1 && relay1==0 && relay2==0 && relay4==0 && relay5==0)
    {
     relay6=1;
    
    }
 }
 // step 6
 //////////////////////////////////////////////////////////
 else if( read_sensor_input>170 && read_sensor_input<190)
 {
     if(flag_data[5]==0){
                          flag_data[5]=1; time_data[5]=1; time_counter[5]=0;

                          for(x=0;x<8;x++){ if(flag_data[x]!=5){ flag_data[x]=0;} }
                        }
 if(time_counter[5]>=3)
 {
  relay3=1; relay5=1;

  relay1=0; relay2=0; relay4=0; //relay6=0;
  flag_data[5]=0;
 }}
 
  else if( read_sensor_input>170 && read_sensor_input<190)
 {
  if(relay3==1 && relay5==1 && relay1==0 && relay2==0 && relay4==0)
   {
    relay6=1;
   }

 }

 // step 7
 /////////////////////////////////////////////////////////
 else if( read_sensor_input>191 && read_sensor_input<210)
 {
     if(flag_data[6]==0){
                          flag_data[6]=1; time_data[6]=1; time_counter[6]=0;

                          for(x=0;x<8;x++){ if(flag_data[x]!=6){ flag_data[x]=0;} }
                        }
 if(time_counter[6]>=3)
 {
  relay4=1; relay5=1;


  relay1=0; relay2=0; relay3=0; //relay6=0;
  flag_data[6]=0;
 }}
     else if( read_sensor_input>191 && read_sensor_input<210)
 {
  if(relay4==1 && relay5==1 && relay1==0 && relay2==0 && relay3==0)
  {
  
   relay6=1;
  }
 }
 // step 8
 //////////////////////////////////////////////////////////////
 else if( read_sensor_input>210 && read_sensor_input<245)
 {
     if(flag_data[7]==0){
                          flag_data[7]=1; time_data[7]=1; time_counter[7]=0;

                          for(x=0;x<8;x++){ if(flag_data[x]!=7){ flag_data[x]=0;} }
                        }
  if(time_counter[7]>=3)
  {
  relay4=0; relay5=0;


  relay1=0; relay2=0; relay3=0; //relay6=0;
  flag_data[7]=0;
 } }
     else if( read_sensor_input>210 && read_sensor_input<245)
    {
      if(relay1==0 && relay2==0 && relay3==0 && relay4==0 && relay5==0 )
      {
       relay6=1;
      }
    }
 // step 9
 ////////////////////////////////////////////////////////////


  else if( read_sensor_input>245 && read_sensor_input <270)
 {
     if(flag_data[8]==0){
                          flag_data[8]=1; time_data[8]=1; time_counter[8]=0;

                          for(x=0;x<8;x++){ if(flag_data[x]!=8){ flag_data[x]=0;} }
                        }
  if(time_counter[8]>=3)
  {
  relay1=0; relay2=0; relay3=0; relay4=0; relay5=1;  // relay6=0;
  flag_data[8]=0;
 } }
 
   else if( read_sensor_input>245 && read_sensor_input <270)
 {
  if(relay1==0 && relay2==0 && relay3==0 && relay4==0 && relay5==1)
   {
    relay6=1;
   }


 }

 asm clrwdt;
 if( read_sensor_input<180)
 {
  led_low=0;   led_high=1; led_normal=1;
 }
 
  if( read_sensor_input>180 && read_sensor_input<245)
 {
  led_low=1;   led_high=1; led_normal=0;
 }
 
  if( read_sensor_input>245)
 {
  led_low=1;   led_high=0; led_normal=1;
 }
    
  asm clrwdt;

  }
  
}
المحول مصمم بـ 6 تابات . هي :

0
125
160
190
210
240
270

وهذا جدول نظمته يوضح الادخال والاخراج وجهد الدخل وجهد الخرج



تصميم الكارت ب 6 ريليات 5 لتوزيع التابات والسادس هو للحماية ..





تراكات الريليات يجب تغطيتها بالقصدير لتكون قادرة على تحمل التيار العالي

كما تلاحظون تم استخدام Line Filter مع مكثفين 0.1uf على التوازي وذلك لمنع انتقال الضوضاء الخارجية للمايكروكنترولر

في التصميم الخاص بحساس الجهد تم وضع مكثفان 10n الاولى على مقاومة التخفيض والثانية على مدخل المقارن . عملهم فلتر لأمتصاص الاشارات الغير مرغوب بها .

البعض يضع مقاومة 220k على خط الـ Line ومن ثم يشرك النيوترل مع سالب الدائرة . هذا بحد ذاته يسبب ضجيج عالي على المتحكم ..

الصح هو وضع مقاومتين كل واحدة 100k على خطي الدخل وتقويم خط النيوترل بدايود عكسي قبل اشراكه مع سالب الدائرة ولذلك لتحقيق عزل اكبر .

في الكود اول ما يتم هو قياس الجهد وبعدها الانتظار لمدة 3 ثوانِ للتأكد من ان التغيير حدث فعلا وليس تغير مفاجئ .. بعدها يغير بحالة الريليات ومن ثم يختبر اذا كان الجهد بهذي المرحلة يدخل ويختبر هل تم فعلا تشغيل الريليات المقررة لحالة المرحلة ؟؟

اذا كان #نعم فيتم تشغيل ريلاي الخرج وهو الريلاي السادس

طبعا مهم جدا تشغيل كلب الحراسة WDT في هكذا مشاريع من اجل اخراج المايكرو من الدوال العالقة او اخراجه من امر او لوب لا يستطيع ان يخرج منه

توجد عدة ملاحظات تجعل المايكرو يعمل بصورة مستقرة سأقوم بأدراجها لاحقاً


فيديو يوضح عمل الجهاز

https://youtu.be/vpCglSpY8vw

الملفات
stabilizer - 6.6.2018.zip - 3.2 MB

وارحب بكل المشاركات للأضافة او التعديل وصولاً للأمثل

تحياتي


التعديل الأخير تم بواسطة : احمد شهيد جواد بتاريخ 06-06-2018 الساعة 05:02 PM
احصائية الشكر والاعجاب - 0 شكراً, 0 عدم اعجاب, 1 اعجاب
اعجاب 306hamza ( أعجبته المشاركة )
اعلانات

علي00
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2012
المشاركات: 110
نشاط [ علي00 ]
قوة السمعة:0
قديم 28-06-2018, 02:01 PM المشاركة 2   
افتراضي


عاشت ايدك يابطل

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

ahmad alfrhan
:: مهندس ::
تاريخ التسجيل: Oct 2005
المشاركات: 17
نشاط [ ahmad alfrhan ]
قوة السمعة:0
قديم 18-04-2019, 06:50 PM المشاركة 3   
افتراضي


السلام عليكم
هل بالامكان التعديل الى السفن سيجمنت والف شكر


Ibrahimattaka
:: مهندس ::
تاريخ التسجيل: Jan 2019
المشاركات: 18
نشاط [ Ibrahimattaka ]
قوة السمعة:0
قديم 25-04-2019, 05:35 PM المشاركة 4   
افتراضي


هل من الممكن رسم التصميم لأن الكلام بدون التصميم صعب


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 26-04-2019, 05:38 AM المشاركة 5   
افتراضي


هل من الممكن رسم التصميم لأن الكلام بدون التصميم صعب
الرابط فى أول مشاركة تجد ملف مضغوط به التصميم كاملا


Zine2828
:: مهندس ::
تاريخ التسجيل: Jul 2019
المشاركات: 5
نشاط [ Zine2828 ]
قوة السمعة:0
قديم 28-07-2019, 02:59 PM المشاركة 6   
افتراضي


جميل يعطيكم العافية شكرا على المجهود

إضافة رد

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

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

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


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

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