السلام عليكم ورحمة الله وبركاته
رمضان كريم على الجميع وكل عام وانتم بألف خير ..
هذا منظم جهد يعمل على رفع الجهد من 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
وارحب بكل المشاركات للأضافة او التعديل وصولاً للأمثل
تحياتي