<meta name="keywords" content="必胜时时彩开户,keywords" /> AD5439调试法式模范及pdf中文质料 联系我们

AD5439调试法式模范模范及pdf中文质料

    AD5429/AD5439/AD5449划分是CMOS、8/10/12位、双通道、电流输入的数模转换器(DAC)。这些芯片均接纳2.5 V至5.5 V电源供电,是以合适电池等低功耗的场所.芯片接纳CMOS亚微米工艺制造,能够供应精彩的四象限乘法特点,年夜旌旗暗记乘法带宽达10 MHz。

     这些DAC接纳双缓冲三线式串行接口,而且与SPI、QSPI™、MICROWIRE™及年夜多数DSP接口尺度兼容。接纳多个封装时,还可以经由历程串行数据输入(SDO)引脚,将这些DAC以菊花链形式相连。应用数据回读功效,用户可以经由历程SDO引脚读取DAC存放器的内容。上电时,外部移位存放器和锁存以0填充,DAC输入处于零电平。

     满量程输入电流由所施加的外部基准输入电压(VREF)决议。与外部电流至电压周详镌汰年夜器合营应用时,集成的反映电阻(RFB)可供应温度跟踪和满量程电压输入。


         AD5449 AD5429 AD5439引脚图

芯片的优势和特点:



pdf英文质料下载:http://mamjap.com/f/AD5429_5439_5449.pdf

中文质料下载:http://mamjap.com/f/AD5439中文质料.docx

AD5439是双路 10bit 电流输入型DAC,由于没有弄过SPI接口的DAC,以是先在网曲折载了一个该DAC的底层函数,法式模范模范代码以下:

#include "macros.h"
#include "math.h"
#include "dac.h"

// 向AD5439写敕令字和待转换的数据
void WriteAD5439(unsigned int ControlBits,unsigned int data )
{
   unsigned char i;
  
  data = (data << 2);
  data = (ControlBits | data);
  
  SCLK_SET;
  SYNC_CLR;
  
  for(i=0;i<16;i++)
  {
      SCLK_SET;
    if((data & 0x8000) != 0)
   {
       SDIN_SET;
      }
   else
   {
       SDIN_CLR;
      }
   SCLK_CLR;
   data  = (data << 1);
  }
  SYNC_SET;
  LDAC_CLR;
  SCLK_CLR;
  LDAC_SET;
  delay_ms(1);
  
}

// 初始化AD5439,
void  InitAD5439( void )
{
    ADCCL_CLR;  // AD5439.CLR = LOW,清零
    delay_ms(5);
    ADCCL_SET;  // AD5439.CLR = High,准备使命
    WriteAD5439_CMD(0x9000);
}              

// 读出SDO的值
unsigned int readSDO(unsigned int channal)
{
    unsigned char i = 0;
    unsigned int readData = 0;
 
    // 写入控制字,选择读回的通道
    if(channal == ReadBack_I)
    {
     WriteAD5439_CMD(ReadBack_I);
 }
 if(channal == ReadBack_V)
 {
     WriteAD5439_CMD(ReadBack_V);
 }
 
 // 准备吸收数据
 SYNC_CLR;
 SCLK_CLR;  
 
 // 读数据,并处置赏罚赏罚
 for(i=0;i<16;i++)
 {
     SCLK_SET; // 上升沿,读一名
     readData |= (PINB & 0x01) << (15-i);
  SCLK_CLR; // 准备下一回读出数据
  //delay_ms(1); 
 }
 SYNC_SET;
 
 readData = ((readData >> 2) & 0x3ff);// 凭证5439的敕令字名堂阻拦调剂
 
 // 前往数据
 return readData; 
}

// 针对Init5439(),readSDO(),只写敕令字,不写数据                  
void WriteAD5439_CMD(unsigned int ControlBits)
{
     unsigned char i;
  unsigned int data = ControlBits; 
  
  SCLK_SET;
  SYNC_CLR;
  for(i=0;i<16;i++)
  {
      SCLK_SET;
    if((data & 0x8000) != 0)
   {
       SDIN_SET;
      }
   else
   {
       SDIN_CLR;
      }
   SCLK_CLR;
   data  = (data << 1);
  }
  SYNC_SET;
  LDAC_CLR;
  SCLK_CLR;
  LDAC_SET;
  delay_ms(20);
}


void WriteVoltage(unsigned int ControlBits,unsigned int data)
{
  unsigned int  channal,i; // 选择通道
  unsigned int  dataInUse = data; // 用以重新挪用write5439(),防止data遭到破损
  unsigned int  dataReadBack = 0;

 
  
  if(ControlBits == Load_I)
  {
      channal = ReadBack_I;
  }
  if(ControlBits == Load_V)
  {
      channal = ReadBack_V;
  }

  i=0;
  for(;;)
  {
  
     WriteAD5439(ControlBits,dataInUse);
   
      dataReadBack = readSDO(channal);
      if(dataInUse == dataReadBack)
   {
          WriteAD5439(Updata_AB,dataInUse);
    break;
   } 
   else
   {
      i++;
   }
     if(i > 10) // 一连10次写不准确,则关机加入
   {
       SoftStartOff;     
   }
  }

}

void main(void)
{
    init_MCU(); // 初始化MCU

    WriteVoltage(Load_V,1024);  

    while(1)
    {
         process();  
    }

}

 

      我首先看的是中文的pdf,我联络着这个法式模范模范去看该DAC的读写时序图,没发现法式模范模范有甚么效果!那就开工吧,我用的是STC89C52RC作为主控,用io口模拟SPI,没多久法式模范模范一个质朴的测试法式模范模范就出来啦,编译没弱点没正告。下载,调试,示波器上显示出一个-5v的电压,哦,忘了说我用的是哪个电路啦,上图

我是用的双极性输入电路,我接纳5v的基准,那么输入电压规模为-5到+5v。

下面须要处置赏罚赏罚的效果就是,为何DAC一直输入-5v

我所接纳处置赏罚赏罚措施以下:

第一:接纳逻辑剖析仪看我法式模范模范输入的时序能否准确,经不雅不雅察时序和pdf上的时序一样。找不到效果,我没措施只好硬着头皮去看英文pdf,冤枉可以看懂,看一遍后没发现效果所在。。。。。。这消耗了两天多的时间,最后确切没辙啦,好吧找手艺支持,第二天手艺支持给我回复啦,他提出了两个效果(1)SCLK占空比不是50%(2)自力形式下,数据培植时间能否足够长



                                                                                              自力形式时序图


                                                                                  时序图上对应的各个时间

我处置赏罚赏罚SCLK占空比不是50%的效果,措施以下

经由历程给时钟加延时来完成占空比为50%,如红线示

经由历程时序图我们可以知道数据培植时间为t5,5ns,应用52作为主控,数据培植时间一定年夜于5ns,法式模范模范改好,上电,不雅不雅察示波器还是-5v,瓦解。。。。。。再次拿起英文pdf重新到尾看了一篇,还是没思绪,先放放吧,去焊接个板子去吧,让年夜家看看板子的图,嘻嘻

异常的板子焊接了两块

       焊接阻拦我接着调试我的DAC测试板,一样的没有停留,一样的措施我接着看英文pdf,然后接着迷茫。。。。。。

最后在一个阳灼烁丽的下战书,突然间我想起啦上次调试AD7799泛起的效果就是由于CS的旌旗暗记有用果,我看了看AD5439的时序图,发现SYNC貌似和CS有异常的功效,我直接把SYNC拉低,输入电压时0v,貌似不是这里的效果,我又把SYNC接回单片机引脚,这时间间辰居然事业的电压变换啦,我试了好几个数据电压输入却是变啦,但是没试一再再三就岂论用啦,又回到了-5v。这时间间辰我模糊以为是不是SYNC的时序真的有用果呢?重看时序,发现效果啦!!!

红框框里标志的我明确的是16个脉冲阻拦后,SYNC置高,拉低都可以,我其时按参考法式模范模范下去的,直接给SYNC置高!

void WriteAD5439(uint ContralBits,uint DAdata)
{
 unsigned char i;
 uint buf;
 uint wave_data;
 buf=DAdata;
 buf = (buf<<2);
 wave_data = (ContralBits | buf);
 SYNC_SET();
 delay(1);
 SCLK_SET();
 SYNC_CLR();
 for(i=0;i<16;i++)
   {
    SCLK_SET();
    if((wave_data & 0x8000) != 0)
   {SDIN_SET();}
 else
   {SDIN_CLR();}
    delay(1);
 SCLK_CLR();
    delay(1);
 wave_data = (wave_data << 1);
    }
 SYNC_SET();
 LDAC_CLR();
 delay(1);
 SCLK_SET();
 LDAC_SET();
 delay(1);
 }

我就想改下尝尝吧,然后我就把写数据的函数改成下面的


void WriteAD5439(uint ContralBits,uint DAdata)
{
 unsigned char i;
 uint buf;
 uint wave_data;
 buf=DAdata;
 buf = (buf<<2);
 wave_data = (ContralBits | buf);
 SYNC_SET();
 delay(1);
 SCLK_SET();
 SYNC_CLR();
 for(i=0;i<16;i++)
   {
    SCLK_SET();
    if((wave_data & 0x8000) != 0)
   {SDIN_SET();}
 else
   {SDIN_CLR();}
    delay(1);
 SCLK_CLR();
    delay(1);
 wave_data = (wave_data << 1);
    }
 SYNC_CLR();
 SCLK_SET();
 delay(1);
 }

重新上电,示波器上的数据事实会变换啦!!!弄定!扫尾附上我的测试法式模范模范,以便利他人学习!!!

 

#include <at89x51.h>

#define uchar unsigned char
#define uint  unsigned int

#define SDIN_SET() P0_0=1;
#define SDIN_CLR() P0_0=0;

#define SCLK_SET() P0_1=1;
#define SCLK_CLR() P0_1=0;

#define SYNC_SET() P0_2=1;
#define SYNC_CLR() P0_2=0;

#define LDAC_SET() P0_3=1;
#define LDAC_CLR() P0_3=0;

#define DACLR_SET() P0_4=1;
#define DACLR_CLR() P0_4=0;

uint num;

void delay(uint t)
{
  uint i;
  while(t--)
  {
   for(i=0;i<125;i++);
   }
 }

void WriteAD5439_CMD(uint CMDBits)
{
  unsigned char i;
     unsigned int data1 = CMDBits; 
  SYNC_SET();
  delay(1);
     SCLK_SET();
  SYNC_CLR();
  for(i=0;i<16;i++)
  {
      SCLK_SET();
    if((data1 & 0x8000) != 0)
   {
       SDIN_SET();
      }
   else
   {
       SDIN_CLR();
      }
         delay(1);
   SCLK_CLR();
         delay(1);
   data1  = (data1 << 1);
  }
  SYNC_CLR();
  //LDAC_CLR();
  //delay(1);
  SCLK_SET();
  //LDAC_SET();
  delay(20);
}

void WriteAD5439(uint ContralBits,uint DAdata)
{
 unsigned char i;
 uint buf;
 uint wave_data;
 buf=DAdata;
 buf = (buf<<2);
 wave_data = (ContralBits | buf);
 SYNC_SET();
 delay(1);
 SCLK_SET();
 SYNC_CLR();
 for(i=0;i<16;i++)
   {
    SCLK_SET();
    if((wave_data & 0x8000) != 0)
   {SDIN_SET();}
 else
   {SDIN_CLR();}
    delay(1);
 SCLK_CLR();
    delay(1);
 wave_data = (wave_data << 1);
    }
 SYNC_CLR();
 //LDAC_CLR();
 //delay(1);
 SCLK_SET();
 //LDAC_SET();
 delay(1);
 }

unsigned int readSDO(void)
{
    unsigned char i = 0;
    unsigned int readData = 0;
    bit  itemp;
 
 WriteAD5439_CMD(0X2000);
 SYNC_SET();
    delay(1);
 SYNC_CLR();
 
 for(i=0;i<16;i++)
 {
     SCLK_SET();
        readData <<= 1;
        delay(1);
     itemp = P0_5;
  SCLK_CLR(); 
  if(itemp)
          readData |= 1;
  delay(1);
     }
 SYNC_CLR();
 return readData; 
}

void  InitAD5439( void )
{
    DACLR_CLR();  
    delay(5);
    DACLR_SET();  
}        

void main (void)
{
 num=1023;
 //InitAD5439();
 WriteAD5439_CMD(0x9000);
 WriteAD5439(0x1000,num);
 //readSDO();
 while(1)
   {
   num=1023;
   WriteAD5439(0x1000,num);
   delay(10);
   num=0;
   WriteAD5439(0x1000,num);
   delay(10);
   };
}