pic ile dac kullanımı

Başlatan f15eagle, 28 Mayıs 2013, 16:48:17

f15eagle

Herkese merhaba,

pic18f46k22'den analog çıkış üretmem gerekiyor. Forumda biraz gezindim genelde tavsiyeler MCP4921'e yöneltti. Fakat benim 20 kanala ihtiyacım var. Kullanımı kolay çok kanallı dac öneriniz var mı ?

Aklıma takılan bir diğer soru da mcp4921lerin cs pinlerini 74hc595 gibi shiftregister ile kontrol edebilir miyim ? Aşağıdaki fonksiyonda veri yazarken cs pini lojik 0 yapılıyor sonra tekrar lojik 1 yapılıyor. Buraya ufak bir fonksiyon yazarak istediğim dacyi aktif etsem 20 kanalı da sorunsuzca kontrol edebilir miyim ? Sorun olmazsa temini kolay genellikle önerilmiş bu entegreyi kullanmak isterim.

Tecrübeli büyüklerimizin tavsiyelerini merakla bekliyorum.

#define DAC_CS     PIN_B0
#define DAC_CLK    PIN_B1
#define DAC_DI     PIN_B2
#define DAC_LDAC   PIN_B4


void init_dac()
{
   output_high(DAC_CS);
   output_high(DAC_LDAC);
   output_high(DAC_CLK);
   output_high(DAC_DI);
}

void write_dac(int16 data) {
   BYTE cmd[3];
   BYTE i;

   cmd[0]=data;
   cmd[1]=(data>>8);
   cmd[2]=0x03;                           
   
   output_high(DAC_LDAC);
   output_low(DAC_CLK);
   output_low(DAC_CS);

   for(i=0; i<=23; ++i)
   {
      if(i<4 || (i>7 && i<12))
         shift_left(cmd,3,0);
      else
      {
         output_bit(DAC_DI, shift_left(cmd,3,0));

         output_high(DAC_CLK);
         output_low(DAC_CLK);
      }
   }
   output_high(DAC_CS);

   output_low(DAC_LDAC);
   delay_us(10);
   
   output_HIGH(DAC_LDAC);
}

Tagli

Yapılabilir elbette. Benim bildiğim kadarıyla DAQ entegrelerinde genelde çok fazla kanal olmuyor. MCP4922 iki kanallı, kullanımı da MCP4921 ile hemen hemen aynı (zaten datasheet'leri bile ortak), onu kullanırsan daha iyi olur. Ben PIC'e aynı clock ve data hatlarını kullanarak 4 tane bağlamıştım ama arada 74HC595 yoktu, CS hatlarını doğrudan PIC üzerinden sürüyordum. Araya 74HC595 koyabilirsin, bir sorun olmaz. Ama buffer'sız bir shift register kullanırsan sorun yaşayacağını tahmin ediyorum.
Gökçe Tağlıoğlu

Okan AKÇA

18f46k22 dac modülü var icerisinde

skara1214

Herkes ölür ama herkes gerçekten yaşamaz

f15eagle

taglı yardım için teşekkürler, skara1214 hocamın tavsiyesi güzel fakat baktım I2C ile kontrol ediliyormuş. İncelemek lazım umarım kullanabilirim yoksa 4922 kullanıcam.

cyclone hocam datashette şöyle bir ifade var,

The Digital-to-Analog Converter supplies a variable
voltage reference, ratiometric with the input source,
with 32 selectable output levels.

Çözünürlük çok düşük 12bit çıkışlı entegreleri kullanmak daha iyi olacak.

Gökhan BEKEN

ben sadece 595ler ile 20 kanal veya daha fazla(tam hatırlamıyorum) pwm yapmıştım. 595 lerin çıkışlarına mantar led bağlamıştım. Yazılımsal pwm gibi birşey :D
Özel mesaj okumuyorum, lütfen göndermeyin.

skara1214

Alıntı yapılan: f15eagle - 28 Mayıs 2013, 17:37:39
skara1214 hocamın tavsiyesi güzel fakat baktım I2C ile kontrol ediliyormuş.
ccs c kullanıyorsan kodları verebilirim
Herkes ölür ama herkes gerçekten yaşamaz

MrDarK

istediğin analog değeri dijital pot ile üretebilirsin , MCP41010
Picproje Eğitim Gönüllüleri ~ MrDarK

f15eagle

Alıntı yapılan: skara1214 - 28 Mayıs 2013, 18:00:07
ccs c kullanıyorsan kodları verebilirim

evet ccs c kullanıyorum hocam sakıncası yoksa burada paylaşır mısınız, dac konusunda tüm foruma yararlı olur.

mrdark hocam çözünürlük adına 12bit dac daha uygun duruyor. datasheette
256 taps for each potentiomete,  ifadesi var. Bu 'taps' ifadesini çözünürlük gibi anladım ben

skara1214

void i2c_4_kanal_yaz(unsigned int16 gx)
{
I2C_Start(); // issue I2C start signal
I2C_Write(0b11000000);
I2C_Write(gx>>8);
I2C_Write(gx);
I2C_Write(gx>>8);
I2C_Write(gx);
I2C_Write(gx>>8);
I2C_Write(gx);
I2C_Write(gx>>8);
I2C_Write(gx);
I2C_Stop();
output_low(pin_c2);
delay_us(10);
output_high(pin_c2);
}
void i2c_1_kanal_yaz(unsigned int16 gx)
{
I2C_Start(); // issue I2C start signal
I2C_Write(0xC0);
I2C_Write(0b01011000);
I2C_Write(gx>>8);
I2C_Write(gx);
I2C_Stop();
//output_low(pin_c2);
//delay_us(20);
//output_high(pin_c2);
}


ilki 4 kanala spontane yazma(epprom etkilenimyor )c2 pini  ldac a bağlı
ikinci fonksiyonda  tek kanala eppromda dahil yazma)
ayarlama ikinciyle yazma 1. ile yapılınca faydalı çalışıyor
Herkes ölür ama herkes gerçekten yaşamaz

f15eagle

hocam çok teşekkür ederim kodlar için, datashette açtım o başlangıç değerlerini nasıl oluşturduğunuzu öğrenmeye çalışıyorum. (Datasheet okumayı öğrenmeye çalışıyorum).

Hocam bana 5 adet gerekecek bu entegreden. Acaba adresleme ile tek hat üzerinde kullanabilir miyim ?
Yada RDY/BSY pinini anahtarlayarak sizin kodlar ile kullanabilir miyim ?

skara1214

rdy/bsy yi sen anahtarlamayorsun  entegre sana epproma yazıyorum diyor ama ldaci kullanarak yapabiliyorsun daha denemedim uğraşıp yapabilirsin 3 bit adres bölgesi var buda 8 adet bağlayabilirsin demek
Herkes ölür ama herkes gerçekten yaşamaz

f15eagle

hevesle karaköye gittim dac almaya fakat mcplerde pek kolay bulunmuyormuş  :-\ karaköy pasajında smd soic mcp4922 buldum sevindim onu da iş yerinde kaybettim denemek nasip olmadı.

Aklıma takılan birşey var. Mikroelektronikanın setinde de bu dac kullanılmış. MCP1541 referans entegresiyle birlikte kullanılmış. Merak ettiğim birden fazla dac için tek referans entegresi olur mu ?

skara1214

Herkes ölür ama herkes gerçekten yaşamaz