mcp4821 12 bit dac

Başlatan klamax, 05 Kasım 2010, 23:28:16

klamax

pic 16f877a dan SPI ile dac mcp4821 e veri göndermeye çalışıyorum. Proteusta simülasyonu hazırladım.Dac'a 12 biti 1 olarak gönderdiğimde çıkışta 5V'a yakın bir değer elde etmeyi bekliyordum fakat max 4.10 V elde edebiliyorum. Datasheet'te dac için 5.5V'a kadar çıkış alınabileceği yazıyor.sorun neden kaynaklanıyor olabilir?

justice_for_all

devre semasinin fotosunu yukleyebilirmisiniz...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

justice_for_all

arkadasim datasheetine baktim eger gain =1 ise max 2.048 v alabiliyosun eger gain =2 ise maz 4.96 volt aliyosun yani senin aldigin voltaji..

5.5 v dedigin entegre beslama voltaji...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

klamax

haklısınız yanlış bakmışım. dediğiniz gibi gain=2 olduğunda 4.096 V olacak. Yani bir sorun yok. yardımınız için teşekkürler.

justice_for_all

rica ederim...


Kolay gelsin..
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

klamax

bilgisayardan girilen değeri DAC'ın çıkışından almak istiyorum.Mesela bilgisayardan 1. dac 2v girip dacın çıkışından 2V elde etmeyi bekliyorum. devre proteusta çalışıyor fakat gerçeklediğimde devreyi çalıştıramadım.
#include "mcp4821.h"
#include "stdlib.h"
#use fast_io(c)
#use fast_io(b)
   int1 flag;
   int i,d;
   float c;
   long int k;
   unsigned char B[50],F[50];
   
#int_RDA  
void  RDA_isr(void) 
{  
  
   printf("secilen dac= ");
   gets(B);
   printf("\n");
   d=atoi(B);
   puts(B);
   printf("voltaj degerini giriniz\n");
   gets(B);
   c=atof(B);
   printf("voltaj degeri=%f\n",c);
   puts(B);
   k=c/0.001;
   if(c>4.096)
   printf("Giris degeri max 4.096V olabilir.");
   else
   flag=1;
   printf("1-4 arasi dac seciniz.\n\n");
}

void main()
{


   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   set_tris_c(0xC0);
   set_tris_b(0x00);
   output_b(0x0F);
   
   printf("1-4 arasi dac seciniz.\r");
   while(1){
  
   if(flag=1){
   flag=0;
   switch (d){
   case 1:
   output_low(pin_b0);
   output_high(pin_c2);
   spi_write((k/256)+16);
   delay_ms(5);
   spi_write((k%256));
   delay_ms(5);
   output_high(pin_b0);
   output_low(pin_c2);
   delay_ms(5);
   output_high(pin_c2);
   break;
   case 2:
   output_low(pin_b1);
   output_high(pin_c2);
   spi_write((k/256)+16);
   delay_ms(5);
   spi_write((k%256));
   delay_ms(5);
   output_high(pin_b1);
   output_low(pin_c2);
   delay_ms(5);
   output_high(pin_c2);
   break;
   case 3:
   output_low(pin_b2);
   output_high(pin_c2);
   spi_write((k/256)+16);
   delay_ms(5);
   spi_write((k%256));
   delay_ms(5);
   output_high(pin_b2);
   output_low(pin_c2);
   delay_ms(5);
   output_high(pin_c2);
   break;
   case 4:
   output_low(pin_b3);
   output_high(pin_c2);
   spi_write((k/256)+16);
   delay_ms(5);
   spi_write((k%256));
   delay_ms(5);
   output_high(pin_b3);
   output_low(pin_c2);
   delay_ms(5);
   output_high(pin_c2);
   break;
   }
 
   }
     }

   }




justice_for_all

arkadasim kesme icinde okadar islem yaptirma tamam mi kesmede sadece bilgi al...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

klamax

#7
devreyi gerçekleyince şöyle bir durumla karşılaştım. İlk önce bilgisayardan istediğim çıkış değerini giriyorum. çıkışı osiloskop ile ölçtüğümde bir şey gözükmüyor. sonra SCK bacağına probu değdirip tekrar çıkışı ölçtüğümde bu sefer DAC çıkış veriyor. İlk seferde dac'dan nasıl çıkış alabilirim?