ADI公司环路供电DAC转换器AD5421简介与例程
0赞
发表于 1/14/2012 10:14:10 PM
阅读(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); }
