AD9833 SIN-GEN ARDUINO IDE(SPI lib.)

Kod:
#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
 
Kod:
#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.
 
Kod:
#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
Kod:
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

Çevrimiçi üye yok.

Forum istatistikleri

Konular
7,276
Mesajlar
123,031
Üyeler
2,935
Son üye
AtifK

Son kaynaklar

Son profil mesajları

Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal taydin Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top