原创 DAC8571 16位DA使用注意事项

2010-5-4 10:55 5355 11 14 分类: 通信

问题1.设置后DA值后8571输出电源电平,显然是输出脚Vsense没和Vout接起来成为一个射集跟随器。


问题2.设置DA值后8571输出为零或比较低,并非相应的值,其实大家编的程序并没有问题,问题在8571的输出脚并不能带较大的容性负载,比如>0.1uF,<2k.


将电容接到47k电阻之后就可以了。



bit Set_DAC8571(uint s)
{
uchar bufh,bufl;


bufh=(s>>8);
bufl=s;


iic_start();
iic_send(0x98);////DAC8571器件地址//写命令0x98,读命令0x99.
if(!ack_flag)////没有回应返回0
return 0;
iic_send(0x10);//0x10//DAC8571控制字节//写入的数据更新空寄存器后同时更新DAC的输出。
if(!ack_flag)
return 0;


//for(i=0;i<num;i++)
//{
//iic_send(*s);
iic_send(bufh);
if(!ack_flag)
return 0;


iic_send(bufl);
if(!ack_flag)
return 0;


//s++;
//}


iic_sdelay(254);


iic_stop();
return 1;
}

文章评论3条评论)

登录后参与讨论

用户289700 2010-6-17 19:10

你好 :我最近在调试DAC8571,帮忙指导一下啊 问题:(1)电路连接:VDD = VREF = +5v VENSE 与VOUT 短接,SDL 与 SCL上啦10k(I2C通过51单片机软件模拟);A0接地。 (2)程序: void main() { unsigned char datasbuf[ 3 ] = {0x10,0x70,0x00}; SystemInit(); //系统初始化 I2C_Init(); I2C_Puts(0x4c,0,0,datasbuf,3); I2C_Gets(0x4c,0,0,datasbuf,3);DispHexValue(0,datasbuf[0]); DispHexValue(3,datasbuf[1]); DispHexValue(6,datasbuf[2]); while (1); } //定义延时变量,用于宏I2C_Delay() unsigned char data I2C_Delay_t; /* 宏定义:I2C_Delay() 功能:延时,模拟I2C总线专用 */ #define I2C_Delay()\ {\ I2C_Delay_t = (I2C_DELAY_VALUE);\ while ( --I2C_Delay_t != 0 );\ } /* 函数:I2C_Init() 功能:I2C总线初始化,使总线处于空闲状态 说明:在main()函数的开始处,通常应当要执行一次本函数 */ void I2C_Init() { I2C_SCL = 1; I2C_Delay(); I2C_SDA = 1; I2C_Delay(); } /* 函数:I2C_Start() 功能:产生I2C总线的起始状态 说明: SCL处于高电平期间,当SDA出现下降沿时启动I2C总线 不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态 本函数也可以用来产生重复起始状态 本函数执行后,I2C总线处于忙状态 */ void I2C_Start() { I2C_SDA = 1; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); I2C_SDA = 0; I2C_Delay(); I2C_SCL = 0; I2C_Delay(); } /* 函数:I2C_Write() 功能:向I2C总线写1个字节的数据 参数: dat:要写到总线上的数据 */ void I2C_Write(char dat) { unsigned char t = 8; do { I2C_SDA = (bit)(dat & 0x80); dat <<= 1; I2C_SCL = 1; I2C_Delay(); I2C_SCL = 0; I2C_Delay(); } while ( --t != 0 ); } /* 函数:I2C_Read() 功能:从从机读取1个字节的数据 返回:读取的一个字节数据 */ char I2C_Read() { char dat; unsigned char t = 8; I2C_SDA = 1; //在读取数据之前,要把SDA拉高 do { I2C_SCL = 1; I2C_Delay(); dat <<= 1; if ( I2C_SDA ) dat |= 0x01; I2C_SCL = 0; I2C_Delay(); } while ( --t != 0 ); return dat; } /* 函数:I2C_GetAck() 功能:读取从机应答位 返回: 0:从机应答 1:从机非应答 说明: 从机在收到每个字节的数据后,要产生应答位 从机在收到最后1个字节的数据后,一般要产生非应答位 */ bit I2C_GetAck() { bit ack; I2C_SDA = 1; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); ack = I2C_SDA; I2C_SCL = 0; I2C_Delay(); return ack; } /* 函数:I2C_PutAck() 功能:主机产生应答位或非应答位 参数: ack=0:主机产生应答位 ack=1:主机产生非应答位 说明: 主机在接收完每一个字节的数据后,都应当产生应答位 主机在接收完最后一个字节的数据后,应当产生非应答位 */ void I2C_PutAck(bit ack) { I2C_SDA = ack; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); I2C_SCL = 0; I2C_Delay(); } /* 函数:I2C_Stop() 功能:产生I2C总线的停止状态 说明: SCL处于高电平期间,当SDA出现上升沿时停止I2C总线 不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态 本函数执行后,I2C总线处于空闲状态 */ void I2C_Stop() { unsigned int t = I2C_STOP_WAIT_VALUE; I2C_SDA = 0; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); I2C_SDA = 1; I2C_Delay(); while ( --t != 0 ); //在下一次产生Start之前,要加一定的延时 } /* 函数:I2C_Puts() 功能:I2C总线综合发送函数,向从机发送多个字节的数据 参数: SlaveAddr:从机地址(7位纯地址,不含读写位) SubAddr:从机的子地址 SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址 *dat:要发送的数据 Size:数据的字节数 返回: 0:发送成功 1:在发送过程中出现异常 说明: 本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址 当从机没有子地址时,参数SubAddr任意,而SubMod应当为0 */ bit I2C_Puts ( unsigned char SlaveAddr, unsigned int SubAddr, unsigned char SubMod, char *dat, unsigned int Size ) { //定义临时变量 unsigned char i; char a[3]; //检查长度 if ( Size == 0 ) return 0; //准备从机地址 a[0] = (SlaveAddr << 1); //检查子地址模式 if ( SubMod > 2 ) SubMod = 2; //确定子地址 switch ( SubMod ) { case 0: break; case 1: a[1] = (char)(SubAddr); break; case 2: a[1] = (char)(SubAddr >> 8); a[2] = (char)(SubAddr); break; default: break; } //发送从机地址,接着发送子地址(如果有子地址的话) SubMod++; I2C_Start(); for ( i=0; i 2 ) SubMod = 2; //如果是有子地址的从机,则要先发送从机地址和子地址 if ( SubMod != 0 ) { //确定子地址 if ( SubMod == 1 ) { a[1] = (char)(SubAddr); } else { a[1] = (char)(SubAddr >> 8); a[2] = (char)(SubAddr); } //发送从机地址,接着发送子地址 SubMod++; I2C_Start(); for ( i=0; i

用户289700 2010-6-14 14:22

能加我QQ373998363 讨论一下吗 ?

用户289700 2010-6-14 14:20

能加我QQ 一起讨论一下吗 关于DAC8571

sunke9_998892717 2009-1-6 09:25

支持!

用户1569463 2009-1-6 07:58

那就是让他进入新领域了
相关推荐阅读
用户1270731 2011-03-22 09:41
模拟外调制器偏置电压自动控制实现之软件部分
attachment download   模拟外调制器偏置电压自动控制实现之软件部分  三、偏置电压自动控制的实现 两路导频信号1.硬件组成部分单片机外调制器高精度DA转换正负电压调节电路CSO分量...
用户1270731 2010-12-10 19:53
STC90LE58AD ENC28J60 WEB
拜读了某前辈的文章,看来我找到移植UIP0.9问题的关键了。通常ENC28J60的驱动程序只考虑发送参数packet指针指向的数据区,在HTTP需要回应的数据的时候,没有将需要的数据(UIP处理后放在...
用户1270731 2010-12-10 19:29
ENC28J60提供的超小协议栈
ENC28J60提供的超小协议栈,它用一个全局的数组来做接收和发送缓冲。部分发送数据包从接收包中更改标志和校验和得到,最大化的减少内存拷贝。实现TCP/IP协议收发数据包的各个子功能,如校验和计算,标...
用户1270731 2010-12-03 07:58
单片机以太网-web网页问题
uip协议栈,STC12LE58AD单片机。问题是得不到网页数据,10延迟后退出,发送无数据。调试httpd部分串口输出如下:ip: version4 header.ip: POSSIBLE TCP ...
用户1270731 2010-06-13 15:03
VC++6.0做的 RS232 数据帧类
// ZBL232Frame1.h: interface for the CZBL232Frame class.////////////////////////////////////////////...
用户1270731 2010-06-03 16:34
铌酸锂晶体横向电光调制实验
实验六 铌酸锂晶体横向电光调制实验<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> ...
我要评论
3
11
关闭 站长推荐上一条 /2 下一条