gelen sinyalin frekansını ve genliğini pic ile ölçmek

Başlatan metechno, 22 Temmuz 2010, 09:52:32

metechno

Merhaba Arkadaşlar

Ben foruma ve pic programlamaya yeni başladım. Benden istenen proje bir pic'e 16F877A, ADC'ye gelen sinüzoidal veya üçgen dalga bir sinyalin genliğini ve frekansını ölçüp 2 satır LCD'ye sonuçları yazdırmak.

Yardımcı olabilirseniz sevinirim. Dediğim gibi yeni başladım şu an proje hakkında ne yapabileciğime fazla fikrim yok. Nereden başlamalıyım ? Basit bir şekilde anlatırsanız makbule geçer  :)

Teşekkürler

fatihinanc

Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

metechno

Evet şimdi gördüm teşekkürler. Takıldığım bir yer olunca yazarım artık :)

ferdem

Frekansı ayrı, genliği ayrı okumalısınız. Bu ikisini de ADC örneklerinden çıkarmak mümkün ama kötü, verimsiz bir yöntem. Önce işaretinizin frekansını ölçün (ADC ye bulaşmadan),  ilk proje PIC ile frekansmetre. Picproje e-dergi 2 de bir yazı vardı :) Sonra genliği ADC kullanarak okursunuz, "peak detector" ile sinus işaretlerin tepe değerini kolayca okuyabilirsiniz, üçgen dalganınki de ölçülür. En kötü ihtimal ADC ile aldığınız örneklerin en yükseğini alırsınız ama... bunları deneyip görmek lazım. İyi çalışmalar.

fatihinanc

Fatih hocam biraz zahmetli ama galiba olabilecek en sağlıklı ölçümlerden biri olur heralde.
bu arada frekansmetre projenizi daha yüksek frekans okuyabilmesi için geliştirebildiniz mi?
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

metechno

@ferdem teşekkürler hocam. linkelere de bakayım sonra anlamadığım yerleri tekrar sorarım :)

metechno

(1273) Omniscient Code Generation not available in Lite mode (warning)
Error   [1098] C:\Hi Tech\Proje mrt.c; 45. conflicting declarations for variable "_veri_yolla" (C:\Program Files\HI-TECH Software\PICC\PRO\9.60\include\lcd.c:27)

********** Build failed! **********

Yardımcı olursanız sevinirim.

#include <htc.h>
#include "delay.h" 
#include "lcd.h" 

int voltaj_1;
int frekans;
__CONFIG(XT & UNPROTECT & WDTDIS & LVPDIS & PWRTEN & BORDIS);
char i=1;
void main(void) {

TRISA=0x01; 
TRISB=0x00; 
TRISC=0x00;
PORTB=0x00;
PORTC=0x00;

PCFG3=1; 
PCFG2=1;
PCFG1=1;
PCFG0=0;

ADFM=1; 
ADON=1; 
ADIF=0; 
ADIE=1; 
PEIE=1; 
GIE=1;
lcd_init(); 
lcd_yaz("Voltaj=");
lcd_gotoxy(2,1);
lcd_yaz("frekans=");
 
for(;;) {

CHS2=0; 
CHS1=0;
CHS0=0;
ADCS1=1;
ADCS0=0;
DelayUs(250);
ADGO=1; 
while(!ADGO);
voltaj_1=(int)((ADRESH*256+ADRESL)/2); 
lcd_gotoxy(1,10); 
veri_yolla(voltaj_1/1000+48);
veri_yolla((voltaj_1%1000)/100+48);
veri_yolla('.');
veri_yolla((voltaj_1%100)/10+48);
veri_yolla(voltaj_1%10+48);
veri_yolla('V'); }}

static void interrupt
led_yaz_son(void){

if(ADIF) {
GIE=0; 
i=!i; 
RC5=i; 
ADIF=0; 
GIE=1; }}

fatihinanc

lcd.h ve lcd.c yi main.c nin olduğu klasöre atmayı deneyin.
hangi ide yi kullanıyorsunuz MPLAB mı?
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

metechno

evet mplab'ı kullanıyorum. onlarda klasörde ama yine de hata veriyor. veri_yolla fonksiyonunda bi problem var ama işte anlayamadım.


fatihinanc

#9
projeni kaydetmemişsin. önce o pencereye sağ tıklayıp kaydet.
projenin ismini main.c(boşluk olmaması için) olarak değiştir.
o da olmazsa lcd kütüphaneni, şemanı vs. buraya koy. bir de öyle bakalım.

ek : galiba lcd kütüphanende bir sıkıntı var. hata mesajına dikkat etmemişim.çakışma var diyor.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

metechno

boşluğu kaldırdım main.c yaparak. yine de aynı hatayı verdi.

(1273) Omniscient Code Generation not available in Lite mode (warning)
Error   [1098] C:\Hi Tech\main.c; 45. conflicting declarations for variable "_veri_yolla" (C:\Program Files\HI-TECH Software\PICC\PRO\9.60\include\lcd.c:27)

********** Build failed! **********



lcd.c kütüphanem
#include <pic.h>
#include "lcd.h" // lcd.h dosyası tanımlanıp, değerler alınıyor
#include "delay.h" // Gecikme fonksiyonu tanımlanıyor
void lcd_busy(void) // 500us bekleme
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
void lcd_komut(unsigned char c) // Komut gönderme fonksiyonu
{
rw=0; // LCD'ye yazma yapılacak
rs=0; // LCD'ye komut gönderilecek
e=1; // Düsen kenar tetikleme olduğu için E önce 1
lcd_port = ( c & 0xF0 ); // Yüksek değerlikli bitler gönderiliyor
e=0; // E, 0 yapılıyor
lcd_busy(); //Belirli süre bekleniyor
e=1; // E, 1 yapılıyor
lcd_port = ( (c & 0x0F)<<4 ); // Düsük değerlikli bitler gönderiliyor
e=0; // E, 0 yapılıyor
lcd_busy(); // Belirli bir süre bekleniyor
}
void veri_yolla(unsigned char c)
{
rw=0;

rs=1; // Komut yolladan tek farkı, RS'nin 1 olması
e=1;
lcd_port = ( c & 0xF0 );
e=0;
lcd_busy();
e=1;
lcd_port = ( (c & 0x0F)<<4 );
e=0;
lcd_busy();
}
void lcd_clear(void) // LCD siliniyor
{
lcd_komut(0x1);
DelayMs(2);
}
void lcd_yaz(const char * s) // LCD'ye string ifade gönderiliyor
{
lcd_busy();
while(*s)
veri_yolla(*s++);
}
void lcd_gotoxy(unsigned char x,unsigned char y) //LCD'nin belli
//bölgesine gidiliyor
{
if(x==1)
lcd_komut(0x80+((y-1)%16));
else
lcd_komut(0xC0+((y-1)%16));
}
void lcd_init() // LCD ilk yükleme ayarları yapılıyor
{
rs = 0;
e = 0;
rw = 0;
DelayMs(15);
e=1;
lcd_komut(0x02);
DelayMs(2);
lcd_komut(CiftSatir4Bit);
lcd_komut(SagaYaz);
lcd_komut(ImlecGizle);
lcd_clear();
lcd_komut(BirinciSatir);
}


lcd.h kütüphanem
#define rs RC0 //Pin tan.mlamalar.
#define rw RC1
#define e RC2
#define lcd_port PORTB
/* LCD'de kullanilan komutlarin tanimlamasi*/
#define Sil 1 // Ekrani temizler
#define BasaDon 2 // Imleci sol ust koseye getirir
#define SolaYaz 4 // Imlecin belirttigi adres azalarak gider
#define SagaYaz 6 // Imlecin belirttigi adres artarak gider
#define ImlecGizle 12 // Gostergeyi ac, kursor gorunmesin
#define ImlecAltta 14 // Yanip sonen blok kursor
#define ImlecYanSon 15 // Yanip sonen blok kursor
FxDev.org Sayfa 44
#define ImlecGeri 16 // Kursoru bir karakter geri kayd.r
#define KaydirSaga 24 // Gostergeyi bir karakter sa.a kayd.r
#define KaydirSola 28 // Gostergeyi bir karakter sola kayd.r
#define EkraniKapat 8 // Gostergeyi kapat (veriler silinmez)
#define BirinciSatir 128 // LCD'nin ilk satir baslang.c adresi
// (DDRAM adres)
#define IkinciSatir 192 // .kinci satirin baslang.c adresi
#define KarakUretAdres 64 // Karakter ureteci adresini belirle
// (CGRAM adres)
/* LCD'de Kullanilan Fonksiyon Secimi */
#define CiftSatir8Bit 56 // 8 bit ara birim, 2 satir, 5*7 piksel
#define TekSatir8Bit 48 // 8 bit ara birim, 1 satir, 5*7 piksel
#define CiftSatir4Bit 40 // 4 bit ara birim, 2 satir, 5*7 piksel
#define TekSatir4Bit 32 // 4 bit ara birim, 1 satir, 5*7 piksel
extern void veri_yolla(unsigned char);
extern void lcd_clear(void);
extern void lcd_yaz(const char *s);
extern void lcd_gotoxy(unsigned char x, unsigned char y);
extern void lcd_init(void);
extern void lcd_komut(unsigned char c);

fatihinanc

lcd kütüphanesinde bir sıkıntı görünmüyor. yanlız lcd_busy() fonksiyonunda o kadar bekleme yapmana gerek yok.

programdaki bütün kütüphanelerin aynı klasörde olması lazım(htc.h hariç) çünkü lcd kütüphanesinin içinde de delay.h tanımlı. o da olmadı projenizi yeniden oluşturun boş bir klasöre.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

metechno

dediklerinizi de yaptım ama hala derlemiyor dosyayı. acaba bilgisayardan veya programın ayarlarından kaynaklı bir problem olabilir mi ?

fatihinanc

gerçi derleyicinin sürümü de eskiymi ama. isterseiniz şson versiyonunu deneyin. önce eskisini kaldırın.

http://www.sonsivri.com/forum/index.php?topic=935.msg101920#msg101920
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

metechno

onu da deniyim.
biraz daha uğraşayım sorarım yapamadığım yerleri.
teşekkürler.