MCP4922 DAC Kullanımı

Boşver kütüphaneyi falan. Datasheet'e bakıp SPI ile ne yazacaksan yaz.
 
daccc:
/*
    __  ___________ __ ___  __________  ____  _   ________ __    ____  ____  ______
   /  |/  / ____/ //_//   |/_  __/ __ \/ __ \/ | / /  _/ //_/   / __ \/ __ \/ ____/
  / /|_/ / __/ / ,<  / /| | / / / /_/ / / / /  |/ // // ,<     / / / / /_/ / / __
  / /  / / /___/ /| |/ ___ |/ / / _, _/ /_/ / /|  // // /| |   / /_/ / _, _/ /_/ /
  /_/  /_/_____/_/ |_/_/  |_/_/ /_/ |_|\____/_/ |_/___/_/ |_|   \____/_/ |_|\____/

*/



#include <SPI.h>
#define CS PIN_YAZIN



void setup()
{
  //Serial.begin(9600); GEREK YOK

  SPI.setRX( );//SPI MISO PIN
  SPI.setTX( );//SPI MOSI PIN
  SPI.setSCK( );//SPI CLOCK PIN


  SPI.begin();
}

void loop() {

  MCP(1023,512);
 

}

void MCP(int a , int b) {
  int ch1 = a | 0b0111000000000000;
  int ch2 = b | 0b1111000000000000;

  digitalWrite(CS, LOW);
  SPI.transfer(highByte(ch1));
  SPI.transfer(lowByte(ch1));
  digitalWrite(CS, HIGH);

  delay(2);

  digitalWrite(CS, LOW);
  SPI.transfer(highByte(ch2));
  SPI.transfer(lowByte(ch2));
  digitalWrite(CS, HIGH);

  delay(2);
 
}

Yazmaya çalıştım ama elimde DAC olmadığı için deneymeiyorum kopya çeke çeke yazdım.
 
Boşver kütüphaneyi falan. Datasheet'e bakıp SPI ile ne yazacaksan yaz.
Datasheet'i anlamıyorumki. Hem ingilizceden çakılıyorum hem SPI bana karmaşık geliyor. Okumayla içinden çıkamayacağım.
 
O zaman önce Arduino ile minimal bir program yaz. Bu program SPI porttan veri yazsın. Chip select olarak da herhangi bir pini seçebilirsin.

SPI'da bir chip select (CS), bir gönderme pini (MOSI) bir alma pini (MISO), bir de clock (CLK) var. Senin için MISO lazım değil, DAC'tan birşey geri okumuyorsun.
 
Datasheet'i anlamıyorumki. Hem ingilizceden çakılıyorum hem SPI bana karmaşık geliyor. Okumayla içinden çıkamayacağım.
Abi ben bu sorunu adım adım çözüyorum önce her ne olursa olsun datasheetin orjinalini ingilizcesini 2-3 kez oku anlamasanda.

Sonra satır satır çeviriye yazıp türkçesini oku epey ilerliyorsun kısa sürede öğretmenimizin bize gösterdiği bi ingilizce öğrenme tekniğiydi bu.
 
Aslında SPI ile I2C birbirine çok benziyor. Eğer sadece veri yazıyorsan ve tek alıcı varsa, arada neredeyse hiç fark yok. İkisinde de bir data pini var (SPI için MOSI, I2C için SDA) ve bir de clock pini var (SPI için CLK, I2C SCL).

SPI ve I2C arasında iki temel fark var:

1) SPI'da veri okumak ve yazmak için ayrı pin var, I2C de tek pin üzerinden hem okuma yem yazma yapılıyor.
2) SPI'da bus üzerindeki uç noktalardan birisini seçmek için chip select kullanılıyor, I2C de bütün uç noktalar aktif, sen adres bilgisi göndererek o adrese sahip olmayan uç noktalara "sen sus konuşma" diyorsun.

Neticede SPI'da bus üzerinde fiziksel olarak sadece bir cihaz aktif olduğu için kapasitif yükleme minimaldir. Ayrıca aynı anda veri gönderme ve veri alma mümkün olduğu için SPI ile veri bant genişliği çok daha yüksektir.
 
Aslında SPI ile I2C birbirine çok benziyor. Eğer sadece veri yazıyorsan ve tek alıcı varsa, arada neredeyse hiç fark yok. İkisinde de bir data pini var (SPI için MOSI, I2C için SDA) ve bir de clock pini var (SPI için CLK, I2C SCL).

SPI ve I2C arasında iki temel fark var:

1) SPI'da veri okumak ve yazmak için ayrı pin var, I2C de tek pin üzerinden hem okuma yem yazma yapılıyor.
2) SPI'da bus üzerindeki uç noktalardan birisini seçmek için chip select kullanılıyor, I2C de bütün uç noktalar aktif, sen adres bilgisi göndererek o adrese sahip olmayan uç noktalara "sen sus konuşma" diyorsun.

Neticede SPI'da bus üzerinde fiziksel olarak sadece bir cihaz aktif olduğu için kapasitif yükleme minimaldir. Ayrıca aynı anda veri gönderme ve veri alma mümkün olduğu için SPI ile veri bant genişliği çok daha yüksektir.
I2C Adres tabanlı olması fazla ı/o kullanmadan bissürü slave'e veri gönderip okumak daha tasarruflu oluyor ı/o bakımından.
Fakat bu durum SPI tarafında ı/o tasarrufu sağlamayıp bize yüksek hız avantajı olanağı sunuyor.

Uygulamaya göre seçmek gerekiyor benim gibi fanatiklik her zaman ilerlemenin gelişmenin önüne geçer.
Her zaman ilk tercihim UART olur bir sensör modül ararken hep ilk dahili uart barındıranlara bakarım sonra diğerlerine :dusun1:
 
O zaman önce Arduino ile minimal bir program yaz. Bu program SPI porttan veri yazsın. Chip select olarak da herhangi bir pini seçebilirsin.

SPI'da bir chip select (CS), bir gönderme pini (MOSI) bir alma pini (MISO), bir de clock (CLK) var. Senin için MISO lazım değil, DAC'tan birşey geri okumuyorsun.
O testi yapma imkanım yok çünkü DAC' elimde 1 tane vardı ve onu karta direk smd olarak lehimledim. Pico yerine nano takamam, taksam bile yine kartın geneline hükmetmiş olacağım. Aslında breadboard üzerinde denemeler yapmak istiyordum ama hem 5v referans entegresi hemde 74 serisi entegreler dahil olduğu için hepsini ayrı ayrı alıp dip dönüştürücüye takamadım. Bu yüzden hepsni devre üzerine lehimleyip başıma gelecekleri kart üzerinde görmeye karar verdim.
 
O testi yapma imkanım yok çünkü DAC' elimde 1 tane vardı ve onu karta direk smd olarak lehimledim. Pico yerine nano takamam, taksam bile yine kartın geneline hükmetmiş olacağım. Aslında breadboard üzerinde denemeler yapmak istiyordum ama hem 5v referans entegresi hemde 74 serisi entegreler dahil olduğu için hepsini ayrı ayrı alıp dip dönüştürücüye takamadım. Bu yüzden hepsni devre üzerine lehimleyip başıma gelecekleri kart üzerinde görmeye karar verdim.

SPI ile veri yazmak için bir uç noktaya ihtiyacın yok. Havaya yaz :D

Sinyalleri de osiloskop ile gör. Önce CS aktif olacak, sonra CLK ve MOSI de yazma süresince aktivite olacak.
 
SPI ile veri yazmak için bir uç noktaya ihtiyacın yok. Havaya yaz :D

Sinyalleri de osiloskop ile gör. Önce CS aktif olacak, sonra CLK ve MOSI de yazma süresince aktivite olacak.
Yani nanoyu bread boarda bağlayıp DAC olmadan SPI yazayım ve Çıkış pinlerini osiloskop ile takip edeyim. Doğru anladım sanırım.
Bu gün iş yerimde şu yazılanları tekrar okuyup SPI videoları izleyeyim. Bu gün mesai saatim geldiği için yarın biraz test yapmaya çalışırım.
 
Yani nanoyu bread boarda bağlayıp DAC olmadan SPI yazayım ve Çıkış pinlerini osiloskop ile takip edeyim. Doğru anladım sanırım.

Aynen öyle. Okuma da yapabilirsin öğrenmek için. Bu durumda MISO yu bir anahtar ile high veya low'a çekip full 1 veya full 0 okuduğunu teyit edebilirsin.
 
Ne güzel anlatmış da 1-2 satır da kod yazıp örneklendirse tam oturacaktı.

 
Eureka!!!
Tam konusunu buldum. Adam Türkçe konuşsa varya şundan iyi kaynak yok. Mecbur videodaki kodları kopyalayıp anlamaya çalışacağım.

 
İnşalla gündüz bunu anlamaya çalışacağım.
Adam taa 2014 yazmış, hala herhangi bir hata vermeden derleniyor.
Fonksiyon işi hoşuma gitti. setDac(200,0); diyorsun güzelce set ediyor.

C++:
// include the library code:
#include <SPI.h>
 
// Set Constants
const int dacChipSelectPin = 9;      // pin 9'u DAC için çip seçimi olarak ayarlayın:

// Start setup function:
void setup() { 
  pinMode (dacChipSelectPin, OUTPUT);
  // set the ChipSelectPins high initially:
  digitalWrite(dacChipSelectPin, HIGH); 
  // initialise SPI:
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);         // Kesinlikle gerekli değil, sadece emin olmak için.
  SPI.setDataMode(SPI_MODE0);        // Kesinlikle gerekli değil, sadece emin olmak için.
} // End setup function.

// Start loop function:
void loop() { 
  setDac(200,0);
  setDac(4000,1);
}// End of loop function.


// DAC'yi ayarlama işlevi, Gönderilecek Değeri ve kullanılacak DAC kanalını kabul eder.
void setDac(int value, int channel) {
  byte dacRegister = 0b00110000;                        // Varsayılan DAC kayıtlarını ayarlar B00110000, 1. bit DAC'yi seçer, A=0 B=1, 2. Bit giriş Tamponunu atlar, 3. bit çıkış kazancını 1x'e ayarlar, 4. bit aktif düşük kapatmayı kontrol eder. LSB burada önemsizdir.
  int dacSecondaryByteMask = 0b0000000011111111;        // 12 bitlik değer olan B00000000111111111'in son 8 bitini izole eder.
  byte dacPrimaryByte = (value >> 8) | dacRegister;     //Değer maksimum 12 Bit değerdir, Birincil Bayta giriş için değerden ilk 4 MSB'yi almak için 8 bayt sağa kaydırılır, ardından da Register ile BORed 
  byte dacSecondaryByte = value & dacSecondaryByteMask; // 8 LSB'yi izole etmek ve onu tek bir bayta indirmek için 12 bit değerini karşılaştırır.
  // Ayarlanacak DAC'yi belirlemek için birincil Baytta MSB'yi ayarlar, DAC A=0, DAC B=1
  switch (channel) {
   case 0:
     dacPrimaryByte &= ~(1 << 7);     
   break;
   case 1:
     dacPrimaryByte |= (1 << 7); 
  }
  noInterrupts(); // DAC'ye veri göndermeye hazırlanmak için kesintileri devre dışı bırakın
  digitalWrite(dacChipSelectPin,LOW); // DAC'yi seçmek için Chip Select pinini alçaltın:
  SPI.transfer(dacPrimaryByte); //  Birincil Baytı gönder:
  SPI.transfer(dacSecondaryByte);// İkincil Baytı gönder
  digitalWrite(dacChipSelectPin,HIGH);// DAC'nin seçimini kaldırmak için Chip Select pinini yükseğe alın:
  interrupts(); // Kesintileri etkinleştir
}
 
Bu gün biraz burnumun dikine gidip yukarıdaki kodlar ile cebelleştim. Artık bitirmek istediğim için tüm çabamı devre üzerine harcamak istiyorum. Kodlar hata vermiyor ama çalışmıyorda. Daha doğrusu ben beceremiyorum herhalde. Devreler eskisi gibi bread board üzerinde olmadığından gerektiği gibi mıncıklayamıyorum. Serial ekrana çıktı alamıyorum. Ne gönderdim, ne gitti takip edemiyorum. Sıkıntılı iş.

Yarın bari Timur abinin sözünü dinleyip nano ile spi çalışmaları yapayım.
 
Bu gün biraz burnumun dikine gidip yukarıdaki kodlar ile cebelleştim. Artık bitirmek istediğim için tüm çabamı devre üzerine harcamak istiyorum. Kodlar hata vermiyor ama çalışmıyorda. Daha doğrusu ben beceremiyorum herhalde. Devreler eskisi gibi bread board üzerinde olmadığından gerektiği gibi mıncıklayamıyorum. Serial ekrana çıktı alamıyorum. Ne gönderdim, ne gitti takip edemiyorum. Sıkıntılı iş.

Yarın bari Timur abinin sözünü dinleyip nano ile spi çalışmaları yapayım.
Abi böyle durumlarda test point noktaları bence çok kritik önem taşıyor.

Mümkün olan her noktaya test point koyulması taraftarıyım.

Mesela senin devrede mutlaka her haberleşme hattında test-point olmalı.
Ne gerek var tek tek erkek header lehimlemeye dersen.

Şimdi test etmek istersen eleman bacağına kablo lehimlemen veya direkt oradan ölçüm almaya çalışman gerekecek bu durumda ortaya kısa devre gibi sorunlar çıkabilir.

Nede çalışmıyor dersek şöyle bir test yapabiliriz bence:

Mesela setup kısmında sadece 1kez dac'a veri yollayacak bir program.
Mesela A kanalını 1023 yapıp bırakacak.

Bu programa şuan tamamen hakim değiliz bir yerde sorun varsa göremiyoruz en yalın haliyle setup kısmında tek değer yazdırdıktan sonra devamını getirelim bence.
 
1023 gönderince dac çıkışından ne okumam gerek? Yani multimetre ile okuyabilir miyim?
 
1023 gönderince dac çıkışından ne okumam gerek? Yani multimetre ile okuyabilir miyim?
Hee bide sen bizim pico'daki set pinlerini yazmayı unuymuşssun abi benim attığım kopya örneğin setup kısmına bak.

Evet ölçü aleti ile okuyabilirisin DC voltaj kademesinde.
 

Forum istatistikleri

Konular
6,012
Mesajlar
102,609
Üyeler
2,526
Son üye
rb26dett

Son kaynaklar

Son profil mesajları

deneyci wrote on hakan8470's profile.
Sibonge uNkulunkulu ngokuhlukahluka asinike kona.

Bu hangi dil? :)
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?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
Back
Top