yanniwang

ADI公司环路供电DAC转换器AD5421简介与例程

0
阅读(4277)

 AD5421是一款完整的环路供电型4 mA-20 mA数模转换器(DAC),专为满足工业控制领域智能发射器制造商的需求而设计。作为一种完全集成的高精度、低成本解决方案,该器件采用紧凑型TSSOP封装。AD5421内置一路稳压输出,用于为自身及发射器中的其它器件供电。此调节器提供1.8 V至12 V的调节输出电压。该器件还内置1.22 V和2.5 V基准电压源,因而不需要分立调节器和基准电压源。AD5421可以结合标准HART® FSK协议通信电路使用,而且额定性能不会受到影响。高速串行接口能够以30 MHz速率工作,并且允许通过一个SPI兼容型三线式接口与常用的微处理器和微控制器简单相连。AD5421保证16位单调性。典型条件下,积分非线性为0.0015%,失调误差为0.0012%,增益误差为0.0006%。它采用28引脚TSSOP封装, 额定温度范围为−40°C至+105°C工业温度范围。

功能框图如下:

 

下面是一段用ADUC7026和DAC通信的程序,供大家参考

 

/********************************************************************************
 Author             : CAST (China Applications Support Team) 

 Date               : 6-21-2011

 File name          : AD5421.C

 Description        : Using ADuC7026 to CONTROL AD5421 in software SPI form through GPIO.

 Hardware plateform : ADuC7026 + AD5421 
********************************************************************************/
#include 
#include "ADuC7026Driver.h"
#include "AD5421.h"


/********************************************************************************
Function that writes to the AD5421 via the SPI port.
********************************************************************************/

void AD5421_Initiate(void)
{
    ADuC7026_OutputBit(AD5421_SYNC,1);  //SYNC should be stay high for at lest 
    ADuC7026_OutputBit(AD5421_LDAC,1);
    Delay(5);
}   
void WriteToAD5421ViaSpi(long int *RegisterData)
{
    unsigned char i;
    long int TempData = 0;
    TempData = *RegisterData;
    
    ADuC7026_OutputBit(AD5421_SYNC, 0);
    for(i=0; i<24; i++)
    {	
        ADuC7026_OutputBit(AD5421_SCLK,1);
    	
        if(0x800000 == (TempData & 0x800000))
    	{
            ADuC7026_OutputBit(AD5421_SDIN,1);    //Send one to DIN pin
    	}
        else
    	{
            ADuC7026_OutputBit(AD5421_SDIN,0);    //Send zero to DIN pin
    	}
    	
        ADuC7026_OutputBit(AD5421_SCLK,0);
    	
        TempData <<= 1; //Rotate data
    }
    ADuC7026_OutputBit(AD5421_SYNC,1);	
    // Load DAC register only this way can work 
    ADuC7026_OutputBit(AD5421_LDAC,0);
    Delay(10);
    ADuC7026_OutputBit(AD5421_LDAC,1);
    Delay(5);

}

/********************************************************************************
Function that read from the AD5421 via the SPI port.
********************************************************************************/


void ReadFromAD5421ViaSpi(unsigned short *RegisterData,long int RegAddress)
{   
    long int cstr,putdata=0;
    long int tempdata = NOP;
    unsigned char i;

    cstr = RD | RegAddress;
    WriteToAD5421ViaSpi(&cstr);

    ADuC7026_OutputBit(AD5421_SYNC, 0);

    for(i=0; i<24; i++)
    {	
    	
        ADuC7026_OutputBit(AD5421_SCLK,1);
        if(0x800000 == (tempdata & 0x800000))
    	{
            ADuC7026_OutputBit(AD5421_SDIN,1);    //Send one to DIN pin
    	}
        else
    	{
            ADuC7026_OutputBit(AD5421_SDIN,0);    //Send zero to DIN pin
    	}
    	
        ADuC7026_OutputBit(AD5421_SCLK,0);
        tempdata<<= 1;  //Rotate data	
        putdata<<=1;
    	
    		 
        putdata |= ADuC7026_InputBit(AD5421_SDOUT);	
    }      
    *RegisterData=putdata;

    ADuC7026_OutputBit(AD5421_SYNC, 1);	 
    Delay(10);

}