16F877A_VMPPT_sorun!!!

Başlatan ozkancelebi, 05 Mayıs 2011, 16:21:03

ozkancelebi

Arkadaşlar ve üstatlar  kaynak gerilimi gerilim bölücü ile bölüyorum ve 5 kere ölçüp aritmetik ortalamasını aldıktan sonra referans gerilimime karşılık bir pwm üretiyorum ve daha sonra kaynağın üretitiği gerilime karşılık gelen gerilim bu referans gerilimin altına düştüğünde pwm'in duty cycle'ını artırmasını,üstüne çıktıgında azaltmasını,bunları yaparken referans gerilimime eşit oldugunda ise başta kurmuş oldugum pwm duty cycle'da durmasını istiyoum.
Bunun için bir kod yazmaya çalıştım ve isisde basit bi similasyon ile denemk istedim ama her şartta PWM Duty Cycle Artıyor:(
Yani referans gerilimime eşit olsada,altındada olsa,üstündede olsa hem duty cycle artıyor!!!
Lütfen yardımlarınızı ve önerilerinizi beklemekteyim.
Teşekkürler...





#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES LP                       //Low power osc < 200 khz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES WRT_50%                  //Lower half of Program Memory is Write Protected

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

float mean_adc()
{
int i,mean_total = 5;
float mean = 0,mean1 = 0,mean_new=0.0;
set_adc_channel (0);
delay_us(100);
for (i=1; i==mean_total; i++)
{
mean = mean + read_adc();
delay_us(100);
}
mean1=(mean/mean_total);
mean_new = mean1 * 0.01953125;

return(mean1);
}



void main()
{
   float mean_new;
   long pwm_value;
   setup_adc_ports(AN0_AN1_AN3);
  setup_adc(ADC_CLOCK_INTERNAL );


   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_1,66,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty (200);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   delay_ms(200);
   
while (1)
{
delay_us(100);
mean_new=mean_adc();
if(mean_new < 2.3) 
{
pwm_value++;
}
else if (mean_new>2.3)
{
pwm_value--;
delay_us(100);
}
else if (mean_new==2.3)
{
pwm_value=pwm_value;
delay_us(100);
}
set_pwm1_duty(pwm_value);
delay_us(100);
}

}


[IMG]http://img40.imageshack.us/img40/8194/adszujg.jpg[/img]

Uploaded with ImageShack.us

fahri-

aşağıdaki kodu deneyebilirsin...


while (1)
{
delay_us(100);
mean_new=mean_adc();
if(mean_new < 2.3)  pwm_value++;
if(mean_new>2.3) pwm_value--;
set_pwm1_duty(pwm_value);
delay_us(100);
}

GreeN

adc de sorun var değer okuyamıyorsun dolayısı ile

if(mean_new < 2.3) 
{
pwm_value++;
}

sadece bu iş görüyor.

adc 'yi kontrol et. Birde adc'den okuduğun veriyi float bir değişkene atmışsın. mean'i int olarak tanımla.
Terörü Lanetliyoruz.

ozkancelebi

Alıntı yapılan: GreeN - 05 Mayıs 2011, 18:47:28
adc de sorun var değer okuyamıyorsun dolayısı ile

if(mean_new < 2.3) 
{
pwm_value++;
}

sadece bu iş görüyor.

adc 'yi kontrol et. Birde adc'den okuduğun veriyi float bir değişkene atmışsın. mean'i int olarak tanımla.


Çok teşekkürler dediğinden hareket ederek düzelttim problemi tekrardan çok saolasın:))

necati

[email]entegreterbiyecisi@yahoo.com[/email]

ozkancelebi

#5
Arkadaşlar  yukarda belirttiğim şartları sağladım Vref in altıydayken Duty cycle artıyor,Vref in üstündeyken azalıyor ve Vref e eşit oldugunda o değerde sabit kalıyor.Ama Vref in altında iken sürekli artırıyor ben bunu bi kere artırsın sonra tekrar ortalama alsın ve gerekiyorsa tekrar artırsın sonra tekrar ortalama alıp yine gerekiyorsa artırmasını  istiyorum.
Aynı durum Vref in üstünde ikende geçerli bu seferde durmadan azaltıyor.
Bunu sürekli değilde bi kere artırıp veya azaltıp sonra tekrar kontrol edip ne gekiyorsa onu yapmasını sağlamam mümkün mü??
Örneğin:
"if(voltage>107 )
{
pwm_value=pwm_value-1;
}"
bölümünde sürekli  azaltıyor benm yapmak istediğim ise bi defa  azaltsın sonra tekrar programın başına dönüp ortalama alıp sonra gerekiyorsa tekrar azaltması.   

Bir de buck converter yapmaya çalıştım ama kararlı ve düzenli çalışmıyor mosfet seçiminde bi yanlış yapıo olabilirim sanırım çünkü baya bi değişik mosfet veya tranzistör denedim ve her denediğimden ayrı bi sonuçla karşılaştım bunun hakkında da bana fikir verirseniz sevinirim:)

Lütfen tekrardan yardımlarınızı ve önerilerinizi beklemekteyim.
Teşekkürler...




#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES LP                       //Low power osc < 200 khz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES WRT_50%                  //Lower half of Program Memory is Write Protected

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


float mean_adc()
{
int i,adcValue;
long defaultI,voltReadI;
float voltRead;

defaultI=0;
adcValue=0;
voltReadI=0;
voltRead=0;

for (i=0;i<6;i++)
{
   if(i!=0)
   {
      adcValue=Read_ADC();
      voltReadI = voltReadI + adcValue; 
   }       
   delay_us(100);
}
voltRead=(float)voltReadI/5;
defaultI=(int)voltRead;
return(voltRead);
}




void main()
{
   int voltRead,voltReadI,voltage,pwm_value,defaultI;
   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_INTERNAL );


   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_1,66,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty (10);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   delay_ms(200);
   
while (1)
{
delay_us(100);
voltage=mean_adc();
delay_us(100);
if(voltage<117)  pwm_value++;
if(voltage>117) pwm_value--;
if(voltage==117) pwm_value=pwm_value;
set_pwm1_duty(pwm_value);
delay_us(100);

}

   // TODO: USER CODE!!
}


[IMG]http://img33.imageshack.us/img33/6892/adszxy.jpg[/img]

Uploaded with ImageShack.us