Pic 18F452 ile Frekans hesaplama..

Başlatan Untouchable35, 06 Mayıs 2015, 16:40:05

Untouchable35

Arkadaşlar merhaba. Aldığım bitirme projesi olarak güneş paneli ve rüzgar türbininden elde ettiğim gücü şebekeye aktarabilmek. Bunun için şebekeyle paralel çalışabilen sistem yapmak gerek. Bunun sadece kontrol kısmını yapmak istiyorum. Yani iki adet sistemi paralel bağlamak istiyorum. Paralel bağlama şartları olan gerilim frekans ve faz geçişini hesaplamam gerek. Öncelikli olarak frekans hesaplama işini dış kesme kullanarak timer1 i saydırıyorum. fakat adc kanallarından bilgi okumaya başlayınca program sapıtıyor. Frekansı başka bir şekilde ölçmek gerek. programlarımı CCS S de yazıyorum. Bu konu hakkında fikir ve yorumlarını bekliyorum. Şimdiden çok teşekkürler

ziyaretci

 Programının en azından sorun oluşan kısmını buraya koyarsan daha iyi olur gibi. Belki yazılımsam bir sıkıntı vardır.

Örneğin; kesme alt program bloklarının içerisinde analog okuma sorun doğuruyor. Belki bundan kaynaklıdır sapıtması.
#int timer1
void timer_kes(){

 /// bu bloğun içerisinde bu işlemi yapamazsın. xxx = read_adc();
i++;
if(i==255)i=0;
}

 Void main(){
for(;;){
  if(i==30){xxx = read_adc(); i=0;}  //  Burada sorun oluşmaz. 
  }
}


İlk aklıma gelen yazılımsal hata bu oldu. Başka birşeyde olabilir. Yazılımınızı koyarsanız daha verimli olur.


RaMu

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Untouchable35

#3
Yada başka nasıl frekans okuyabilirim? Frekans hesaplamam sorunu çözmeyecek çünkü yapmak istediğim projede şebeke etkileşimli güneş+rüzgar hibrit sistemi yapmak istiyorum. Frekans gerilim ve faz geçişlerini hesaplamam lazım. Bunun için 18F452 entegresi kullanıcam. Yeterli olacak diye düşünüyorum.Sizlerin fikirleriniz nedir acaba? Teşekkürler ilginiz için.

mesaj birleştirme:: 07 Mayıs 2015, 20:31:16

#include <16F877A.h>
#device ADC=10
#fuses XT,NOWDT
#use delay(clock=4000000)
#priority ext,ad
#include <lcd.c>
#define use_portd_lcd TRUE
unsigned int32 i=0;
unsigned int32 y;
unsigned long int bilgi;
float voltaj;

#int_ad
void adc_kesmesi()
{output_high(pin_b7);delay_ms(250);output_low(pin_b7);}
#int_ext
void dis_kesme()
{
i=get_timer1();
set_timer1(0);
}
#int_timer1
void timer1_kesme()
{
set_timer1(0);
i=0;
}

void main()
{
lcd_init();
set_tris_a(0x03);
set_tris_d(0x00);
output_d(0x00);
set_tris_b(0x01);
set_tris_c(0x01);
ext_int_edge(H_TO_L);
setup_timer_1(T1_INTERNAL);
set_timer1(0);
setup_adc(adc_clock_div_32);
setup_adc_ports(all_analog);
enable_interrupts(int_ext);
enable_interrupts(int_timer1);
enable_interrupts(global);
enable_interrupts(int_ad);
printf(lcd_putc,"\fFrekans=");
printf(lcd_putc,"\nVoltaj=");
while(1)
{
set_adc_channel(0);
delay_us(20);
bilgi=read_adc();
voltaj=bilgi*0.0048876*44;
y=1/(0.000001*i);
lcd_gotoxy(9,1);
printf(lcd_putc,"%ld Hz",y);
lcd_gotoxy(8,2);
printf(lcd_putc,"%f V",voltaj);


}

}

RaMu

"Güneş panelini şebekeye bağlama, Faz geçişi hesaplama"
gibi bir konu daha aç bence,
yoksa bu konudan fazla cevap alamayabilirsin.

Bu konunun başlığıda "18f452 ile frekansmetre problemi" gibi birşey olmalıymış.

Koda gelirsek:
unsigned int32 i=0;
unsigned int32 y;

y=1/(0.000001*i);

i ve y tamsayı olduğundan
bu işlemin sonucu doğru bir değer oluşturmuyor olabilir.

Ayrıca kkaleminde anlattığımız gibi,
bu yöntemle periyod ölçüyorsun
ama düşük frekanslar için iyi bir yöntem,
50Hz civarını direk frekans ölçen yöntemle
daha sağlıklı ölçebilirin bence.

Ayrıca çarpma bölme işlemleri
picin kolaylıkla yapabildiği şeyler değil,
hatta tamsayı çarpmalarını bile kolay yapamıyor,
birde
voltaj=bilgi*0.0048876*44;

böyle virgüllü sayılarla çarpma bölme çok daha zor bir işlem
bunlar uzun zaman alır,
arada yapılacak başka işlemler varsa problem çıkabilir.

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Untouchable35

Konuya ilginiz ve mesajlarınız için teşekkür ederim. Sorunu halletmeye uğraşacağım.