AD9833 SIN-GEN ARDUINO IDE(SPI lib.)

C++:
#include <LiquidCrystal_I2C.h>
#include <SPI.h>

#define AD9833_CS 10
unsigned long freq0 = 0;

LiquidCrystal_I2C lcd(0x27, 16, 2);

/*
int bir = 0;
int onn = 0;
int yuz = 0;
int bin = 0;
int onbin = 0;
int yuzbin = 0;
int birm = 0;
int onm = 0;
*/


long bir = 0;
long onn = 0;
long yuz = 0;
long bin = 0;
long onbin = 0;
long yuzbin = 0;
long birm = 0;
long onm = 0;

double fin;


byte kare1[8] = {B00000, B00000, B01111, B01001, B01001, B01001, B01001, B11001};
byte kare2[8] = {B00000, B00000, B01111, B01001, B01001, B01001, B01001, B11001};

byte sin1[8] = {B00000, B00010, B00101, B00101, B01000, B01000, B10000, B10000};
byte sin2[8] = {B00000, B00000, B00001, B00001, B10010, B10010, B01100, B01000};

byte ucgen1[8] = {B00000, B00000, B00001, B00010, B00100, B01000, B10000, B10000};
byte ucgen2[8] = {B00000, B00000, B10000, B01000, B00100, B00010, B00001, B00001};

byte unlem[8] = {B11111, B10001, B10101, B10101, B10001, B10101, B10001, B11111};

byte bos[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000};

bool flg = 0;


#define encA  2
#define encB  3
#define enb 4

int enbb;
bool enf = 0;

#define wave 5
int wsel = 0;
bool wfl = 0;
int type;

#define out 6
bool outfl = 0;
int ay = 0;

static unsigned int period = 0xffff;
int konum, enc, enc1, adimBayrak;

void encoder(void)
{
  enc = digitalRead(encB) + (digitalRead(encA) << 1);

  if (enc1 != enc)
  {
    switch (enc1)
    {
      case 0b00:
        adimBayrak = 1; // debounce için bayrak değişken
        break;

      case 0b01:
        if (enc == 0b11)
        {
          if (adimBayrak)
          {
            --konum;
            flg = 0;
            // ayar();
            // lcd.clear();
            adimBayrak = 0;
          }
        }
        break;

      case 0b10:
        if (enc == 0b11)
        {
          if (adimBayrak)
          {
            ++konum;
            // ayar();
            // lcd.clear();
            flg = 0;
            adimBayrak = 0;
          }
        }
        break;
    }

    enc1 = enc;
  }
}



void setup() {

  lcd.begin();
  lcd.clear();

  lcd.createChar(0, kare1);
  lcd.createChar(1, kare2);
  lcd.createChar(2, sin1);
  lcd.createChar(3, sin2);
  lcd.createChar(4, ucgen1);
  lcd.createChar(5, ucgen2);
  lcd.createChar(6, unlem);
  lcd.createChar(7, bos);

  attachInterrupt(digitalPinToInterrupt(encA), encoder, CHANGE);
  attachInterrupt(digitalPinToInterrupt(encB), encoder, CHANGE);

  pinMode(encA, INPUT);
  pinMode(encB, INPUT);
  pinMode(enb, INPUT);
 
  pinMode(wave, INPUT_PULLUP);

  pinMode(out, INPUT_PULLUP);

  enc = enc1 = digitalRead(encB) + (digitalRead(encA) << 1);

  pinMode(AD9833_CS, OUTPUT);
  digitalWrite(AD9833_CS, HIGH);

  SPI.begin();
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE2));
  konum = 0;

  lcd.setCursor(8, 0);
  lcd.print(bir);

  lcd.setCursor(7, 0);
  lcd.print(onn);

  lcd.setCursor(6, 0);
  lcd.print(yuz);

  lcd.setCursor(5, 0);
  lcd.print(bin);

  lcd.setCursor(4, 0);
  lcd.print(onbin);

  lcd.setCursor(3, 0);
  lcd.print(yuzbin);

  lcd.setCursor(2, 0);
  lcd.print(birm);

  lcd.setCursor(1, 0);
  lcd.print(onm);
  Serial.begin(9600);
}

void loop() {

  if (digitalRead(enb) == LOW && enf == 0) {
    enbb++;
    konum = 0;
    enf = 1;
  }

  if (digitalRead(enb) == HIGH && enf == 1) {   
    enf = 0;
  }

 
 
  if (digitalRead(wave) == LOW && wfl == 0) {
    wsel++;
    wfl = 1;
  }

    if (digitalRead(wave) == HIGH && wfl == 1) {
    wfl = 0;
  }
  if(wsel > 3){
    wsel = 0;
  }

  if(digitalRead(out) == LOW && outfl == 0){
    ay++;
    outfl = 1;
  }
  if(digitalRead(out) == HIGH &&outfl == 1){
    outfl = 0;
  }
 
  if(ay == 1){
    ayar();
    ul();
    ay++;
  }
  else{
    ay = 0;
  }

  switch(wsel) {

    case 1:
      type = 0x2028;
      kare();
      break;

    case 2:
      type = 0x2002;
      ucgen();
      break;

    case 3:
      type = 0x2000;
      sinus();
      break;
  }


  if (enbb == 1) { //hz birler basamağ

    bir = konum;
    if (bir > 9) {
      konum = 0;
      bir = 0;
    }
    if (bir < 0) {
      konum = 0;
      bir = 0;
    }
    lcd.setCursor(8, 0);
    lcd.cursor();
    delay(2);
    lcd.setCursor(8, 0);
    lcd.print(bir);
  }

  if (enbb == 2) { //hz onlar basamağ

    onn = konum;
    if (onn > 9) {
      konum = 0;
      onn = 0;
    }
    if (onn < 0) {
      konum = 0;
      onn = 0;
    }
    lcd.setCursor(7, 0);
    lcd.cursor();
    delay(2);
    lcd.setCursor(7, 0);
    lcd.print(onn);
  }

  if (enbb == 3) { //hz birler basamağ

    yuz = konum;
    if (yuz > 9) {
      konum = 0;
      yuz = 0;
    }
    if (yuz < 0) {
      konum = 0;
      yuz = 0;
    }
    lcd.setCursor(6, 0);
    lcd.cursor();
    delay(2);
    lcd.setCursor(6, 0);
    lcd.print(yuz);
  }

  if (enbb == 4) { //hz birler basamağ

    bin = konum;
    if (bin > 9) {
      konum = 0;
      bin = 0;
    }
    if (bin < 0) {
      konum = 0;
      bin = 0;
    }
    lcd.setCursor(5, 0);
    lcd.cursor();
    delay(2);
    lcd.setCursor(5, 0);
    lcd.print(bin);
  }

  if (enbb == 5) { //hz birler basamağ

    onbin = konum;
    if (onbin > 9) {
      konum = 0;
      onbin = 0;
    }
    if (onbin < 0) {
      konum = 0;
      onbin = 0;
    }
    lcd.setCursor(4, 0);
    lcd.cursor();
    delay(2);
    lcd.setCursor(4, 0);
    lcd.print(onbin);
  }

  if (enbb == 6) { //hz birler basamağ

    yuzbin = konum;
    if (yuzbin > 9) {
      konum = 0;
      yuzbin = 0;
    }
    if (onbin < 0) {
      konum = 0;
      yuzbin = 0;
    }
    lcd.setCursor(3, 0);
    lcd.cursor();
    delay(2);
    lcd.setCursor(3, 0);
    lcd.print(yuzbin);
  }

  if (enbb == 7) { //hz birler basamağ

    birm = konum;
    if (birm > 9) {
      konum = 0;
      birm = 0;
    }
    if (birm < 0) {
      konum = 0;
      birm = 0;
    }
    lcd.setCursor(2, 0);
    lcd.cursor();
    delay(2);
    lcd.setCursor(2, 0);
    lcd.print(birm);
  }

  if (enbb == 8) { //hz birler basamağ

    onm = konum;
    if (onm > 9) {
      konum = 0;
      onm = 0;
    }
    if (onm < 0) {
      konum = 0;
      onm = 0;
    }
    lcd.setCursor(1, 0);
    lcd.cursor();
    delay(2);
    lcd.setCursor(1, 0);
    lcd.print(onm);
  }
  if (enbb == 9) {
    enbb = 0;
  }





  if (period == 0)
  {
    period = 0xffff;
  }
  else
  {
    --period;
  }
}

void ayar() {
  fin = onm * 10000000  + birm * 1000000  + yuzbin * 100000 + onbin * 10000 + bin * 1000 + yuz * 100 + onn * 10 + bir + 0;
 // fin = bir + 0;
  Serial.println(fin);
  freq0 = round(fin * 10.73741824);

  unsigned int freq0_lo = freq0 & 0x3fff;
  unsigned int freq0_hi = (freq0 >> 14) & 0x3fff;

  digitalWrite(AD9833_CS, LOW);
  SPI.transfer16(0x2000);
  SPI.transfer16(0x4000 | freq0_lo);
  SPI.transfer16(0x4000 | freq0_hi);
  SPI.transfer16(type);
  digitalWrite(AD9833_CS, HIGH);
}


void kare() {
  //lcd.clear();
  lcd.setCursor(12, 0);
  lcd.write(byte(0));
  lcd.setCursor(13, 0);
  lcd.write(byte(1));
  lcd.setCursor(14, 0);
  lcd.write(byte(0));
  lcd.setCursor(15, 0);
  lcd.write(byte(1));
}

void sinus() {
 // lcd.clear();
  lcd.setCursor(12, 0);
  lcd.write(byte(2));
  lcd.setCursor(13, 0);
  lcd.write(byte(3));
  lcd.setCursor(14, 0);
  lcd.write(byte(2));
  lcd.setCursor(15, 0);
  lcd.write(byte(3));

}

void ucgen() {
  //lcd.clear();
  lcd.setCursor(12, 0);
  lcd.write(byte(4));
  lcd.setCursor(13, 0);
  lcd.write(byte(5));
  lcd.setCursor(14, 0);
  lcd.write(byte(4));
  lcd.setCursor(15, 0);
  lcd.write(byte(5));
}

void ul() {
 // lcd.clear();
  lcd.setCursor(15, 1);
  lcd.write(byte(6));
}
 
Kolay o da ben evde değilim. :)
program üst mesajda.
Ama bu yazdığım haliyle sadeleştirmek.
Çıkarım ekleme yapmak sanırım sadece bana özgü bir hal aldı şuan sorunsuz bütün fonksiyonları çalışıyor dalga seçme,frekans ayarlama.

çıkışı on/off yapmak kaldı onuda hallederiz.
 
program üst mesajda.
Ama bu yazdığım haliyle sadeleştirmek.
Çıkarım ekleme yapmak sanırım sadece bana özgü bir hal aldı şuan sorunsuz bütün fonksiyonları çalışıyor dalga seçme,frekans ayarlama.

çıkışı on/off yapmak kaldı onuda hallederiz.
Yoo ben şöyle üstünkörü bakıp anladım neyin ne olduğunu.
 
Yoo ben şöyle üstünkörü bakıp anladım neyin ne olduğunu.
bir çalışma videosuda çekeyim.
birkaç bug mevcut onları çözeriz cursor düzgün gözükmüyor vs.

yapabilirsek anlık ayarlanan basamağı belirtmek için o basamağı invert ederek seçtirebiliriz biraz baktım bulamadım onu
 
C++:
#include <SPI.h>
#define AD9833_CS 10
int live;

int Wave_Selector = 1;// 0 = KARE ---- 1 = SINUS ---- 2 = UCGEN

//static double frequency = 3500000.0;//MHz
//static double frequency = 35000.0;//kHz
//static double frequency = 35.0;//Hz


void setup() {
  pinMode(AD9833_CS, OUTPUT);
  digitalWrite(AD9833_CS, HIGH);
  SPI.begin();
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE2));

  switch (Wave_Selector) {
   
    case  0:
       live = 0x2028;
      break;

    case  1:
      live = 0x2000;
      break;

    case  2:
       live = 0x2002;
      break;
  }
 


  long freq0 = (frequency * pow(2, 28)) / 25000000;

  unsigned int freq0_lo = freq0 & 0x3fff;
  unsigned int freq0_hi = (freq0 >> 14) & 0x3fff;

  digitalWrite(AD9833_CS, LOW);
  SPI.transfer16(0x2000);
  SPI.transfer16(0x4000 | freq0_lo);
  SPI.transfer16(0x4000 | freq0_hi);
  SPI.transfer16(live);
  digitalWrite(AD9833_CS, HIGH);
}

void loop() {
}

Modülü yeni alanlar için benim tam programdakileri kurup denemek uğraştırıcı olacağından böyle basit bir program hazırladım istediğiniz frekansın yorum satırını kaldırıp frekans ayarı yapıyprsunuz 0-1-2 olarak'da dalga tipi seçiyorsunuz.

SADECE TEK FREKANSIN YORUM SATIRI KALKMIŞ OLMALI 1DEN FAZLASI PROGRAMA DAHİL OLURSA HATA VERECEKTİR.
 
C++:
#include <SPI.h>
#define AD9833_CS 10
int live;

int Wave_Selector = 1;// 0 = KARE ---- 1 = SINUS ---- 2 = UCGEN

//static double frequency = 3500000.0;//MHz
//static double frequency = 35000.0;//kHz
//static double frequency = 35.0;//Hz


void setup() {
  pinMode(AD9833_CS, OUTPUT);
  digitalWrite(AD9833_CS, HIGH);
  SPI.begin();
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE2));

  switch (Wave_Selector) {
  
    case  0:
       live = 0x2028;
      break;

    case  1:
      live = 0x2000;
      break;

    case  2:
       live = 0x2002;
      break;
  }
 


  long freq0 = (frequency * pow(2, 28)) / 25000000;

  unsigned int freq0_lo = freq0 & 0x3fff;
  unsigned int freq0_hi = (freq0 >> 14) & 0x3fff;

  digitalWrite(AD9833_CS, LOW);
  SPI.transfer16(0x2000);
  SPI.transfer16(0x4000 | freq0_lo);
  SPI.transfer16(0x4000 | freq0_hi);
  SPI.transfer16(live);
  digitalWrite(AD9833_CS, HIGH);
}

void loop() {
}

Modülü yeni alanlar için benim tam programdakileri kurup denemek uğraştırıcı olacağından böyle basit bir program hazırladım istediğiniz frekansın yorum satırını kaldırıp frekans ayarı yapıyprsunuz 0-1-2 olarak'da dalga tipi seçiyorsunuz.

SADECE TEK FREKANSIN YORUM SATIRI KALKMIŞ OLMALI 1DEN FAZLASI PROGRAMA DAHİL OLURSA HATA VERECEKTİR.
Koy bunu ifin içine seçsin adam
 
buda kurduğumuz setup'ın test videosu daha geliştirmeye çok açık halde.
bütün kontrolü enkodere'de bırakabiliriz daha fazla butonlar ekleyebiliriz mesela ilave butonlara atanacak pratik çıkışlar
1Hz
50Hz
1kHz gibi.

çıkış için bir planım daha var en az 100kHz'ye kadar çalışacak bir amfi ve bu amfi'ye en az 500mA yüklenebilmelyiz.
 

Ekler

  • ad98.mp4
    29.1 MB
Bir önceki detaylı kod için soruyorum:
Komple modüle enerjiyi verince ilk ekrana ne geliyor? Ve bu haldeyken enkoder butonuna basınca bir şey oluyor mu?
 
Bir önceki detaylı kod için soruyorum:
Komple modüle enerjiyi verince ilk ekrana ne geliyor? Ve bu haldeyken enkoder butonuna basınca bir şey oluyor mu?
modülün hafızası var.
hiç data yazmasan'da son ayarlananı çıkarmaya başlıyor nası yapıyor bilmiyorum.

o yüzden setup kısmında 0herz set etmeliyiz bunlar küçük detaylar.

videoya çekmeyi unuttupum kısım enkoder kısmı o basamaklar arası geçisi enkoder butonuyla yapıyorum.
her basışta bir sonraki basamağa gidiyor sona gelince tekrar en baştaki basamağa dönüyor
 
videoya çekmeyi unuttupum kısım enkoder kısmı o basamaklar arası geçisi enkoder butonuyla yapıyorum.
her basışta bir sonraki basamağa gidiyor sona gelince tekrar en baştaki basamağa dönüyor
Ne kadar saçma bir iş için kullanmışsın enkoder butonunu :D

O kısmı iptal et.
Şu yazdığımı geliştirerek menüyü detaylandırabilirsin. 2x16 ekrana menü yapmak zor oluyor. Kodda hatalar olabilir, kesin vardır :D
C++:
int menu = 0;
int kursor =0;

if(encoderButon == 1){ //butona basıldıysa
     if(menu == 0){
     menu = 1;
     } else if(menu ==1 & & kursor == 3){
     menu = 0;
    } 
}

if(menu == 1){
lcd.setCursor(0,1);
lcd.print("SINE");
lcd.setCursor(0,9);
lcd.print("TRIANGLE");
lcd.setCursor(1,1);
lcd.print("SQUARE");
lcd.setCursor(1,9);
lcd.print("EXIT");
} 

if(encoder çevrildiyse) {
     if(menu == 1 & &  kursor == 0) {
      lcd.setCursor(0,0);
      lcd.print("X");
      kursor++;
     } else if(menu == 1 & &  kursor == 1){
      lcd.setCursor(0,8);
      lcd.print("X");
      kursor++;
     } else if(menu == 1 & &  kursor == 2){
      lcd.setCursor(1,0);
      lcd.print("X");
      kursor++;
     } else if(menu == 1 & &  kursor == 3){
      lcd.setCursor(1,0);
      lcd.print("X");
      kursor=0;
     } 
}
 
Haaa bu enkoderin ileri geri çevirme muhabbeti vardı. Onun içinde aynı kod bloğunu oluşturup kursor--; yapmak gerekiyor.
 
Haaa bu enkoderin ileri geri çevirme muhabbeti vardı. Onun içinde aynı kod bloğunu oluşturup kursor--; yapmak gerekiyor.
enokoder kısmı tamam daha önce kendi yaptığım 2x16 menüm var onu kullanabilirim ama basit kullanışlı olması için böyle yaptım.

hem her halükarda basamak değiştiremk için bir giriş gerekiyor bence enkoder butonu uygun bu için
 
enokoder kısmı tamam daha önce kendi yaptığım 2x16 menüm var onu kullanabilirim ama basit kullanışlı olması için böyle yaptım.

hem her halükarda basamak değiştiremk için bir giriş gerekiyor bence enkoder butonu uygun bu için
Encoderi kullan tabi de, menü içinde kullan. Koca butonu sadece dalga değiştirmek için kullanmak saçma, onu diyorum ben.
 
Encoderi kullan tabi de, menü içinde kullan. Koca butonu sadece dalga değiştirmek için kullanmak saçma, onu diyorum ben.
menülü versiyonunu'da yaparız.
ondan önce çıkış güçlendirmesi nasıl yapacağız ona bakayım
en az 500mA yüklenmemiz gerek diye düşünüyorum bu 500mA en alt frekansda ve en tepe frekans'da olmak zorunda değil
 
menülü versiyonunu'da yaparız.
ondan önce çıkış güçlendirmesi nasıl yapacağız ona bakayım
en az 500mA yüklenmemiz gerek diye düşünüyorum bu 500mA en alt frekansda ve en tepe frekans'da olmak zorunda değil
Benim XR2206 şemasını inceleyebilirsin. Orada voltajı nasıl ayarladığı anlaşılıyordur
 
Benim XR2206 şemasını inceleyebilirsin. Orada voltajı nasıl ayarladığı anlaşılıyordur
çıkışı op-amp ile yapılmış abi o bana gelmez.
ben 2 güne yakarım o çıkışı.
benim owonunki korumaya geçmese şuan owon 3in1 değil 2in 1 olurdu.
biraz fazla yüklenince bağırıp kapatıyor çıkışı
 
çıkışı op-amp ile yapılmış abi o bana gelmez.
ben 2 güne yakarım o çıkışı.
benim owonunki korumaya geçmese şuan owon 3in1 değil 2in 1 olurdu.
biraz fazla yüklenince bağırıp kapatıyor çıkışı
Opamp kullanmadan nasıl vericen 500mA ?
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,958
Mesajlar
118,802
Üyeler
2,825
Son üye
bekinci

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