This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DAC161S997:DAC 输出存在问题

Guru**** 664280 points
Other Parts Discussed in Thread: DAC161S997, MSP430FR2355, TIDA-00648, TIDM-01000
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/966610/dac161s997-issues-with-dac-output

器件型号:DAC161S997
主题中讨论的其他器件: MSP430FR2355TIDA-00648TIDM-01000

早上好、

MCU MSP430FR2355和 DAC161S997之间的通信存在一些问题。

我的目标是简单地在 DAC 输出上对我想要的电流进行编程。


现在、我在环路上获得2.119mA 电流-(尽管我在代码中要求5mA)。 ERRB 为低电平、因此在某个位置存在误差...

为了进行测试、我使用2个中断来读取寄存器0x09和0x05 (因此我发送了命令0x89和0x85)。


我尝试发送

0x89 0x5555  0x02 0xDEAD  (读取状态和 NOP)

我在 MISO 0x20 0xDEAD 0x89 0x00E1上得到("1"表示环路错误)


当我发送0x85 0x5555 0xDEAD (读取错误配置和 NOP)和时

我在 MISO 上得到:0x20 0xDEAD 0x85 0x00F1 (没关系)

  SPI 时序似乎正确。

 

我使用"MSP430FR2355 LaunchPad"对 MCU 进行编程。 当系统仅通过 Launchpad (仅3V3)通电时,ERRB 会变高(因此没有错误)。 但是、当我为整个系统供电时(通过 LOP+/ LOP-)、ERRH 会降低。

 

我是否错过了任何内容或可以测试的内容?


如果可以的话、我在下面附上了程序和原理图。 我使用 TIDA-00648和 TIDM-01000作为参考。

有人能帮我解决这个问题吗?

我是微控制器的初学者、这可能是一个愚蠢的错误。

此致、

Christophe Felder

------

#include 

#include 

#include 

#include "DAC161.h"



volatile int flag_4mA = 0;

volatile int flag_20mA = 0;

unsigned char DAC_Error_Processing;

unsigned char dacStatus = 0;



void USCIA1_Init (void);

unsigned char USCIA1_SPI_WriteByByByByByByte (unsigned char Data);

unsigned char DAC161_read_Status (

161);unsigned char lengthchar WriteReg (ved char *、unsigned char WriteReg)

void Setup_DAC161 (unsigned short errConfig、unsigned short errLow_uA、unsigned short errHigh_uA);





void main (void){

volatile int i=0;

WDTCTL = WDTPW | WDTHOLD; //停止看门狗定时器

PM5CTL0 &&=~LOCKLPM5;

USCIA1_Init();

P4DIR &&~BIT0; //输入引脚

P4IES |= BIT0; //高到低边

沿 P4IFG &=~0xFF; //清除任何挂起的中断

P4IE |= BIT0; //启用中断

P3OUT &=~BIT7; //清除 P3.7输出锁存器以显示已定义的上电状态

P3DIR |= BIT7; //将 P3.7设置为输出方向

P1DIR &=~BIT0; //将 P1.0设置为输入

P1IE |= BIT0;

P1IES |= BIT0;

P1IFG &=~BIT0; // P1.0 IFG 清除

P1DIR &=~BIT1; //将 P1.1设置为输入

P1IE |= BIT1;

P1IE|= BIT1;

P1IFG &=~BIT1; // P1.1 IFG 清除

__bis_SR_register (GIE); //输入 LPM0,带中断





SETUP_DAC161 (DAC161_STD_ERR_CONFIG_STOPEND、3000、22000); //配置 DAC161

DAC_Error_Processing = 0;

DAC161_SET_OUT_Value (5000);//不工作

DAC161_Nop ();

__DELAY_CYCLES (5000);



while (1){

IF (DAC_Error_Processing){ //在此处执行 DAC 错误处理

DAC_Error_Processing = 0;

dacStatus = DAC161_READ_Status (); //读取状态以清除错误

}

}



#pragma vector=Port1_vector

__interrupt void Port_1 (void)

{

switch (__even_in_range (P1IV、16))

{

案例0:break;//无中断

案例2:

FLAG_20mA = 1; P1.0上的//中断

P2OUT &=~BIT1; //CS DAC = 0

USCIA1_SPI_WriteByte (0x89); //读取状态

USCIA1_SPI_WriteByte (0x55);

USCIA1_SPI_WriteByte (0x55);

P2OUT |= BIT1; //CS DAC = 1.

DAC161_NOP (); //读取状态

P1IFG &=~BIT0; //清除标志

break;// P1.0

case 4:// P1.1上的中断

flag_4mA=1;

P2OUT &=~BIT1; //CS DAC = 0

USCIA1_SPI_WriteByte (0x85); //读取 ERR CFG

USCIA1_SPI_WriteByte (0x55);

USCIA1_SPI_WriteByte (0x55);

P2OUT |= BIT1;

DAC161_NOP ();

P1IFG &=~BIT1;//CS DAC = 1.

break;// P1.1

}

#pragma



vector=Port4_vector

__interrupt void Port_4 (void){

if (P4IFG & BIT0){// DAC 发生了错误? (ERRB -> 0)

DAC_Error_Processing = 1;

}

P4IFG = 0;

}



void USCIA1_Init(void){

P4SEL0 |= BIT1 + BIT2 + BIT3;//配置 MOSI MISO SCK

P2OUT &=~BIT1; //CS_DAC

P2DIR |= BIT1;

UCA1CTL1 |= UCSWRST; //启用 SW 复位

UCA1CTLW0 = UCMST + UCSSEL_SMCLK + UCMSB + UCSYNC + UCSWRST;// SPI 主设备,3线,同步模式

UCA1BR0 = 0; // SMCLK/1 = SCLK (1MHz)

UCA1BR1 = 0;

UCA1CTL1 &=~Ω UCSWRST; //清除 SW 复位,恢复操作

}



unsigned char USCIA1_SPI_WriteByte (unsigned char 数据){

while (!(UCA1IFG&UCTXIFG)); // USCI_A1 TX 缓冲器就绪?

UCA1IFG &=~UCRXIFG; //清除 RX 中断标志

UCA1TXBUF = DATA; //

在(!(UCA1IFG & UCRXIFG)时将数据放置在 TX 缓冲区中;//等待数据接收结束

返回((unsigned char) UCA1RXBUF); //从 RX 缓冲

器返回接收到的字节}



unsigned char DAC161_read_Status (void){ //读取 DAC 状态

unsigned char returnValue[3];

DAC161_READ_Regs (returnValue、DAC161_STATUS_REG、2);

return (returnValue[2]);

}

void DAC161_Write_Regs (unsigned short * writeValues、unsigned char startReg、unsigned char lengthBytes){

unsigned char outData[3];

outData[0]= DAC161_SPI_WRITE_CMD (startReg);

outData[1]=* writeValues >> 8;

outData[2]=* writeValveData + USC1;

outlength1;outData //为命令字节的长度添加1

}



void Setup_DAC161 (unsigned short errConfig、unsigned short errLow_uA、unsigned short errHigh_uA){

unsigned short errValue;

DAC161_Write_Regs (&errConfig、DAC161_ERR_CONFIG_REG、2);

errValue = DAC161_convert (errLow_uA 和 err16)



;DAC161_Err_Write_Regs (&r_Err100_Err_Err_Err_Err_uA)



errValue = 0x80;

DAC161_Write_Regs (&errValue、DAC161_ERR_HIGH_REG、2);

} 



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Christopher、

    我认为您首先应该检查的是、您的电源允许浮动。 请注意、LOOP 比接地(COA/COMD)的电势低。 环路负极和接地之间的电压差取决于所需的环路电流。 例如、如果您的环路负极连接到接地端、而您的微控制器也连接到接地端、则器件将无法调节电流。

    谢谢、

    Paul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、非常感谢您的回答、我将在年末假期后检查一下。

    圣诞节快乐、新年快乐

    Christophe

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    早上好、新年快乐

    我现在可以确认 LOOP 和 GND ( 150kΩ)之间没有导通性
    GND 和 LOOP 之间的电势约为0.596V。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Christophe、


    我没有看到系统有任何连接或代码问题、但我还有其他一些有关此问题的后续问题。 您使用的环路电源电压是多少? 我假设您使用插入到环路中的电阻器来测量电流。 您使用的电阻器值是多少? 电阻器是否连接到环路-与环路电源的负连接?

    我还会检查电流是否与 DAC 代码呈线性关系。 我会将 DAC 代码设置为多个值并测量电流。 使用诸如2000、4000、6000、8000、...的代码 E000、FFFFh、记录输出电流并绘制它们以进行检查。 录制它们时、您可以将它们插入到答复帖子中的表格中。


    吴约瑟

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joseph、您好、感谢您的回答

    对于回路接收器,我使用一个100欧姆的精密电阻器,如原理图中所示进行连接:

    回路电源为24VDC。

    DAC 不会生成任何输出、发送 SPI 命令时、我一直具有 ERRB 中断。 我尝试的每个代码都得到2.1mA 电流。

    此致、
    Christophe Felder

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Christophe、


    如果存在环路误差(基于 ERRB 指示和读取状态寄存器)、则应尝试检查实际环路以查看电流的流动位置。 首先、我们询问了您提到的环路电压、该电压大约为-0.6V。 但是、该电压可能包括电路中的齐纳二极管。 实际上、我们需要知道的电压是从 GND (或 COMA)到 OUT 的电压、其中不包括正向偏置齐纳二极管。 在输出端、40欧姆内部电阻器上的电压提供了大部分电流、这些电流将回路进入接收器。

    然后、我将测量 NPN 发射极电阻两端的电压。 这将提供从 LOP+拉取的受控电流。

    记录这些电压并验证电源和回路接收器接地与器件接地端不相同。


    吴约瑟

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    早上好、

    我在 GND 和 OUT 之间测得的值约为-81mV、GND 和发射极之间几乎没有任何值(-0.005mV)

    我检查了环路接收器接地与 GND 不相同。

    感谢您的指导。

    Christophe Felder

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Christophe、


    我仍然不确定您为什么无法获得正确的输出。 我已经回顾过您的原理图、对我来说看起来很好。

    返回测量结果、GND 到 OUT 等于-81mV、这在环路中大约为2.045mA。 它来自 DAC 中的内部40Ω Ω 电阻器、并且接近您在环路上测量的2.1mV 电压。 这可能意味着 NPN 不会从 LOP+拉取电流(或非常大的电流)。 NPN 发射极电阻器的测量值为0.005V。 在20Ω μ A 时、您似乎从 LOP+上拉取250uA、这不是太大的电流。 我想、考虑到环路电流大约为2mA、您会有更多的电流。 原理图中未显示的3.3V 电源是否有其他断电?

    使用 ERRB 指示以及显示循环错误的状态读取、这似乎仍然是可能的问题。 不过、正如我之前提到的、原理图对我来说看起来不错。 以下是我希望您检查的内容。

    由于器件提供了环路误差、我将检查 LDO 是否正确提供输出电压。 检查 LDO 输出是否为3.3V、然后确保 VIN 至 VOUT 电压为正确的电压。 如果环路使用24V 电源、则 VIN 到 VOUT 的电压应约为20V。 剩余的4V 电压来自 LDO 输出电压、压降至输出、正向偏置齐纳二极管、然后是接收器电压。

    对于环路、我将检查以确保环路电源和环路接收器都位于同一接地端。 我还会确保它们独立于 UC/DAC 接地。 我知道您之前已经测量过这一点、但我只是想检查电源是否接地、而 uC 也通过计算机连接接地。 还要检查 uC、LDO 和 NPN 发射极的接地端(通过电阻器)是否也与 DAC 连接到同一接地端。 原理图看起来是这样的、但只需验证连接即可。

    我还会检查基极电压、以确保其上拉以打开 NPN。 该电压应为高于接地的二极管电压、以便能够导通 NPN。 同样、您可以使用该20Ω Ω 电阻器上的电压来验证是否有电流通过 NPN。

    对于回路电源、您使用的是什么电源、您确定它可以提供25mA 电流吗? 原理图上没有直接显示它、您是否将它直接连接到了 LOP+、或者您是否有任何其他二极管或其他保护电路?

    吴约瑟

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Christophe、


    我已经听过您的反馈了一段时间、因此我想与您再次核实您的环路设置。 您是否能够使器件输出适当的回路电流? 在我的上一篇文章中、我提出了一些使用环路测量的调试建议。 通过进行测量、我曾希望这将导致 DAC 输出与预期的结果发生偏离。

    现在、我将关闭该线程。 希望您已经解决了这个环路问题。 如果您尚未发布、我们将继续处理此主题。


    吴约瑟