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.

[参考译文] DAC7750:加电时默认输出50mA 电流

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1047348/dac7750-50ma-current-out-default-on-power-up

器件型号:DAC7750

尊敬的团队:

我将 DAC7750与 PIC 控制器搭配使用。

我看到的问题是、当我加电时、我得到的默认电流大约为50mA、而无需配置任何器件。

我也无法建立通信。 我始终读取0xFF 或0x00、有时在输入一些数据后很少从控制寄存器读取0xFD。

我可以使用示波器检查旁边的通信部分、但50mA 输出的电流确实让我担心、而不做任何事情。 (在输出端添加了一个150E 负载电阻器、并在其上获得8.9V 电压)

我有没有做错的事情,或者有什么机会 发生这种情况? 我尝试将 CLR 引脚直接拉至 GND、并参考论坛中的其他原理图。

我也尝试了另一个原型板、但两者都导致了相同的行为。

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

    只是我想添加的另一个信息

    1) 1)我使用12V 电压测试模块、这意味着 AVDD 使用12V 电压供电  

    2) 2)未安装 ZD2、ZD3、D7、C11。

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

    Surya、


    我认为您首先应该检查器件的所有物理连接、并确保焊桥和其他接线没有任何问题。 确保引脚上的电压正确、并确保微控制器的数字输出端连接到器件的数字输入端(反之亦然)。 也许您可以给我们发送一份布局副本、或许还可以给我们发送一张电路板照片。

    接下来、您能否报告发送到器件的所有寄存器设置? 我认为可能会导致输出高得多的一件事是在 ISET-R 引脚上没有电阻器、然后意外地将器件设置为使用外部电阻器。 使用您发送到设备的任何通信回帖。

    我认为它们并不是绝对必要的、但您也可以向 CAP1和 CAP2添加一些电容器。 这将是另一种尝试。


    吴约瑟

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

    非常感谢 Joseph 的回答以及提示。

    我将尝试执行这些更改

    1) 1)检查 ISET-R 引脚

    2) 2)尝试在电容器1、2上添加电容器

    同时、我将向您发送布局和电路板图像以及默认寄存器设置。

    Surya

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

    附加了 DAC 的布局视图和原型模块的图像。 也许您会看到一些奇怪的东西、在我们尝试上述更改之前可能会有所帮助。  

    再次感谢您在此处提供的快速支持

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

    Surya、

    我还没有深入研究过这一点、但我还没有看到任何东西。 您可以发送寄存器设置吗?

    吴约瑟

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

    /*
     * File:   DAC7750.c
     * Author: Evergreen
     *
     * Created on 15 October, 2021, 6:53 PM
     */
    
    
    #include "HeaderIncludes.h"
    
    #define ADDR_NOP         0x00
    #define ADDR_WRITEDAT    0x01
    #define ADDR_READDAT     0x02
    #define ADDR_WRITECNTRL  0x55
    #define ADDR_WRITERST    0x56
    #define ADDR_WRITECONF   0x57
    #define ADDR_WRITEGAINCAL    0x58
    #define ADDR_WRITEZEROCAL    0x59
    #define ADDR_WATCHDOG    0x95
    
    #define ADDR_READSTATUS     0x00
    #define ADDR_READDATA       0x01
    #define ADDR_READCNTRL      0x02
    #define ADDR_READCONFIG     0x0B
    #define ADDR_READGAINCAL    0x13
    #define ADDR_READZEROCAL    0x17
    
    
    #define DAC_LATCH   LATDbits.LATD3
    //#define DAC_CLR     LATDbits.LATD2
    
    volatile char Writedat[3] = { 0x00, 0x00, 0x00};
    void DAC7750_Write(char Operation, char* data);
    unsigned int DAC7750_Read(char ReadRegister);
    
    void DAC7750_Init()
    {
        /* Set latch and clr pins as outputs */
        TRISDbits.TRISD3= 0; 
        TRISDbits.TRISD2= 0; 
        
        DAC_LATCH = 0;
    
        __delay_ms(10);
      
        /* Reset DAC */
         Writedat[0] = 0x00; Writedat[1] = 0x01;
        DAC7750_Write(ADDR_WRITERST, &Writedat[0]);
        __delay_ms(10);
      
        //External current setting resistor disable, Output enable, Slew Rate disable, Daisy-chain disable, Output range = 4-20mA.
        Writedat[0] = 0x10; Writedat[1] = 0x05;
        DAC7750_Write(ADDR_WRITECNTRL,&Writedat[0]);
        __delay_ms(10);
    
        //calibration enable, HART interface disable, frame error checking disable, Watchdog timer disable
         Writedat[0] = 0x00; Writedat[1] = 0x20;
        DAC7750_Write(ADDR_WRITECONF,&Writedat[0]);
        __delay_ms(10);
    
        //gain register
         Writedat[0] = 0x80; Writedat[1] = 0x00;
        DAC7750_Write(ADDR_WRITEGAINCAL,&Writedat[0]);
        __delay_ms(10);
        
        //data register
         Writedat[0] = 0x00; Writedat[1] = 0x00;
        DAC7750_Write(ADDR_WRITEDAT,&Writedat[0]);
        __delay_ms(10);    
        
    }
    
    
    void DAC7750_Write(char Operation, char* data)
    {
        // Clock out 24 bit command
        spiWrite(Operation); // Address byte
        spiWrite(data[0]);
        spiWrite(data[1]);
        
        DAC_LATCH = 0; __delay_us(100); DAC_LATCH = 1; __delay_us(100); DAC_LATCH = 0; // Latch up data   
    }
    
    unsigned int DAC7750_Read(char ReadRegister)
    {
        static char Readback[4];
        
        // Clock out 24 bit command
        spiWrite(ADDR_READDAT); // Address byte
        spiWrite(ADDR_NOP);     // Bit 15-6 NOP
        spiWrite(ReadRegister); // Read register address
        
        DAC_LATCH = 0; __delay_us(100); DAC_LATCH = 1; __delay_us(100); DAC_LATCH = 0; // Latch up data
        spiWrite(ADDR_NOP); // Dummy 8 byte data
        Readback[0] = spiRead();
        spiWrite(ADDR_NOP); // Read out data from host
        Readback[1] = spiRead();
        spiWrite(ADDR_NOP); // Read out data from host
        Readback[2] = spiRead();    
       
        DAC_LATCH = 0; 
        __delay_us(100); 
        DAC_LATCH = 1; 
        __delay_us(100); // Latch up data
        DAC_LATCH = 0;
        
        return ((Readback[1]<<8)+Readback[2]); //Returns Result
        
    }
    
    
    void spiInit()
    {  
      TRISC3 = 0; // Clk as output
      TRISC5 = 0; // SDO as output
      TRISC4 = 1; // SDI as input
      SSPCON1 = 0b00100010; // Clk/64 + SPI Enable + Master mode
      SSPSTAT = 0b00000000; // Sample input at middle
    }
    
    static void spiReceiveWait()
    {
      while ( !SSPSTATbits.BF ); // Wait for Data Receipt complete
    }
    
    void spiWrite(char dat) //Write data to SPI bus
    {
      SSPBUF = dat;
    }
    
    char spiDataReady() //Check whether the data is ready to read
    {
      if(SSPSTATbits.BF)
        return 1;
      else
        return 0;
    }
    
    char spiRead()    // Read the received data
    {
      spiReceiveWait();      // Wait until all bits receive
      return(SSPBUF); // Read the received data from the buffer
    }
    
    

    再次感谢您的回复。

    我使用它来初始化 DAC 的代码。 在初始化期间使用"DAC7750_Init()"函数。

    谢谢

    Surya

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

    您好 Surya、

    您能否检查 REFOUT 引脚是否振荡? 引脚上的电容非常小(100pF)、我们建议使用100nF 以上的电容。  这100pF 可能会导致一些稳定性问题。  我建议放置一个100nF 的电容器、然后再次进行测量。

    谢谢、

    Paul

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

    非常感谢 Paul。 我在这里放置了一个220nF 的电容、它工作正常。 现在、输出电流被限制在指定范围内。

    很好再次感谢