AD9833 SIN-GEN ARDUINO IDE(SPI lib.)

SPI gereği neyse onu yapmak lazım. Belki AD9833 FSYNC'in yükselen kenarında belli bir iş yapıyor.
Önce tam register listesi çıkarayım.
Sonra programı yazmaya geçeceğim.

Hangi registere out frekans yazıyoruz.
Hangi register çıkışı on of yapıyor.
Hangi register chipi uyku moduna alıyor.

Bunları tespit edeyim
 
proje yapmak isteyen e bir tane hediye edebilirim.

kullandıgım çalışan kütüphane bir zamanlar github dan bulmuşdum.

C++:
#define FSYNCHIGH        GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_SET);
#define FSYNCLOW        GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_RESET);
#define SDATAHIGH        GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_SET);
#define SDATALOW         GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET);
#define SCLKHIGH         GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_SET);
#define SCLKLOW            GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_RESET);

void set_freq(long frequency);
void AD9837Write(int dat);

FSYNCHIGH;
SDATAHIGH;
SCLKHIGH;
set_freq(1000);

void set_freq(long frequency)
{
    int MSB;
    int LSB;
    int phase = 0;
    long FREQ0_REG0;
    float AD9837Val = 0.00000000;

    AD9837Val = (((float)(frequency))/25000000);
    FREQ0_REG0 = AD9837Val*0x10000000;

    MSB = (int)((FREQ0_REG0 & 0xFFFC000)>>14); //14 bits
    LSB = (int)(FREQ0_REG0 & 0x3FFF);

    //Set control bits DB15 ande DB14 to 0 and 1, FREQ0 register write(D15, D14 = 01)
    LSB |= 0x4000; //0b 0100 0000 0000 0000
    MSB |= 0x4000; //0b 0100 0000 0000 0000

    phase &= 0xC000; //0b1100 0000 0000 0000 =>When writing to a phase register, Bit D15 and Bit D14 are set to 11.

    AD9837Write(0x2100);//0b 0010 0001 0000 0000 => Set D13(set frequency registers. B28 bit)and D8 (Reset=1)

    delay(100);

    AD9837Write(LSB);  //Write Freq lower 14 bits

    AD9837Write(MSB);  //Write Freq upper 14 bits

    AD9837Write(phase);  //mid-low

    delay(10);

    AD9837Write(0x2000); //sin wave
    //AD9837Write(0x2020); //square
    //AD9837Write(0x2002); //triangle
}

void AD9837Write(int dat)
{
    int x;

    FSYNCLOW;  //Set FSYNC low

    for (x = 0; x < 16; x++)
    {
        if (dat & 0x8000)
        {
            SDATAHIGH;   //Set SDATA according to MSB in cmd
        }
        else
        {
            SDATALOW;
        }

        SCLKLOW;  //CLK transistion to latch the bit into the AD9835
        SCLKHIGH;
        dat <<= 1;  //Shift to next bit in cmd
    }

    FSYNCHIGH;  //Set FSYNC high
}
 
Last edited by a moderator:
Kurbanı kestik.
Dolaba yerleştirdik.

Çalışmaya devam edeyim bu konu üstüne.
 
NOC.png

Hmm biraz geçte olsa anladım.

noc1.png

16 ayrı data var
verdiği örnekte'de 16 data var bunları 0-1 yaparak set ediyoruz.
 
Başlıktaki without lib noluyor yav? Gavurların da mı yararlanmasını istiyorsun çalışmandan :)
 
Başlıktaki without lib noluyor yav? Gavurların da mı yararlanmasını istiyorsun çalışmandan :)
yok forum halkına arasında bilmeyen varsa KÜTPHANESİZ , KÜTÜPHANE KULLANMADAN ne demek olduğunu göstermek için yazdım özellikle yeni aldığımız bir modül ile araştırma yaparken başlıktan anlayabiliyoruz böyle kalıpları öğrenince.

without library yazıyorsa herif o modülü kütüphane kullanmadan çalıştırmıştır vs.
 
senin bu yükselteç yarı yarıya frekansı düşürmüş olmalı

ad9833 25MHz olarak yazıyor datasında senin attığun modül linkinde 12.5MHz

Linkteki modülün üstünde de, bendeki modülün üstünde de 25 MHz lik kristal osilatör var. Ama AD9833 ün kendisi 12.5 MHz e kadar destekliyor.
 
C++:
#include <SPI.h>
#define fsync 10

void setup() {
  SPI.begin();
  pinMode(fsync, OUTPUT);
}

void loop() {
 digitalWrite(fsync, LOW);
 SPI.transfer(0x100);//resetle
 delay(1);//bekle
 SPI.transfer(100);//100F gönder
 SPI.transfer(0xC000);//ph0 aktif et
 SPI.transfer(0x2028);//kare dalgaya ayarla
 digitalWrite(fsync, HIGH);
}

Bu şekilde en minimal halde bir program yazıyorum.

ben kare set ediyorum o ne olursa olsun 100kHz sinüs çıkarıyor

belki frekans yerine 100 yazıoyrum diye 100kHz çıkıyordur dedim onu değiştirsem'de 100 çıkıyor.
ayrıca kare set ediyorum üçgen set ediyorum fark etmiyor yine de sinüs çıkarıyor.
 
Birkaç problem var. SPI yapılandırman lazım önce. SPI hızını, SPI modunu belirtmen lazım, ayrıca SPI pinlerinin de ne olduğunu belirtmen lazım. FSYNC de SPI ın CS pini onu da yapılandırırken belirt ve senin yaptığın gibi manuel kontrol etme. Ayrıca 16 bit veri yazarken SPI.transfer16 kullanman lazım. Aşağıdaki örnekten yola çıkabilirsin.

 
Birkaç problem var. SPI yapılandırman lazım önce. SPI hızını, SPI modunu belirtmen lazım, ayrıca SPI pinlerinin de ne olduğunu belirtmen lazım. FSYNC de SPI ın CS pini onu da yapılandırırken belirt ve senin yaptığın gibi manuel kontrol etme. Ayrıca 16 bit veri yazarken SPI.transfer16 kullanman lazım. Aşağıdaki örnekten yola çıkabilirsin.

deneyleri uno üstünde yapıyorum abi.

Tek spi hattı bulunduğu için atama gerekmiyor sanırım.
CS'yi otomatik olarak kendisi nasıl halledecek onu bilmiyorum

transfer16 olarak yazınca 100kHz olan sinüs 193kHz'ye çıktı başka bir değişim olmadı.
biraz daha uğraşayım en azından dalga tipini değiştirmem gerekiyor bu kadar datasheet okumanın üstüne.
 
deneyleri uno üstünde yapıyorum abi.

Tek spi hattı bulunduğu için atama gerekmiyor sanırım.
CS'yi otomatik olarak kendisi nasıl halledecek onu bilmiyorum

transfer16 olarak yazınca 100kHz olan sinüs 193kHz'ye çıktı başka bir değişim olmadı.
biraz daha uğraşayım en azından dalga tipini değiştirmem gerekiyor bu kadar datasheet okumanın üstüne.

Hem herşeyi manuel yapayım diyorsun, hem de SPI pinlerinin atamasını, yapılandırmasını kendisi yapıyor diyorsun. Yukarıda verdiğim örnekte full yapılandırma var, hiçbir şeyi kütüphanenin keyfine bırakmamış oluyorsun.
 
SPI kütüphanesini kullanıyorsun, o yüzden kütüphanesiz demek de aslında doğru değil.
 
standart arduino kartlarının kullandığı SPI kütüphanesinde setCS gibi komutlar çalışmıyor onları earle abim yazmış galiba pico için.
zaten tek SPI hattımız var set komutları çalışssa'da onları atayacağız.

SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
Bu satırdan anladığım SPI veri transferini 1milyon hız değerinde başlat, önce MSB'yi ilet, spı mode 0 hakkında hiçbir fikrim yok.
 
Anladım. Ben de Arduino IDE ile ilk SPI programımı pico için yazmış bulundum ve bunun genel birşey olduğunu varsaydım. O zaman Atmega328 de SPI kullanırken CS manuel kontrol ediliyor, pin belirleme de yok diyorsun yani. Earl abin şımarttı beni, artık başka şekilde olanını beğenmiyorum :katil2:
 
az daha modülü camdan atıyordum.

sonradan fark ettim ben MSB yazıyorum ama LSB yazmıyorum ki.
ama nasıl yazacğımı bilmiyorum :katil2:

adamlar datasheet'e yazmışlar halubki.

hazır kütüphanenin .h dosyasından kopya çekebilir miyiz?
 
Olmaz kopya yasak! Kontrol edeceğim sonra :)

Olayı kendin anlayıp öğrendikten sonra istediğin yerden hazır kütüphane, hazır kod kullanabilirsin, ama ondan önce olmaz.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,961
Mesajlar
118,863
Üyeler
2,826
Son üye
CortexPhoton

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top