Proton PICBASIC ile AD9835 DDS kontrolü

Konuya girmeden önce Proton PICBASIC ile ilgili birkaç söz söylemek gerekiyor:  Crownhill firmasınca çıkarılan bir PIC basic derleyicisidir. Öğrenmesi oldukça kolay olan Proton PICBASIC ile pek çok PIC için programlar hazırlayabilirsiniz. Üstelik, sitesinden serbestçe indirebileceğiniz son sürümü hiç bir ücret ödemeksizin şu PIC'leri desteklemektedir: (Diğer PIC'ler için ücret ödemek gereklidir.)
10F200, 10F202, 10F204, 10F206, 10F222, 12F508, 12F508A, 12F509, 12F509A, 12F675, 12F683, 16F627, 16LF627, 16F627A, 16LF627A, 16F628, 16LF628, 16F628A, 16LF628A, 16F684, 16LF684, 16F685, 16LF685, 16F687, 16LF687, 16F688, 16LF688, 16F689, 16LF689, 16F84, 16F84A, 16F87, 16LF87, 16F88, 16LF88, 16F876, 16F876A, 16F877, 16F877A, 16F882, 16F883, 16F884, 16F886, 16F887, 12F1552, 12LF1552, 12F1572, 12LF1572, 16F1614, 16LF1614, 16F1826, 16LF1826, 16F1829, 16LF1829, 16F18323, 16LF18323, 16F1937, 16LF1937, 18F13K50, 18LF13K50, 18F14K50, 18LF14K50, 18F252, 18LF252, 18F2550, 18LF2550, 18F25K20, 18LF25K20, 18F25K22, 18LF25K22, 18F26K20, 18LF26K20, 18F26K22, 18LF26K22, 18F452, 18LF452, 18F4550, 18LF4550, 18F45K20, 18LF45K20, 18F45K22, 18LF45K22, 18F46K20, 18LF46K20, 18F46K22, 18LF46K22, PIC24EP128MC202, PIC24FJ64GA002, PIC24FJ64GA004, PIC24HJ128GP502, PIC24F04KL101, dsPIC33FJ128GP802

 Şimdi konumuza gelebiliriz.

DDS teknolojisi, çalışma sınırları dâhilindeki bir frekansın 1 Hz -ve hatta çok daha düşük- adımlarla sentezlenebilmesine imkân vermekdedir. Analog Devices firmasınca çıkarılan muhtelif DDS tümdevreleri var. Çok az devre elemanı ilâvesi ile kurulan bu devreler oldukça kullanışlıdır. Bu DDS tümdevrelerine kumanda etmek üzere C veya arduino uygulama lisanlarıyla yazılmış örnekler çokça olmasına rağmen, Proton PICBASIC ile hazırlanmış ve çalışan bir örneğe şahsen ben internetde rastlamadım. (Sâdece IK0GMM çağrı işaretli bir İtalyan amatörünün Multidevices DDS control diye bir projesi vardı; bu projede de asıl amaç AD9951'e kumanda etmek olup diğer DDS tümdevreleriyle ilgili kısımlar asıl kısmın yanında "eşantiyon" mahiyetindeydi ve bâzı yanlışlıkları da barındırıyordu.) Bu yüzden oturup Proton PICBASIC'le kendi programımı yazdım. (IK0GMM'nin yazılımında hatalar olsa da, AD9835'in register'larına kumanda konusunda iyi bir kaynak idi. Bu bakımndan kendisine teşekkürü borç bilirim.) Aşağıda kaynak kodlarını bulacağınız bu yazılım ile kendi AD9835 DDS'inizi hazırlayabilirsiniz.

Yazılımda, anlamayı kolaylaştırmak üzere gerekli açıklamalar da verilmişdir.

DDS'lerin frekans sınırları

DDS tümdevrelerinin üretebileceği en üst frekans Nyquist formülüne göre bulunur. Herne kadar teorik olarak Nyquist formülü mûcibince saat frekansının yarısı kadar bir frekans üretilebileceği neticesine varılabilirse de de, pratik sınırlamalar sebebiyle DDS tümdevrelerinde bu üst sınır saat frekansının 1/3'ü kadardır. (Bu konuda faydalı bir kaynak  http://www.analog.com/media/en/training-seminars/tutorials/MT-085.pdf adresinde bulunmakdadır)  Her DDS tümdevresinin maksimum saat frekansı tümdevrenin verikağıdında (data sheet) verilmişdir. AD9835'in maksimum saat frekansı 50 MHz olduğuna göre, üretebileceğiniz en üst frekans sınırı da 50/3=16.67 MHz civarındadır.

Eğer daha düşük frekanslarla çalışacaksanız, illa da 50 MHz'lik saat osilatörü kullanmanıza gerek yokdur. Meselâ, size gerekli olan en yüksek frekans 7.5 MHz ise bu durumda 7.5x3=22.5 MHz'lik bir saat osilatörü kullanmanız yeterli olacaktır. Saat osilatörü olarak DIL kılıftaki TTL veya CMOS osilatörleri rahatlıkla kullanabilirsiniz.

DIL Kılıfta 20 MHZ'lik bir osilatör

 

 

DDS kontrol devresinin şeması (büyük görmek için üzerine tıklayınız)

Bu projeje ile alâkalı olarak şu hususların da bilinmesinde fayda vardır:

1) PIC16F628A, dâhili osilatörle kullanılmak üzere tasarlandığından ve MCLR işlevi de kapatıldığından, devrede bir osilatör olmaması ve 5 numaralı bacağın boşda olması normaldir.

2) Proton PICBASIC'in yeni sürümlerinde alfanümerik LCD'lerin E, RS ve D4 ilâ D7 bacaklarının bağlanacağı PIC kapıları rahatlıkla ayrı ayrı belirlenebildiğinden, eğer daha farklı bir LCD bağlantısı kullanmak isterseniz, Declare LCD ... komutu ile bunu gerçekleşdirebilirsiniz.

3) Aşağıdaki açıklamalarda belirtildiği üzere, üretmek istediğiniz frekansa bağlı olarak saat frekansı osilatörünün değerini değişdirebilirsiniz. Bu durumda  tw=freq/(osc/(2^32) formülüne göre yeni bir tw değeri hesaplamalısınız.

4) Programı derlemek için Proton PICBASIC'in en son sürümünü kullanın. Proton PICBASIC'i  Crownhill firmasın internet sayfasından serbestçe indirebiliriniz.

5) Tam olarak ne yapdığınızı bilmeden programda değişiklik yapmayınız.

6) Programı, amatörlerin kullanımı için hazırladım. Ahlâkî ve hukûkî kurallara uyarak ticârî olmamak kaydıyla ve programı kullanabilir, üzerinde değişiklikler yapabilirsiniz. ANCAK, başkalarının yapdıklarını KENDİ ÇALIŞMASI OLARAK PAZARLAYAN AMATÖR BOZUNTULARIN YAPDIĞI GİBİ KAYNAK GÖSTERMEDEN DEĞİL!

 

; Buradan aşağıdaki kısmı kopyalayıp Proton IDE'sine yapışdırarak kullanabilirsiniz.

;****************************************************************
;* Name : ta2ei_ad9835dds.BAS                                   *
;* Author : Recep Aydın GÜLEÇ                                   *
;* Notice : Copyright (c) 2018                                  *
;* All Rights Reserved                                          *
;* Date : 04.05.2018                                            *
;* Version : 1.3                                                *
;* Notes : AD9835'in register'ları konusunda IK0GMM'nin yazılı- *
;*       : mı yol gösterici olmuşdur.                           *
;****************************************************************

;****************************************************************
;              _______
;             |  o o  |
;  DDS SCK A2 |1    18| A1
;          A3 |2    17| A0
;          A4 |3    16| A7 DDS UPDATE
;          A5 |4    15| A6 DDS DATA
;          0V |5    14| + 5V
;   AŞAĞI  B0 |6    13| B7 LCD D7
;   YUKARI B1 |7    12| B6 LCD D6
;   LCD E  B2 |8    11| B5 LCD D5
;   LCD RS B3 |9    10| B4 LCD D4
;             |_______|
;      16F628A bacak bağlantıları

; ###  A Ç I K L A M A L A R  #################################################################

; 1) Bu yazılım ile, PIC16F628, dahili osilatörle çalıştırıldığı için 15. v 16. bacağa bağlı  #

; kristale ve kondansatörlere gerek yoktur. Ayrıca, MCLR devre dışı bırakıldığı için          #

; 4. bacaktan VDD'ye bağlantıya da gerek yokdur. Bu sebeple, 5. 15. ve 16. bacaklar port      #

; olarak kullanılabilmekdedir. 14. bacak ile GND arasına bağlanacak 100 nF'lık kondansatör    #

; 14. bacağın hemen dibinde olmalıdır. (Ben, uygulamalarımda 14. ilâ 5. bacak arasına bir     #

; adet SMD 100nF lehimliyorum.)                                                               #

; 2) DDS'in TW'ü (tuning word)şöyle hesaplanmakdadır:                                         #

;              tw=freq/(osc/(2^32))                                                      #

; Burada, freq, üretilmek istenilen frekansı, osc ise DDS'in saat (osilatör) frekansını       #

; göstermekdedir. 2^32, 2'nin 32. kuvvetini ifade etmekte olup bu da 4294967296'dır.          #

; Bu işlemlerin işlemciyi kasmaması için formül sadeleştirilerek, 50 MHz'lik bir saat         #

; frekansı için Hz cinsinde hesaplama için                                                    #                                     

;             tw=freq/0.01164153218269                                                  #

; hâlinde kullanılmakdadır.                                                                   #

; Eğer başka değerli bir saat frekansı (osilatör) kullanmak istiyorsanız hesabı ona göre      #

; yapmalısınız.                                                                               #

; AD9835, frekans tuning word'ü 4 bayt olarak istediği için frekans değeri 4 bayt'a           #

; bölünmüş; ayrıca, AD9835'in register'larının istediği belli komut değerleri de başa         #

; eklenerek DDS'e gönderilmişdir.                                                             #

; Aşağıdaki örnekde, başlangıç frekansı 7 MHz olarak belirlenmişdir. Siz başka bir frekans    #

; seçebilirsiniz. Ancak, DDS'lerin üst frekans sınırı ile genel kurala uymak kaydıyla!        #

; Aşağıdaki örnekde, 50 MHz'lik bir saat frekansı kullanıldığına göre üretilebilecek mak-     #

; simum frekans 17 MHz civarındadır.                                                          #
; #############################################################################################
;### GİRİŞ BİLDİRGELERİ #######################################################################
Device 16F628A                         ; İşlemci 16F628A                                     
#
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF ; iç osilatörü kullan,MCLR  
#  
                                       ; devre dışı, WDT kapalı, PWRTE açık                  
#

All_Digital TRUE                       ; Bütün girişler dijital                               #
Declare Xtal = 4                       ; Dâhili osilatör 4 MHz'de çalışacak                  
#
Declare LCD_Lines 2                    ; 2 satırlı LCD kullanılacak                          
#
TRISB = %00000011                      ; B1 ve B2 giriş                                      
#
;### SEMBOL VE DEĞİŞKENLER ###############################################################
#####
Symbol DATADDS=PORTA.6                 ; DATA DDS port A.6'ya bağlanacak                     
Symbol SCLK=PORTA.2                    ; SCLK DDS port A.2'ye bağlanacak
Symbol UPDATE=PORTA.7                  ; UPDATE DDS port A.7'ye bağlanacak
Dim tw          As Dword               ; DDS'in frekans ayar kelimesi
Dim twa         As tw.Word0            ; TW'ün ilk 16 biti (düşük değerlikli)
Dim twb         As tw.Word1            ; TW'ün ikinci 16 biti (yüksek değerlikli)
Dim twadus      As twa.LowByte         ; TW'ün ilk 16 bitinin düşük değerli 8 biti
Dim twayuk      As twa.HighByte        ; TW'ün ilk 16 bitinin yüksek değerli 8 biti
Dim twbdus      As twb.LowByte         ; TW'ün ikinci 16 bitinin düşük değerli 8 biti
Dim twbyuk      As twb.HighByte        ; TW'ün ikinci 16 bitinin yüksek değerli 8 biti
Dim freq        As Dword               ; DDS'in üreteceği frekans
Dim freq_if     As Dword               ; Arafrekans
Dim freq_clock  As Dword               ; DDS'in saat frekansı
Dim sabit       As Dword

; İlk değerler ************************************************************************
freq=7000000                           ; Başlangıç frekansı (Kendinize göre ayarlayınız)
freq_if=0                              ; Arafrekans değeri
freq_clock=50000000                    ; DDS,50 MHz;lik saat frekansında çalıştırılacak.
PORTB.0=1                           
PORTB.1=1
DelayMS 1000
Cls
Print At 1,6,"TA2EI AD9835 DDS"        ; Açılış ekran mesajı
GoSub TW_hesapla                       ; 7 MHz için DDS'e gönderilecek veriyi hesapla
GoSub DDS_F                            ; DDS'i ilk çalıştırmaya hazırla ve fr. bilgisini gönder
GoSub GOSTER                           ; Ekranda göster 

              
;### DDS ana döngü ##################################################################
ANA:
If PORTB.0=0 Then GoSub DOWN          ; B.0 portu 0 ise aşağı sayma alt rutinine git
If PORTB.1=0 Then GoSub UP            ; B.1 portu 0 ise yukarı sayma alt rutinine git
GoTo ANA                              ; Döngü
;####################################################################################


; *** Aşağı ve yukarı sayma alt rutinleri *******************************************
DOWN:
    freq=freq-10000                  ; Aşağı tuşuna basılınca frekansı 10000 azalt
    GoSub TW_hesapla                 ; Yeni frekansa göre TW'ü hesapla alt rutinine git
    GoSub GOSTER                     ; Yeni frekansı LCD'de göster alt rutinine git
    GoSub DDS_U                      ; Yeni frekans bilgisini DDS'e gönder alt rutinine git
    DelayMS 80                       ; 80 ms bekle
    Return                           ; Gönderen yere dön
UP:
    freq=freq+10000                  ; Yukarı tuşuna basılınca frekansı 10000 arttır
    GoSub TW_hesapla                 ; Yeni frekansa göre TW'ü hesapla alt rutinine git
    GoSub GOSTER                     ; Yeni frekansı LCD'de göster alt rutinine git
    GoSub DDS_U                      ; Yeni frekans bilgisini DDS'e gönder alt rutinine git
    DelayMS 80                       ; 80 ms bekle
    Return                           ; Gönderen yere dön
; Tuning Word hesaplama alt rutini *****************************************************
TW_hesapla:
tw=freq/0.01164153218269
Return

;*** DDS;e frekans bilgilerini gönderme rutini *****************************************
;DDS_f Kısmı, AD9835'in ilk yüklemesi için gerekli. Daha sonra, fr. yüklemek için DDS_U
;rutini yeterlidir.
DDS_F:
Low UPDATE:SHOut DATADDS,SCLK,MsbFirst,[248,0]:High UPDATE:DelayUS 300
Low UPDATE:SHOut DATADDS,SCLK,MsbFirst,[176,0]:High UPDATE:DelayUS 300
Low UPDATE:SHOut DATADDS,SCLK,MsbFirst,[192,0]:High UPDATE:DelayUS 300

DDS_U:

Low UPDATE:SHOut DATADDS,SCLK,MsbFirst,[51,twbyuk]:High UPDATE:DelayUS 300
Low UPDATE:SHOut DATADDS,SCLK,MsbFirst,[34,twbdus]:High UPDATE:DelayUS 300
Low UPDATE:SHOut DATADDS,SCLK,MsbFirst,[49,twayuk]:High UPDATE:DelayUS 300
Low UPDATE:SHOut DATADDS,SCLK,MsbFirst,[32,twadus]:High UPDATE:DelayUS 300
Low UPDATE:SHOut DATADDS,SCLK,MsbFirst,[80,0]:High UPDATE: DelayUS 300
Return

; *** Değerleri LCD;de gösterme alt rutini **********************************************
GOSTER:
    Print At 2,1,"freq :",Dec freq    ; Frekansı LCD'de göster
    DelayMS 500                       ; 500 ms bekle

    Return                            ; Gönderen yere dön

; ### PROGRAMIN SONU ####################################################################

; #######################################################################################