DAC問題(DAC161P997)
Hi,各位TI大大們,打擾了。
小弟有個DAC(DAC161P997)問題,想請教各位大大。
請問大大們,使用DAC161P997這個顆DAC,
是否有使用過以下接法,且可正常work呢?
小弟使用以下接法,送時序無法改變其電流輸出,電流一直皆維持在4mA。
請問是否有其它需注意的地方呢?
謝謝各位大大。
目前還是無法控制DAC的電流輸出
我是以Microchip 18F26K22 MCU 對 DAC161P997作控制
SWIF TIMING (0、1、D....) 有使用示波器量測,Duty cycle皆符合Datasheet 規範
Symbol rate:大約 760Hz (規範300Hz ~ 19.2KHz)
測試結果:
ACKB腳一直為高電位,沒回ack。 (Datasheet : Note that the pulse generated by ACKB is active LOW.)
煩請各位大大幫幫忙,謝謝您們了。
以下是我的程式:
void DAC161P997_delay()
{
delay_ms(1);
}
void DAC161P997_pin_init()
{
output_low(PIN_A3);
DAC161P997_delay();
}
void DAC161P997_D()
{
output_high(PIN_A3);
delay_us(500);
output_low(PIN_A3);
delay_us(500);
}
void DAC161P997_0()
{
output_high(PIN_A3);
delay_us(250);
output_low(PIN_A3);
delay_us(750);
}
void DAC161P997_1()
{
output_high(PIN_A3);
delay_us(750);
output_low(PIN_A3);
delay_us(250);
}
void DAC161P997_A()
{
output_low(PIN_A3);
delay_us(2000);
}
void DAC161P997_write_data1() // 12mA current out
{
int iout_data1[19]={0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}; //0X8000_10
int8 w;
DAC161P997_D();
for(w=0;w<19;w++)
{
if(iout_data1[w]==0)
{
DAC161P997_0();
}
else
{
DAC161P997_1();
}
}
DAC161P997_D();
DAC161P997_A();
}
void DAC161P997_write_config_data1() //寫控制暫存器 0x0095_10 unlock
{
int config_data1[19]={1,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,1,1,0}; //暫存器0,資料0X0095_10 unlock
int8 w;
DAC161P997_D();
for(w=0;w<19;w++)
{
if(config_data1[w]==0)
{
DAC161P997_0();
}
else
{
DAC161P997_1();
}
}
DAC161P997_D();
DAC161P997_A();
}
void DAC161P997_write_config_data2() //控制暫存器 0X021D
{
int config_data2[19]={1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,0,0}; //暫存器2,資料0X021D_00 ACK_1 FRAME_1 PARITY_1 CHANNEL_0 LOOP_1
int8 w;
DAC161P997_D();
for(w=0;w<19;w++)
{
if(config_data2[w]==0)
{
DAC161P997_0();
}
else
{
DAC161P997_1();
}
}
DAC161P997_D();
DAC161P997_A();
}
void DAC161P997_write_config_data3() //控制暫存器 0x00AA_lock
{
int config_data3[19]={1,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0}; //暫存器0,資料0X00AA_10
int8 w;
DAC161P997_D();
for(w=0;w<19;w++)
{
if(config_data3[w]==0)
{
DAC161P997_0();
}
else
{
DAC161P997_1();
}
}
DAC161P997_D();
DAC161P997_A();
}
main()
{
DAC161P997_write_config_data1(); //控制暫存器unlock 資料0X0095_10 unlock
DAC161P997_write_config_data2(); // ACK_1 FRAME_1 PARITY_1 CHANNEL_0 LOOP_1
DAC161P997_write_config_data3(); //控制暫存器 0x00AA_lock
for(;;)
{
DAC161P997_write_data1(); //12mA current out
}
}
我是来看更新的.........马上也要用这个。
推荐用隔离接法,并把DAC部分的地浮起来。让DAC单独成一个小的电源系统工作。
拜托,我们用的不是你说的这种方法.......
代码我对着手册看过一遍,总结一下:
发送:D_1_00000000_10010101_10_D_A (D_写寄存器标志_寄存器地址_解锁命令_校验位_D_A) 解锁
发送:D_1_00000010_00011101_00_D_A (D_写寄存器标志_寄存器地址_配置命令_校验位_D_A) 配置
发送:D_1_00000000_10101010_10_D_A (D_写寄存器标志_寄存器地址_锁定命令_校验位_D_A) 锁定
循环
发送:D_0_10000000_00000000_10_D_A (D_写数据标志_数据高位_数据低位_校验位_D_A)
这个与手册中的描述一致
你的奇偶校验位算对了么?
0x0095_01
0x021D_11
0x00AA_01
0x8000_01
嗨,嗨,你的奇偶校验码确实算错了,如上,输出11.9969mA。你自己也试试吧。
测试程序完全依照你的例子进行编写的,单线直连,没有判断ACKB。不过A我用的是3000.