TEA5767 PIC16F628 Dijital PLL kontrollü FM Radyo Alıcı Sistemi

TEA5767 PIC16F628 Dijital PLL kontrollü FM Radyo Alıcı Sistemi

Uzun zamandır yeni bir proje yayınlamamıştım. Bunun sebepleri var elbette. Proje çok ama yayınlama isteğim yok.

Çünkü sürekli olarak projelerimi ticari mal haline getirip satıyorlar. Diyeceksiniz ki ne karışıyorsun sen açık kodu veriyorsun devreyide veriyorsun gerisi yapanın insafına kalmış. Ama durum öyle değil. İş ticarete gelince yapanın hakkınıda düşünmek gerekir. Her neyse hiç bir projemin ticari mal olarak satılmasına razı değilim bunu herkesin bilmesini istiyorum. Satmak isteyen banden izin alması gerekir.

border bolme

Evet gelelim yeni projeye, bir “Dijital ve PLL kontrollü FM Radyo Alıcı Sistemi”  vereceğim. Bazılarına basit bir proje gibi gelebilir. Ama sistem geliştirmeye çok açık bir proje. Şu anda piyasada olan en modern radyoların tüm özelliklerini taşımasına rağmen kısıtlı imkanlar nedeni ile basite indirgeyerek yaptım bu projeyi. Bu bir tam digital PLL kontrollü FM radyo projesidir.


Proteus isis devre şeması ve pcb baskı devre alt, üst resimleri;

proteus-isis-tea5767-pic16f628-dijital-pll proteus-ares-tea5767-pcb-dijital-pll proteus-ares-tea5767-pcb-dijital-pll-anten-ust

Radyo-57_YEN.bas yazılım içeriği;


'********************************************************
'*  Name    : UNTITLED.BAS                              *
'*  Author  : [E.T.E]                                   *
'*  Notice  : Copyright (c) 2006 [Ete]                  *
'*          : All Rights Reserved                       *
'*  Date    : 21.12.2006                                *
'*  Version : 1.0                                       *
'*  Notes   : İLERİ VE GERİ TARAMA TUŞLARI İLE ÇALIŞIR  *
'*          : OTOMATİK BANT SONUNA GİTME VAR
'*                                                      *
'********************************************************

@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_ON
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_OFF
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT

DEFINE LCD_DREG		PORTB 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT		0	 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG	PORTA	'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT	3	 'LCD RS bacağı Hangi Bite bağlı ?
'define lcd_RWREG    PORTB
'define LC_RWBIT     2
DEFINE LCD_EREG		PORTA	'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT		4		'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS		4		'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES	2 'LCD Kaç sıra yazabiliyor
DEFINE SHIFT_PAUSEUS 3500 'shift komutunda gecikme süresi
PORTA=0                     'PORTA yı sıfırladık
PORTB=240  'PortB=%11110000 = 240 yapıldı
TRISA=%11100100 'A portu giriş çıkış düzenlemesi yapıldı
TRISB=0 'B portu tamamı çıkış olarak ayarlandı

CMCON=7  'komparatörler iptal edildi

'--------------kullanılan değişkenlerimiz ------------
DATA_BIR  var byte
DATA_IKI  var BYTE
DATA_UC   VAR BYTE
DATA_DORT VAR BYTE
DATA_BES  VAR BYTE
FREKANS   VAR WORD
FREQ      VAR WORD
PLL       VAR WORD
TEMP      VAR word
SES       VAR BYTE
VOL       VAR BYTE
SAYI      VAR BYTE
VERI3     VAR BYTE
Z         VAR BYTE
I         VAR BYTE
TEST      VAR BYTE
SIRA      VAR BYTE
SISTEM    VAR BIT
YON       VAR BIT
POZ       VAR BIT

ACIK      CON 1   'ACIK=1 yapıldı sabit değer değişmez
KAPALI    CON 0   'KAPALI=0 yapıldı sabit değer değişmez

symbol DTA     =PORTA.0  'I2C DATA PİNİ
SYMBOL CLK     =PORTA.1  'I2C CLK PİNİ
SYMBOL ILERI   =PORTA.6 'YUKARI TARAMA TUSU
SYMBOL GERI    =PORTA.7 'AŞAĞI TARAMA TUSU
SYMBOL SES_AC  =PORTA.5  'SES AÇMA TUSU
SYMBOL SES_KAPA=PORTA.2 'SES KAPATMA TUSU

SES=5  'default ses değeri
DTA=1  'Radyo modülü data hattı=1 yapıldı
CLK=0  ' Radyo modülü CLK hattı=0 yapıldı
GOSUB STOP_VER 'Radyo modülüğne STOP bilgisi verildi
GOSUB STOP_VER  'emniyet için tekrar stop bilgisi verildi
GOSUB STOP_VER  'emniyet için tekrar stop bilgisi verildi
POZ=1 '1=HIGHSIDE TARAMA  , 0=LOW SIDE TARAMA

frekans=8700 'default açılış frekansı 88 MHz olarak verildi
FREQ=FREKANS:GOSUB EKRAN
gosub hesap
gosub UP_SCAN
BASLA:
if ILERI =0 then  'şayet tarama_ileri tuşuna basılmış ise
FREKANS=frekans+5
IF FREKANS>10800 THEN FREKANS=10800
IF POZ=1 THEN
GOSUB HIGHSIDE
ELSE
GOSUB LOWSIDE
ENDIF
TEST=TEST+1 'Otomatik bant sonuna gitme için test değerini bir artır
IF TEST>6 THEN pll=13211 'ileri tuşuna hala basılı tutyor isek pll=bant sonu değeri
DATA_BIR=PLL.BYTE1+$50 '1 nolu data registerine PLL değerini ve $C0 değerini
DATA_IKI=PLL.BYTE0  'iki nolu data registerine PLL low bayt'ını yükle
gosub UP_SCAN 'yüklenen değeri radyoya ver ve ilgili frekansı çaldır
gosub ISTASYON 'İstasyon bulundumu bak
GOTO CIK  'CIK etiketine git.
ENDIF

IF GERI=0 then 'şayet geri tarama tuşuna basılmış ise
FREKANS=FREKANS-5
IF FREKANS<8700 then FREKANS=8700           IF POZ=1 THEN              GOSUB HIGHSIDE            ELSE              GOSUB LOWSIDE            ENDIF           TEST=TEST+1 'tuşa hala basılı ise test değerini bir artır           IF TEST>6 THEN PLL=10653 'hala basılı ise otomatik bant sonu değerini al
DATA_BIR=PLL.BYTE1+$50 'data registerlerine yükle
DATA_IKI=PLL.BYTE0
gosub DWN_SCAN 'geri tarama bölümüne git ve değerleri modüle yükle
gosub ISTASYON           'istasyon bulundumu bak
GOTO CIK  'CIK etiketine git.
endif
TEST=0                     'şayet ileri ve geri tuşlarına basılmıyor ise Test=0 yap
CIK:    GOSUB SES_BAK 'ses değeri artırılıyormu git bak
GOTO BASLA 'aynı işlemleri için başa git.

UP_SCAN:  'İleri tarama alt programı
YON=0
gosub START_VER  'Radyo modülüne start komutunu ver
ShiftOut dta,clk,1,[$C0] ' Modüle Yazma yapılacağını bildir  mute iptal olursa $40 verilecek
GOSUB ACK_AL 'Byte yazıldı teyid (ACK) al.

ShiftOut dta,clk,1,[DATA_BIR] ' Data-1 gönderildi
GOSUB ACK_AL  'Byte gönderildi teyidini al

ShiftOut dta,clk,1,[DATA_IKI] ' Data-2 gönderildi
GOSUB ACK_AL 'Byte gönderildi teyidini al
IF POZ=1 THEN
VERI3=$D0   'HIGHSIDE
ELSE
VERI3=$C0   'LOWSIDE
ENDIF
ShiftOut dta,clk,1,[VERI3] ' Data-3 gönderildi B0=LOW A0 - D0=Mid C0 -F0=HIGH E0
GOSUB ACK_AL 'Byte gönderildi teyidini al  & 1011 0000

ShiftOut dta,clk,1,[$11] ' Data-4 gönderildi
GOSUB ACK_AL 'Byte gönderildi teyidini al

ShiftOut dta,clk,1,[$00] ' Data-5 gönderildi
'        GOSUB ACK_AL 'son bölümde teyid almaya gerek yok artık

gosub STOP_VER 'işlem tamam modüle stop bilgisini ver
return  'geri dön.

ACK_AL:
Input dta ' DATA hatı giriş olarak ayarlandı , ack alınacak
While dta=1 'ack=1 ise sıfır oluncaya kadar bekle
Wend
PulsOut clk,1 ' bu konuma ack alınınca geçilir, ack alındı bir clk palsi gönder
RETURN

ACK_VER:
OUTPUT DTA  'DATA hattı çıkış olarak ayarlandı ACK gönderilecek
LOW DTA 'DATA hattı LOW a çekildi
HIGH CLK 'CLK High yapıldı
LOW CLK 'CLK low yapıldı yani bir pals verilmiş oldu
HIGH DTA 'DATA hattı HIGH yapıldı
return 'ACK verilmesi tamamlandı geri dön.

ISTASYON:
pause 50
GOSUB RADYO_OKU
LCDOUT $fe,$80,dec1 DATA_BIR.7
IF DATA_BIR.7=1 then
PLL.byte1=DATA_BIR & %00111111
PLL.Byte0=DATA_IKI
PLL=(PLL/10)*10
IF POZ=0 then
TEMP=PLL+28
else
TEMP=PLL-28
ENDIF
TEMP=TEMP*1024
freq=div32 1250
freq=(freq/10)*10

'               freq=freq+5
'               temp=freq dig 0
'               temp=(temp/5)*5
'               freq=(freq/10)*10+temp

DATA_BIR=PLL.BYTE1
DATA_IKI=PLL.BYTE0
If yon=0 then
GOSUB UP_SCAN
GOTO ATLA
ENDIF
GOSUB DWN_SCAN 'şayet geri tarama modunda isek
ATLA:  'geri tarama değerleri module yazıldı
GOSUB EKRAN
frekans=freq
RETURN
endif
goto ISTASYON 'istasyon henüz bulunmadı tekrar bak

EKRAN:
LCDOUT $FE,$81,"   ",DEC FREq/100,",",DEC2 (FREq//100)," MHz   "
LCDOUT $FE,$8F,dec poz 'poz=1 ise HIGH side  Poz=0 ise LOW side tarama yapılıyor
lcdout $fe,$c7," PL:",dec5 PLL
RETURN

RADYO_OKU:
gosub START_VER  'okuma için modüle start ver
ShiftOut dta,clk,1,[$C1] ' okuma emri modüle gönderildi
GOSUB ACK_AL 'ACK yani teyid al.

GOSUB BYTEAL:DATA_BIR=SAYI  'ilk byte modülden alındı
GOSUB ACK_VER  'aldığının teyidini ver

GOSUB BYTEAL:DATA_IKI=SAYI     'ikinci byte alındı
GOSUB ACK_VER 'aldığının teyidini ver

GOSUB BYTEAL:DATA_UC=SAYI  'üçüncü byte alındı
GOSUB ACK_VER 'aldığının teyidini ver

GOSUB BYTEAL:DATA_DORT=SAYI   'dördüncü byte alındı
GOSUB ACK_VER  'aldığının teyidini ver

GOSUB BYTEAL:DATA_BES=SAYI  'beşinci byte alındı
'          GOSUB ACK_VER 'son byte için teyid vermeye gerek yok
GOSUB STOP_VER  'işlem sona erdi stop komutunu ver.
pause 50
RETURN

DWN_SCAN:
YON=1 'yon=1 geri tarama yapılıyor
gosub START_VER 'start komutunu ver
ShiftOut  dta,clk,1,[$C0] ' yazma yapılacak komut verildi
GOSUB ACK_AL 'byte yazıldı ack al.

ShiftOut  dta,clk,1,[data_bir] ' Data-1 gönderildi
GOSUB ACK_AL 'byte yazıldı ack al.

ShiftOut  dta,clk,1,[data_iki] ' Data-2 gönderildi
GOSUB ACK_AL 'byte yazıldı ack al.
IF POZ=1 THEN 'HIGHSIDE
VERI3=$50
ELSE
VERI3=$40
ENDIF
ShiftOut dta,clk,1,[VERI3] ' Data-3 gönderildi $20=Low - $40=Mid - $60=High
GOSUB ACK_AL                   'byte yazıldı ack al. 

ShiftOut  dta,clk,1,[$11] ' Data-4 gönderildi
GOSUB ACK_AL 'byte yazıldı ack al.

ShiftOut dta,clk,1,[$00] ' Data-4 gönderildi
'        GOSUB ACK_AL  'son bölümde teyid almaya gerek yok artık

gosub STOP_VER 'işlem tamam stop komutu ver.
return

START_VER:
HIGH CLK
HIGH DTA
LOW DTA
LOW CLK
HIGH DTA
RETURN

STOP_VER:
low dta
high CLK
HIGH DTA
RETURN

SES_BAK:
IF SES_AC=0 then
SES=SES+1
IF SES=16 then SES=15
PAUSE 230
endif

IF SES_KAPA=0 then
SES=SES-1
IF SES=255 THEN SES=0
PAUSE 230
endIF
VOL=ses<<4                       PORTB=VOL 'pic in bacaklarına bağlı olarak 4066 ya değer gönder         lcdout $fe,$C0,"Ses:",dec2 (15-ses) '        lcdout $FE,$C0,rep $FF(16-SES),rep 32ses         RETURN                HESAP: ARA:          temp=FREKANS *1250        pll=div32 1024        IF POZ=1 THEN           pll=pll+28        else           pll=pll-28        endif              DATA_BIR=PLL.BYTE1        DATA_IKI=PLL.BYTE0        gosub ekran        PAUSE 10        RETURN        GERIYE:        goto ara    BYTEAL:     'bit bazında radyo modülünden bilgi almak için yazıldı        Z=128:SAYI=0  'sayı=0 ve karşılaştırma bit değeri 128        input DTA     'Data hattı giriş olarak ayarlandı        FOR I=0 to 7  '0-7 arasında toplam 8 adet döngü kur        HIGH CLK      ' CLK=High yapıldı        if dta=1 then SAYI=SAYI | Z  'Data hattı 1 ise Sayının Z bitini high yap        LOW CLK        'clk low yapıldı        Z=Z>>1         'bir sonraki bite geç
NEXT
output dta 'data hattı yeniden çıkış olarak ayarlandı
HIGH DTA  'data hattı High yapıldı
RETURN

HIGHSIDE:
temp=FREKANS *1250
pll=div32 1024
pll=pll+28
return

LOWSIDE:
temp=FREKANS *1250
pll=div32 1024
pll=pll-28
return

Sistemin Radyo alıcı katı Phillips firmasının üretmiş olduğu TEA5767 entegresine dayanmaktadır. Söz konusu entegre asgari malzemelr kullanılarak bir modül haline getirilmiş ve ve bu sistemde bu modül kullanılmıştır.

Söz konusu entegre hem I2C hemde SPI modunda haberleşme yapabilmekte olup ben SPI modunu kullandım.

Piyasada bulunabilecek en kaliteli digital radyolarda ne özellik var ise hepsini barındırmaktadır.

Vermiş olduğum projede ben hem yer darlığı hem seçtiğim işlemci nedeni ile kısıtlı imkanlarını kullandım. Projemde yalnızca sağa sola otomatik tarama yapmakta sistem. Uzun basılınca bant sonuna atlamaktadır.

Bu modül ile aşağıdaki işlemleri yaptırmak mümkündür;

1. Tuş takımından girilen bir frekans değerini çaldırmak

2. Bulunan istasyonları otomatik Ya da manuel kayda almak. 1-10 arası butonlarınız olursa ve bu butonların herhangi birisine 5 sn den fazla basarsanız istasyon otomatik kayda alınabilir. Daha sonra bu tuşa kısa basılarak o istasyonun çaldırılması sağlanabilir.

3. Bir tarafa doğru zayıf istasyonları diğer tarafa doğru yalnızca kuvvetli istasyonları bulması sağlanabilir.

Şimdilik aklıma gelenler bunlar. Entegrenin data sheeti incelenerek diğer özellikler hakkında bilgi alabilirsiniz.

Devrede TDA7056 entegresini amplifikatör olarak kullandım. Bu entegre voltaj kontrollü olarak volum kontrolü imkanı sağlamaktadır. Voltaj kontrolünü 4066 entegresi ile gerilim bölerek hallettim. Tabiiki devrem yalnızca Mono çalışıyor. Modül stereo çalışmakta olup ben iki kanalı birer kondansatörle birleştirerek mono anfiye giriş yaptım. İstenirse devre stereo olarak dizayn edilebilir.

Anfi olarak benzer şekilde çalışan modeller bulunmakta olup buna bağlı olarak daha değişik güçte ve özellikte sistemler kullanılabilir.

Şu anda devre yalnızca buton kontrollü volüm ayarı ile yine buton kontrollü istasyon bulma özelliğine sahiptir.

Modül tabiiki yurt dışından alınması gerekiyor. Bu konuda bir Kanada firmasını buldum ve onlardan 10 adet modül aldım. Ancak Birkaç kişiye radyo yaptım ve elimde yalnızca 4 adet modül kaldı. İsteyenlere verebilirim . Bana maliyeti 9 küsür Tl yi buldu. Bende tanesini 10 TL ye veriyorum.

Çin de bu modülleri daha ucuza bulmak mümkün hatta 1-2 dolara bulmak mümkün ancak miktarlı alımlarda bu fiyatı uyguluyorlar. Bir başka firma ile temasım sürüyor. Normalde 1000 adet den az sipariş kabul etmiyorlar. Ancak firma yetkilisi Bay Johnson ile görüştüm ve amatörler için min. 10 adetlik siparişleri kabul edebilecek. Ödeme Paypal ile yapılıyor sevkiyat posta yolu ile olunca ucuza gelebilecek.

Firma web sayfası;  http://www.szblessed.com/English/index.asp

Firmada temas halinde olduğum Bay Johnson var. Kendisine ismimi (Erol Tahir Erdal) verirseniz az miktar konusunda yardımcı olacaktır. Bay Johnson un mail adresi ; [email protected]

Diğer taraftan pek çok telefon üreticisi bu modülü kullanarak FM radyolu telefonda yapmaktadır. Bu nedenle hurdaya çıkmış radyolu telefonların içinde söz konusu radyoyu bulabilirsiniz.

Neyse dosyalar ilişiktedir. Bu devreden bir kaç tane yaptım. Şu anda kullanıyorum. Çalışmıyor diye bana lütfen geri dönmeyin. Kesin çalışıyor.

devrenin PCB sini ve yerleşme planını ayrıca Word dosyası içinde veriyorum. orda yer alan PCB 1/1 ölçeğindedir ve direk basılarak PCB yapılabilir.

Not: Modül E-Bay da yeniden satılıyormuş. aşağıda linki veriyorum.

http://shop.ebay.com/i.html?_nkw=tea5767&_sacat=0&_odkw=tea5767+modul&_osacat=0&_trksid=p3286.c0.m270.l1313

Hepsi bu kadar. Yapacaklara şimdiden başarılar temenni ederim.

ETE

TEA5767 Dijital PLL kontrollü FM Radyo Alıcı projesine ait proteus isis simülasyon dosyası ve kaynak picbasic pro kod dosyaları:

Paylaş:

Yorum Yap