微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > 这个tlv5618的问题困扰我一天了,求帮忙看看

这个tlv5618的问题困扰我一天了,求帮忙看看

时间:10-02 整理:3721RD 点击:

我的 程序没问题的,网上有现成的,我也看了,跟我自己写的差不多,但是输出电压通道A和B都是0,纳闷啊,参考电压我选3.3V

,用REF3033提供的参考电压,程序如下

#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit DIN=P1^1;
sbit SCLK=P1^2;
sbit CS=P1^3;
#define chanel_A 1
#define chanel_B 2
#define chanel_AB 3


//*******写16位数据**************************************
void DA_Write_Byte(uchar date)
{
uchar i;
SCLK=1;
CS=0;
for(i=0;i<16;i++)
{
if(date&0x8000)
{
DIN=1;
}
else
{
DIN=0;
}
SCLK=0;
_nop_();
date=date<<1;
SCLK=1;
_nop_();
}
SCLK=1;
CS=1;
}
//***********模式选择,通道选择,数据转换***************************************************
void Write_Tlv5618(uchar Data_A,uchar Data_B,uchar mode,uchar chanel)
{
uchar Temp;
if(mode)
{
Temp=0x4000;
}
else
{
Temp=0x0000;
}
switch(chanel)
{
case chanel_A:
DA_Write_Byte(0x8000|Temp|(Data_A&0x0fff)); break;
case chanel_B:
DA_Write_Byte(0x0000|Temp|(Data_B&0x0fff)); break;
case chanel_AB:
DA_Write_Byte(0x1000|Temp|(Data_B&0x0fff)); break; //写数据到缓冲器
DA_Write_Byte(0x8000|Temp|(Data_A&0x0fff)); break; //写数据到A,同时更新B
default: break;
}
}
void Test()
{
Write_Tlv5618(0x0fff,0x0000,1,chanel_A);
}
void main()
{
Write_Tlv5618(0x0fff,0x0fff,1,chanel_AB);

}

电路图在附件里

你好,

硬件连接看来没问题,请检查VDD,REF管脚电压以确认连接是否可靠。

由于参考电压你选择的是3.3V,TLV5618的输出电压 = 2 * Vref * CODE / (2^n),n=12。输出电压可能大于VDD,所以你的CODE不能大于3103(0xC1F)。

程序方面,建议在SCLK=0之前加点延迟,以满足DIN的建立时间;

你这一段程序好像有点问题:

switch(chanel)
{
case chanel_A:
DA_Write_Byte(0x8000|Temp|(Data_A&0x0fff)); break;
case chanel_B:
DA_Write_Byte(0x0000|Temp|(Data_B&0x0fff)); break;
case chanel_AB:
DA_Write_Byte(0x1000|Temp|(Data_B&0x0fff)); break; //写数据到缓冲器
DA_Write_Byte(0x8000|Temp|(Data_A&0x0fff)); break; //写数据到A,同时更新B

进行单一通道更新的时候,应该要 或 一个 0x4000;

进行双通道同步更新的时候,第一条指令是0x001 (写入到DACB,但不更新);接着第二条指令是0x8000 (写入到DACA, 然后同步更新这两个DAC)

指令的详细情况,请参考数据手册第11页examples of operation节。

对了,如果这些改动后还是有问题的话,

那么可以通过示波器截取数据通信时序,跟数据手册第6页的timing requirements想比较,看看是否满足要求。

您好,感谢您的回答,我的硬件电路ref是3.3v很正常,电源5v很正常,但是无论写什么都得不到输出,输出一直是0v,我用万用表蜂鸣器档测地和OUTA和OUTB却不是连起来的,真是纳闷,还有就是那个写双通道的第一条指令确实是0x1000,第二条是0x800,我又添加了几个_nop_(),(51单片机的1us延时),发现还是不行,我猜测可能是烙铁温度过高,烫坏了,还是重新做一块吧,

对了,我做这块板子的时候,一直纠结要不要在CS,SCLK,DIN这三根线上加上拉电阻,根据我以往的经验,我觉得加上比较好,一个是有确定的电平,一个是提高输出能力。您觉得我说得对吗

你好,

根据你的程序来看,你写双通道的 第一条指令是0x5000,第二条是0xC000,请确认!

无论写什么都得不到输出,输出一直是0v的情况,鉴于你是用GPIO做的时序,还是建议通过示波器截取数据通信时序,跟数据手册第6页的timing requirements想比较,看看是否是通信方面的问题。

至于加上拉电阻与否,跟MCU 的 GPIO的驱动能力有关,很多的MCU都可以不用加。

 

谢谢您的回答,我稍后会用示波器看一下这个问题,不过我的程序是先确定它的模式是fast还是slow,

if(mode)
{
Temp=0x4000;                  //fast
}
else
{
Temp=0x0000;               //slow
}

然后确定写哪个通道,

switch(chanel)
{
case chanel_A:
DA_Write_Byte(0x8000|Temp|(Data_A&0x0fff)); break;
case chanel_B:
DA_Write_Byte(0x0000|Temp|(Data_B&0x0fff)); break;
case chanel_AB:
DA_Write_Byte(0x1000|Temp|(Data_B&0x0fff)); break; //写数据到缓冲器
DA_Write_Byte(0x8000|Temp|(Data_A&0x0fff)); break; //写数据到A,同时更新B
default: break;

}

写双通道确实是0x5000是第一条指令,我们只是思路不一样,嘿嘿

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top