tlv5610是否可以控制单通道输出
8通道DA芯片tlv5610,输出第一个通道同时,第二个通道会得到一样的输出。
请问该芯片是否可以控制单通道输出?
你好,可以的,控制不同寄存器即可,参见手册12页
The 16-bit data word consists of two parts:
· Address bits (D150D12)
· Data bits (D110D0)
D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
A3 A2 A1 A0 DATA
Register Map
A3 A2 A1 A0 FUNCTION
0 0 0 0 DAC A
0 0 0 1 DAC B
0 0 1 0 DAC C
0 0 1 1 DAC D
0 1 0 0 DAC E
0 1 0 1 DAC F
0 1 1 0 DAC G
0 1 1 1 DAC H
1 0 0 0 CTRL0
1 0 0 1 CTRL1
1 0 1 0 Preset
1 0 1 1 Reserved
1 1 0 0 DAC A and B
1 1 0 1 DAC C and D
1 1 1 0 DAC E and F
1 1 1 1 DAC G and H
12
Robin您好,
试验了好多次,结果依旧,A,B通道会同时输出。
1.初始化程序(dac_5610_init())如下.
2.写入程序(dac_5610(u_int data_in))如下.
帮忙给予指导,非常感谢哦.
void dac_5610_init()
{
DAFS = 0;
_nop_();
DACLK = 1;
_nop_();
DAFS = 1;
_nop_();
DACLK = 0;
_nop_();
}
void dac_5610(u_int data_in)
{
u_char i;
DAFS = 0;
DALDAC=1;
for (i=0;i<16;i++)
{
DACLK = 1;
_nop_();
_nop_();
DADIN = (bit)(data_in&0x8000);
_nop_();
_nop_();
DACLK = 0;
_nop_();
_nop_();
data_in <<= 1;
_nop_();
_nop_();
}
DAFS=1;
_nop_();
_nop_();
DACLK=1;
_nop_();
_nop_();
DALDAC=0;
_nop_();
_nop_();
}
那你的CDEF呢?
从你得代码上没有看到你对某个具体的地址进行操作, 请把你的每个地址寄存器值读出来给我看,谢谢
主程序对于地址的具体操作,以及操作结果如下,tlv5610 VCC=5V,tlv5610参考电源4096mV。
u_int DA_setting=0x03FF;
dac_5610_init();
dac_5610(0x8000); //CTRL0 config,此步序执行完毕,tlv5610的8个通道输出为0.
dac_5610(DA_setting);//此步序执行完毕,tlv5610的A,B通道输出约为1024mV,其他CDEFGH通道输出为0.
DA_setting=0x03FF,对比datasheet register map on page12,输出结果理论上是A通道输出3FF,其余7个通道未进行操作。
实际结果是A,B通道输出3FF.
请单独操作B通道寄存器写其他值,看是否生效.请注意用示波器观察或回读是否有值被写到B通道去了.谢谢
Hi,Robin您好,
tlv5610确定可以单独控制每一路的输出吗?
是的确定,5608超多人用.
另请确认正规渠道购买
Robin您好,
是上两个月从贵司申请的样片.
重新努力看了datasheet,程式,现象依旧,百思不得其解,用仿真器,MCU来试验都一样,单独操作A通道或者B通道,另一个通道均会出现相同的值.
选择的是uc mode。
另外,datasheet里面有句话的意思不太理解,LDAC is an asynchronous input。It can be held low if a simultaneous update of all eight channels is not needed。翻译过来就是说,LDAC是异步输入,如果不需要所有8个通道的同步更新的话,LDAC可以保持为低。不理解的地方就是,如果LDAC保持为低,那么如何输出DA数据呢?从datasheet来看,LDAC需要拉低持续twl(LDAC)时间,经过ts时间后,OUTx才会输出,LDAC怎么可以一直保持为低呢?
Robin您好,
5608的驱动程序可以给参考下吗?我想对比下是否我的驱动哪里不对。
Robin您好,
还是不行,重新写了驱动如下,快崩溃了.
void dac_5610(u_int data_in)
{
u_char i;
DAFS = 1;
_nop_();
DACLK = 0;
_nop_();
DAFS=0;
for (i=0;i<16;i++)
{
DADIN = (bit)(data_in&0x8000);
_nop_();
DACLK = 1;
data_in <<= 1;
_nop_();
DACLK = 0;
_nop_();
}
DAFS=1;
}
仍然未得到解决,急切盼回复支援。
请把你把不同的通道写不同的值然后分别的每个地址寄存器值读出来给我看下,谢谢.
TLV56XX是很成熟的器件了,我手上没有源码.下面是其他DAC的一些源码连接, 以及如何做测试以及如何看时序的一些图片和问题处理方法给你参考
http://e2e.ti.com/support/data_converters/precision_data_converters/f/73/t/170202.aspx
对于LDAC,既Load DAC. The DAC outputs are only updated, if this signal is low. It is an asynchronous input.注意上面画了反号,因此为低有效时序如下.
另外对于你这个问题,请同时检查硬件是否有问题,是否会连焊?
不同的通道写不同的值然后分别的每个地址寄存器值读出来.
请教,地址寄存器值是如何读出来的?
这几天小孩生病,耽误了几天,非常抱歉。
图1是DACLK与DAFS时序图,图2是DACLK与DADIN时序图,实际写的数据是0x0AFF.
图2.
现象与之前还是一样,写入0x0AFF,其他通道会得到一样的输出。
硬件检查过,没有连锡,代码如下。
void dac_5610_init()
{
DALDAC=0;
_nop_();
DAFS=1;
_nop_();
DACLK = 0;
_nop_();
}
void dac_5610(u_int data_in)
{
u_char i;
DAFS = 0;
for (i=0;i<16;i++)
{
DACLK = 1;
DADIN = (bit)(data_in&0x8000);
_nop_();
DACLK = 0;
data_in <<= 1;
_nop_();
}
DAFS=1;
DACLK=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
DACLK=0;
}
main()
{
dac_5610_init();
while(1)
{
delay(200);
dac_5610(0x0AFF);
}
}
通过DOUT可以读出上一次的值, 你B通道再写一个值是什么效果?或者你写一个小的值到地址:1 1 0 0 :DAC A and /B
tlv5610,参考电源为4.096v.
1.写0x00FF(即A通道写入FF),那么8个通道均输出0.258v,接着写入0x11FF(即B通道写入1FF),那么8个通道均输出0.515v.
即在没有设定某个通道power down mode的情况下,写入任何一个通道值,其余7个通道会得到相同的输出.
如果设定某个通道为power down,那么该通道输出为0.
2.写0xC0FF(即DAC A and /B),那么A,C,E,G通道输出为0.258v,B,D,F,H通道输出为3.827v.
具体代码如下.
void dac_5610_init()
{
DALDAC=1;
_nop_();
DAFS=1;
_nop_();
DACLK = 1; //Ti wanda
_nop_();
}
void dac_5610(u_int data_in)
{
u_char i;
DACLK=0; //Ti wanda
_nop_(); //Ti wanda
_nop_();
_nop_();
_nop_();
_nop_();
DAFS = 0;
for (i=0;i<16;i++)
{
DACLK = 1;
//_nop_();
//_nop_();
//_nop_();
//_nop_();
DADIN = (bit)(data_in&0x8000);
_nop_();
_nop_();
_nop_();
_nop_();
DACLK = 0;
data_in <<= 1;
_nop_();
}
DAFS=1;
DACLK=1;
_nop_();
_nop_();
_nop_();
DACLK=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
DACLK=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
DALDAC=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
DALDAC=1;
}
main()
{
u_char i;
dac_5610_init();
dac_5610(0xC0FF); //DAC A and /B A=0.258v,B=3.827v
delay(200);
dac_5610(0x00ff); //0.258v
delay(200);
dac_5610(0x11FF); //0.515v
delay(200);
}
3.更换一片tlv5610,现象同上.
4.印刷电路板更换为自己手焊电路板,现象同上.
5.DALDAC常接地或者受控,在不同位置受控,现象同上.
6.查看波形,类似与之前提供波形,应当是满足资料手册的.
7.查看硬件,搭建最简单电路,只允许A通道接一电阻下地,其余不接外围电路,现象依旧.
综上,认为tlv5610 IC不能满足单路输出.
8.使用uc mode或者DSP mode,现象还是依旧.
电路图参考附件.
你好,原理图有误./PRE不能悬空, 请将其拉高重新测试后, 告知我结果,谢谢!
请将/PRE拉高测试
You can got expected channel by setting the PRE pin high other than suspending it.
/PRE拉高即可!哈哈,太激动了,非常感谢Robin的鼎力协助.
不过datasheet里面关于/PRE的说明甚少哦,没有说要强制拉高.
很高兴能解决你的问题,其实手册里面有一句
The outputs of the DAC channels can be driven simultaneously to a predefined value stored in the preset register
by driving the PRE input pin low
因此悬空应该是不可以的. 所以结论不能下太早哈