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.

[参考译文] DAC8881:DAC 未输出预期值

Guru**** 2393725 points
Other Parts Discussed in Thread: DAC8881

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/708363/dac8881-dac-does-not-output-expected-values

器件型号:DAC8881

对于我正在工作的一个项目、我必须使用两个 DAC。 我为 DAC8881 DAC 选择了这种方法。

没有、我遇到了一个问题、我不太理解为什么会发生这种情况、因此我希望你们中的一位能够帮助我进一步。
(请允许我注意、我不是一个硬核编程器)

在我看来、DAC8881是一款非常简单的 DAC、因此我没有想到会有任何问题。 我知道我遇到的问题是我做的/做的错、但出于某种原因、我无法弄清楚它是什么。

我遇到的问题是:
-当我向 DAC 发送一个值时,它不会输出我希望它执行的操作。 输出似乎没有任何逻辑模式。
该控制似乎在0x7FFF 处停止、并且不遵循从0x0000到0x7FFF 的线性模式。  

VREF = 2.048V  (LM4132AMF-2.0)
AVDD = 3.3V
DVDD = 3.3V

默认硬件设置:

默认引导:
VOUT = 0V (寄存器= 0000h) RSTSEL -> GND
PDN = GND ->器件从未断电
SDOSEL = IOVDD ->器件处于独立模式
增益= GND ->增益= 1x
!LDAC = GND -> DAC 值立即更新
!RST =+3V3 ->器件从不进行硬件复位、不包括 循环通电
RSTSEL = GND ->将引导输出电压寄存器设置为0x0000/0V
USB/BTC = IOVDD -> 直接二进制代码输出

所电路的等效于: 模拟输出闭环配置、如第26页的数据表所示。 (在我的电路板上、RFB 和 Vout 引脚连接在信号离开 PCB 的位置)


一些示例: (仅供参考:使用 Fluke 115测量的实际输出电压)

发送代码:(通过逻辑分析仪确认) 0x0C80应为0.1V、输出实际输出为:0.064V
发送代码:(通过逻辑分析仪确认) 0x1900应该为0.2V、输出实际输出为:0.128V
发送代码:(通过逻辑分析仪确认) 0x2580应该为0.3V、输出实际输出为:0.008V
发送代码:(通过逻辑分析仪确认) 0x3200应为0.4V、输出实际输出为:0.256V
发送代码:(通过逻辑分析仪确认) 0x3E80在输出实际输出为0.480V 时应为0.5V
发送代码:(通过逻辑分析仪确认) 0x4B00应该为0.6V、输出实际输出为:0.016V
发送代码:(通过逻辑分析仪确认) 0x5780在输出实际输出为0.056V 时应为0.7V
发送代码:(通过逻辑分析仪确认) 0x6400应该为0.8V、输出实际输出为:0.512V
发送代码:(通过逻辑分析仪确认) 0x7080在输出实际输出为0.768V 时应为0.9V
发送代码:(通过逻辑分析仪确认) 0x7D00应该为1.0V、输出实际输出为0.960V
发送代码:(通过逻辑分析仪确认) 0x7FFF 应为1.024V、输出实际输出为1.024V
发送代码:(通过逻辑分析仪确认) 0x8980应为1.1V、输出实际输出为:0.008V
发送代码:(通过逻辑分析仪确认) 0x9600应该为1.2V、输出实际输出为:0.032V
发送代码:(通过逻辑分析仪确认) 0xA280应该为1.3V、输出实际输出为:0.004V
发送代码:(通过逻辑分析仪确认) 0xAF00应该为1.4V、输出实际输出为:0.112V
发送代码:(通过逻辑分析仪确认) 0xBB80在输出实际输出为0.408V 时应为1.5V
发送代码:(通过逻辑分析仪确认) 0xC800应为1.6V、输出实际输出为:1.024V
发送代码:(通过逻辑分析仪确认) 0xD480应为1.7V、输出实际输出为:1.024V
发送代码:(通过逻辑分析仪确认) 0xE100应为1.8V、输出实际输出为:1.536V
发送代码:(通过逻辑分析仪确认) 0xED80在输出实际输出为1.608V 时应为1.9V
发送代码:(通过逻辑分析仪确认) 0xFA00应该为2.0V、输出实际输出为:1.919V
发送代码:(通过逻辑分析仪确认) 0xFFFF 应该为2.048V、输出实际输出为:2.047V

--------------------------------------------------------------------
代码的一小段:

void SendVoltageToDACValue (int st设定 点、GPIO_typedef* GPIOx、uint16_t GPIO_Pin)

uint16_t DACValueToSend = 0;

DACValueToSend =设定点;

SPI_DataToSend[0]=(uint8_t)((DACValueToSend & 0xFF00)>8);
SPI_DataToSend[1]=(uint8_t)(((DACValueToSend & 0x00FF));
digitalWrite (GPIOx、GPIO_Pin、LOW);

HAL_DELAY (1);

HAL_SPI_Transmit (SPI_handler、SPI_DataToSend、2、SPI_TIMEOUT);

digitalWrite (GPIOx、GPIO_Pin、高电平);



你们中是否有人知道这里有什么问题? 我觉得应该很简单、但我看不到。


提前感谢您投入宝贵的时间和精力  

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

    我在您的代码段中看不到 SPI 配置。 您能描述一下配置 SPI 总线的时钟相位和时钟极性设置吗? 还有时钟频率? 更好的方法是在总线上查看 SPI 事务的示波器捕获(理想情况下、只需一帧、因此分辨率足以查看有关数字信号完整性的详细信息)。

    我知道您已经在文本中描述了硬件、但最理想的是查看原理图、因为最后、它最直接地代表了硬件。 如果直接查看原理图、我不太可能错过详细信息。 由于该器件似乎主要起作用、我怀疑这是一个原理图问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kevin、

    感谢您的快速回复。

    以下是您要求的数据:(目前我没有示波器捕获功能,只有逻辑分析仪捕获功能,这是因为我们的示波器有一些问题 )

    ----------------------------------------  SPI 配置-------------------------------------------------------

    SPI_HandleTypeDef hspi1;
    
    /* SPI1 init 函数*/
    void MX_SPI1_Init (void)
    {
    
    hspi1.instance = SPI1;
    hspi1.Init.Mode = SPI_MODE_MASTER;
    hspi1.Init.Direction = SPI_Direction_2LINES;hspi1.Init.Spi_Spi_Spi_1_Spiagle.Spi_1_Inature.Spi_Spi_1_Inature.Spi_Spi_1_Spi_1Id.Spi_Inat
    
    
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi1.Init.NSS = SPI_NSS_Soft;
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;// WAS 4
    hspi1.Init.FirstBit = SPI_FAUDROTCR1_INESC=SPI_Inspi_Inspi1
    
    
    
    ;SPIINCRT.Inspi_Inspi1 = SPITRIPH = SPIINESC1Inspi_INESC1Inspi1;TI_Inspi_InspiCRT.Inspi_Inspi_Inspi1;TCLUSTRIPH
    hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
    if (HAL_SPI_Init (&hspi1)!= HAL_OK)
    {
    _Error_Handler (_file__、__line__);
    }
    
    
    
    void HAL_SPI_MspInit (SPI_HandleTypeDef* spHandle)
    {
    
    GPIO_InitTypeDef GPIO_InitStruct;
    if (spHandle->instance=SPI1)
    {
    //用户代码 begin SPI1_Msp0
    
    * Inste/ Instein/SPIsp0*用户代码 Int *
    /* SPI1时钟启用*/
    _HAL_RCC_SPI1_CLK_ENABLE ();
    
    /** SPI1 GPIO 配置
    Pb3. ---- >SPI1_SCK
    Pb5. ---- >SPI1_MOSI
    *
    GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
    HAL_GPIO_Init (GPIOB、&GPIO_InitStructt);
    
    /* SPI1中断初始化*/
    HAL_NVIC_setPriority (SPI1_IRQn、0、0);
    HAL_NVIC_EnableIRQ (SPI1_IRQn);
    //用户代码 begin SPI1_MspInit 1 */
    
    //*用户代码 end SPI1_MspInit 1 */
    }
    
    
    void HAL_SPI_MspDeInit (SPI_HandleTypeDeF* spSpiE)
    {
    
    if (Handle->MspInit 1 */
    
    SPI0 = SPI0 * InsteN)/SPIspIdeInit *
    
    
    /*外设时钟禁用*/
    _HAL_RCC_SPI1_CLK_DISABLE ();
    
    /** SPI1 GPIO 配置
    Pb3. ---- >SPI1_SCK
    Pb5. ---- >SPI1_MOSI
    *
    HAL_GPIO_DeInit (GPIOB、GPIO_PIN_3|GPIO_PIN_5);
    
    /* SPI1中断取消初始化*/
    HAL_NVIC_DisableIRQ (SPI1_IRQn);
    //用户代码开头 SPI1_MspDeInit 1 *//
    
    //*用户代码结尾 SPI1_MspDeInit 1 *}
    
    

    --------------------------------------------------------------------

    原理图:

    命令的逻辑分析仪屏幕:1.024V 0x7FFF

    命令的逻辑分析仪屏幕:0.6V 0x4B00  

    命令的逻辑分析仪屏幕:0.4V 0x3200

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

    我已经找到了解决方案。 您的回复的一部分让我测试了时钟极性设置。 我将其从(默认)高电平更改为低电平、现在 DAC 的工作方式就像一种魅力。
    我知道这会是一个小而愚蠢的问题,你的答复帮助我指明了正确的方向。

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

    真是个好消息! 感谢您关闭环路并为我们提供有关此主题的更新。

    如果您将来需要此项目或下一个项目的任何帮助、请告知我们。