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.

[参考译文] EK-TM4C1294XL:使用 ADC161S626和 DAC161S055 EVM 进行信号转换

Guru**** 2451110 points
Other Parts Discussed in Thread: ADC161S626EVM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/622786/ek-tm4c1294xl-signal-conversion-using-adc161s626-and-dac161s055-evms

器件型号:EK-TM4C1294XL
主题中讨论的其他器件:DAC161S055EVMADC161S626EVM

您好!

我的测试应用基本上是获取模拟信号的输入(信号发生器的正弦波)使用 ADC161S626EVM BoosterPack 对其进行转换、并在不经过任何修改的情况下通过 DAC161S055EVM BoosterPack 输出相同的信号、两个 BoosterPack 都通过 SPI 接口进行通信。

问题是输出信号(蓝色)看起来是冻结的、比如代码的某些部分需要太长的时间才能被处理。

在示波器的图片中:黄色(输出)、蓝色(输入信号)。

代码如下所示。 我已使其功能初始化 ADC 和 DAC。 在 main 中 、我只需调用这些函数、并在 while (1)内执行读/写例程

现在、我确定到底是什么冻结了代码、或者处理时间太长。 如果有任何帮助,将不胜感激。

PS.:我尝试使用代码突出显示器、我希望它能起作用...

#include 
#include 
#include 
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/ssi.h"
#include "driverlib/syscValue.h"
#include "driverlib/uart.h"
#include "utils/ustdio.h"


;iint32uintuh

、i20uintu_uinth 和 uintu32uintuh、i_uintuintuintuh、inc.h、iintuintuintuinth 和 uintuintu32h、uintuintuintuintuintuintuinth
uint32_t pui32DataRx[3]、补码、虚拟;

//初始化 PORTD =>针对 DAC
空 InitPORTD (void){

SysCtlPeripheralEnable (sysctl_Periph_GPIOD);

while (!SysCtl_Periph_GPIOD);while (!SysCtl_PinTS_Output_GPIOD





);GPIOP2_BASE (GPIO_PIN_GPIO2);GPIO_PIN_GPIOP2_BASE)

//初始化 PORTD => ADC
void InitPORTE (void){
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE)的 FSS;

while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOE)){GPIOCtlPeripheralEnable (GPIO_Porte


_BASE、GPIO_PIN_4

);GPIO_PIN_4引脚 GPIO_PIN_4引脚


void InitADCSSI (){

//必须启用 SSI0外设才能使用。

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);


//为端口 A2、A3、A4和 A5上的 SSI0功能配置引脚多路复用。

GPIOPinConfigure (GPIO_PD3_SSI2CLK);
//GPIOPinConfigure (GPIO_PD2_SSI2FSS);PORTE4 (InitPORTE)保持的函




数 GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);GPIOPinConfigure (GPIO_PD1_SSIDAT0);/配置 GPIO 引脚设置。 此功能还将
这些引脚的//控制提供给 SSI 硬件。 请参阅数据表来
//查看每个引脚分配的函数。 
GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3); SSIConfigSetExpClk (SSI2_base、ui32SysClkFreq、SSI_FRF_MOTO_MOTO_MODE_3、 SSI_MODE_MASTER、 5000000、16); SSIAdvModeSet (SSI2_base、SSI_ADV_MODE_LEGACWE); //启用 SSI0模块。
SSIEnable (SSI2_base); } void InitDACSSI (void){ //uint32_t pui32DataRx[3]; SysCtlPeripheralEnable (SYSCTL_Periph_GPIOQ); SysCtlPeripheralEnable (SYSCTL_Periph_SSI3); GPIOP3Q_GPIO1 ;SysCtlGPIO0_GPIOQ1_Q1 (GPIOQ0_P3Q_GPIOQ0_GPIO3) GPIOPinConfigure (GPIO_PQ2_SSI3XDAT0); GPIOPINTypeSSI (GPIO_PORTQ_BASE、GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3); SSIConfigSetExpClk (SSI3_base、ui32SysClkFreq、SSI_FRF_MOTO_MODE_0、SSI_MODIM_MASTER_0、SSI_MODE_0、SSI_MODIM_0 20000000、8); SSIEnable (SSI3_base); //while (SSIDataGetNonBlocking (SSI2_base、&pui32DataRx[0])){ //} // 初始化 DAC void InitDAC (void){ //初始化 DAC uint8_t 命令[2];0xint8_uint2 = 0xint2;uint2 = 0xintu0[uint2};uint2 = 0xintuint2 = 0xintuint2;uint2 = 0xintuint2 = 0xintuint2;uintuint2 = 0xint2 = 0xint2;uintuint2 = 0xint2 = uintuint2;uintuint2 = uint2 = 0xint2 uintindex++){ GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_2、0); SSIDataPut (SSI3_base、command[uintindex]); while (SSIBusy (SSI3_base)){ } SSIDataPut (SSI3_base、first_data[uintindex]); while (SSIBusy (SSI3_base)){SYSC_INTS3_INTS_UST_INTSN (s2_INTS_INTS_INTS_INUSTRAM);while (ssn_SYSC_SC_INTS_INTS_INTS_INTS_INTS_INTS3_INTS_INTS_INTS_INTS_INST_INTS_INUSTRAM);} InitDACSSI (); InitDAC (); while (1){ //清空 FIFO while (SSIDataGetNonBlocking (SSI2_base、&pui32DataRx[0])}{} GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、0); //从 SPI 读取 (ui32DataRx+);SS32ui2+索引(SSu32a+= SSu32ue2+ 、SSue2+索引) 伪); adcRX[ui32Index]=虚拟; } GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、GPIO_PIN_4); convertedValue =(adcRX[0]<<2)|(adcRX[1]>> 14); GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_2、0); //向 SPI SSIDataPut (SSI3_base、0x08)写入命令; while (SSIBusy (SSIID_BASE ) } (SSIID3) 、SSIIDP_BASE (SSIID3);while (SSIIDIID3) 1 (1)(1)(1)(1)+ SSIIDPSIMP_3)(1 (1)(1)(1)、 1 (1 (1)+ SSIIDPIDPIDSIMP_BASE)(1)(1)(2)(1 (1)、2)(1 (1 (1)(1)(1)、2)

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

    我没有看到明显的错误、但为什么您将这些线放置在"while (1)"循环中?

    //清空 FIFO
    同时(SSIDataGetNonBlocking (SSI2_base、&pui32DataRx[0]){}
    

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

    Bob Crosby、您好、感谢您的快速回答。

    我认为每次 ADC 读取时都必须清空 FIFO。

    我弄错了吗? 我是否必须在第一次时就这么做?

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

    Geovani

    如果只依赖 while (忙)循环、我在使用 SPI 和 I2C 通信时遇到了各种问题。

        SSIDataPut(SSI3_BASE, 0x08);
        while(SSIBusy(SSI3_BASE)) {}
        SSIDataPut(SSI3_BASE, convertedValue >> 8);
        while(SSIBusy(SSI3_BASE)) {}

    如果您使用逻辑分析器查看信号、我认为上面序列中的第二个 DataPut 将很快发生、恰好在第一个忙被清除后、但第一个忙不会导致末尾出现额外的"半时钟" 换句话说、使用 SPI 或 I2C 的连续读取或写入似乎会中断时钟、并且大多数外部外设会以无效值响应这种情况。

    实际上、我打算创建一个详细的帖子来讨论这一问题、但现在我将把问题放在这里、作为您问题的可能解释、因为我目前没有可用的拍摄照片、也没有时间安排设置...

    第二点、您的示波器打印似乎与您的文本相矛盾、我感到困惑。 您说输出是蓝色的、会偶尔冻结一次、但很明显、黄色线条显示了一种难看的非正弦模式。

    此致

    布鲁诺

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

    [引用 user="Geovani Alves"] PS:我尝试使用代码突出显示器,我希望它能起作用...

    谢谢您的使用。

    我认为、您的第一步需要确定您的代码是"冻结"还是正在发生其他影响。

    我首先要做的是"处理芯片选择以及冻结输出。 看看它们是否与扁平线同时停止。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对我的海报朋友很好-在需要的(总是)工作-"使用亲吻!"

    他关于"示波器芯片选择"的提示非常有意义-但也同样有意义、"降低输入正弦波的频率"。 始终希望"获得一些工作机会-仅(然后)-"拧紧设计螺钉"-和"通过改进进行"。

    所有这些(坚定的)在 kiss 的范围内-确保为您提供最佳、最快(并且经常)的成功机会!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Robert。

    一旦我再次进入实验、我将在 CS 中使用'scope。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不理解"在需要的(始终)中工作-"使用 kiss!"

    但无论如何、感谢您的提示。 我将设置低频率值并尝试对 CS 进行范围控制。

    一旦我获得结果、我将再次发布。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "kiss"是遵循"系统和简单"流程(即保持简单学生/斯特河/成功型学员)的首字母缩写词。

    做得太多-太快-是一种典型的失败手段。   相比之下、"kiss"提醒并执行一个简单、可测量的程序、这种程序最好地确保(多个)零件"聚在一起"、因为完成接近尾声。  (即设计中的每个单独元素都经过了独立测试/验证-受到了大量(个人)关注-显然会导致复杂项目的成功...

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

    当我放置以下项时、输出看起来会更好:

    //清空 FIFO
    同时(SSIDataGetNonBlocking (SSI2_base、&pui32DataRx[0]){} 

    函数 ADCInitSSI()内部。
    因此、我降低了输入正弦波的频率、大约1kHz 时工作正常、输出无失真。
    但是、当接近7KHz 正弦输入时、输出会失真、问题是我需要对至少40kHz 的波进行采样。

    芯片选择看起来不错。



    
    

    ADC 芯片选择:


    DAC 芯片选择:

     

    我的代码没有太大变化、只是突出显示的行:

     

    #include 
    #include 
    #include 
    #include "inc/hw_memmap.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/ssi.h"
    #include "driverlib/syscValue.h"
    #include "driverlib/uart.h"
    #include "utils/ustdio.h"
    
    
    ;iint32uintuh
    
    、i20uintu_uinth 和 uintu32uintuh、i_uintuintuintuh、inc.h、iintuintuintuinth 和 uintuintu32h、uintuintuintuintuintuintuinth
    uint32_t pui32DataRx[3]、补码、虚拟;
    
    //初始化 PORTD =>针对 DAC
    空 InitPORTD (void){
    
    SysCtlPeripheralEnable (sysctl_Periph_GPIOD);
    
    while (!SysCtl_Periph_GPIOD);while (!SysCtl_PinTS_Output_GPIOD
    
    
    
    
    
    );GPIOP2_BASE (GPIO_PIN_GPIO2);GPIO_PIN_GPIOP2_BASE)
    
    //初始化 PORTD => ADC
    void InitPORTE (void){
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE)的 FSS;
    
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOE)){GPIOCtlPeripheralEnable (GPIO_Porte
    
    
    _BASE、GPIO_PIN_4
    
    );GPIO_PIN_4引脚 GPIO_PIN_4引脚
    
    
    void InitADCSSI (){
    
    //必须启用 SSI0外设才能使用。
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);
    
    //为端口 D0、D1和 D3上的 SSI2功能配置引脚多路复用。
    GPIOPinConfigure (GPIO_PD3_SSI2CLK);
    //GPIOPinConfigure (GPIO_PD2_SSI2FSS);由 PORTE4 (InitPORTE)保留的函数
    GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);
    GPIOP1_SSIDAT0 (InitPORT_SSIP_3_SSIP_PIN_SS_CLK
    
    );GPIO_SSIP_SSIP_SSIP_CL0_SSIP_CLK (GPIO_SSIP_SSIP_SSIP_SSIP_SSIP_SSIP_CLK)
    
    
    5000000、16);
    
    SSIAdvModeSet (SSI2_base、SSI_ADV_MODE_LEGACWE);
    
    //启用 SSI0模块。
    SSIEnable (SSI2_base);
    
    //在
    (SSIDataGetNonBlocking (SSI2_base、&pu32DataRx[0]){}
    
    
    
    void InitDACSSI (void){
    
    //uint32_t pui32DataRx[3];
    
    SysCtl_Periptl (pinip_3)
    
    
    
    ;配置 GPIOQ_P3_GPIOQ_P3_GPIO1;配置 GPIO0_GPIOQ_GPIOQ_P3Q_GPIOQ_P3Q_P=PeripheralEnable
    GPIOPinConfigure (GPIO_PQ2_SSI3XDAT0);
    
    GPIOPINTypeSSI (GPIO_PORTQ_BASE、GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3);
    
    SSIConfigSetExpClk (SSI3_base、ui32SysClkFreq、SSI_FRF_MOTO_MODE_0、SSI_MODIM_MASTER_0、SSI_MODE_0、SSI_MODIM_0
    20000000、8);
    
    SSIEnable (SSI3_base);
    
    while (SSIDataGetNonBlocking (SSI3_base、&pui32DataRx[0]){}
    
    }
    
    //初始化 DAC
    void InitDAC (void){
    
    //命令初始化 DAC
    uint8_t 命令[2]= 0xint8
    
    ;uint8 = 0xint2;uint2 = 0xint2;uint2 = 0xint2;uint2 = 0xint2;uint2 = 0xintuint2 = 0xint2;uint2
    
    
    uintindex++){
    
    GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_2、0);
    
    SSIDataPut (SSI3_base、command[uintindex]);
    while (SSIBusy (SSI3_base)){
    }
    
    SSIDataPut (SSI3_base、first_data[uintindex]);
    while (SSIBusy (SSI3_base)){SYSC_INTS3_INTS_UST_INTSN
    
    
    
    
    
    
    
    
    
    
    
    
    
    (s2_INTS_INTS_INTS_INUSTRAM);while (ssn_SYSC_SC_INTS_INTS_INTS_INTS_INTS_INTS3_INTS_INTS_INTS_INTS_INST_INTS_INUSTRAM);}
    
    
    
    
    
    
    
    
    
    InitDACSSI ();
    
    InitDAC ();
    
    while (1){
    
    
    
    GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、0);
    
    
    //从 SPI 读取
    (ui32Index = 0;ui32Index < 2;ui32Index++){
    
    SSIDataPut (SSI2_base、0x00);ui32_base
    
    (SS32_base); 虚拟);
    
    adcRX[ui32Index]=虚拟;
    
    }
    
    while (SSIDataGetNonBlocking (SSI2_base、&pui32DataRx[0]){}
    
    GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、 GPIO_PIN_4);
    
    已转换的 GPIO 值=(adcRX[0]<<2)|(adcRX[1]>> 14);
    
    GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_2、0);
    
    //向 SPI
    SSIDataPut (SSI3_base、0x08)写入命令
    ;while SSIID_3_BASE
    
    (SSIID3)(while)
    
    
    
    
    
    
    、SSIID_SSIID3)(conv_SSI3)(while)(1 + SSIIDPus_3)(1 (1)(conv_3)(1)(1)(1 (1)(1)、1 (1)、1 (1 (1)(1)、2)
    
    
    

    如果有一些帮助、我将不胜感激。

    PS.:很抱歉,我这次在实验室没有闪存驱动器。

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

    [引用 user="Geovani Alves"]我非常感谢您的帮助

    难道这不会更好地被称为"更多的帮助?"   

    这里有两三个回答了您的需求-您对"某些"的使用不正确-甚至是"输出"(您已经收到了"一些帮助")-您是否不正确?

    我的建议是"减慢"输入正弦波、这证明了您的代码-总的来说-确实有效。

    未知(目前)是"如何提高代码效率"或(即使可以)、以便达到(新)列出的40KHz 目标...

    您不应该在工作中"根据函数按函数进行数学运算、以查看您是否寻求什么、"可行吗?"   您的帮助者也会感谢(部分)帮助...

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

    [引用 user="Geovani Alves"]因此,我降低了输入正弦波的频率,大约1kHz 的频率工作正常,输出没有失真。

    很好

    [引用 user="Geovani Alves"]芯片选择似乎正常。

    您需要"在故障点处理它。 话虽如此、我希望您的结论有所不同、尤其是考虑到您宣称的40kHz 正弦波采样目标。

    首先、您的三个示波器图显示您当前以~80kHz 的频率进行采样。 这将为您提供步进正弦响应。

    但是、这些芯片选择显示出问题。 如果您查看这些片选接通时间、则在12uS 或~83%的总周期中、它们的总周期约为10uS。 基本上、您会被最大化、考虑到您的采样没有等待、这并不奇怪。

    因此、您的"决定"只是您的采样步骤。 随着输入频率的增加、采样伪影会变得更糟。 当超过8或10kHz 时、我预计会出现一些混叠现象、您甚至可能会看到一个不错的正弦波、或者您可以看到您在第一次捕捉中显示的平坦部分。

    您需要花一点时间优化 I/O 例如、您可能会发现字节之间存在较大的间隙(您可以测量的内容)、因为您不会使用 FIFO。 您可以加快此速度、无论您是否需要将采样率提高5到10倍、我都不知道。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    µDMA 将 MCU 的 ADC 与 SPI 控制/订购 DAC 的 Δ Σ 实现相结合、可以实现(部分)"加速"(和程序/代码效率?)

    再一次-这种情况在"亲吻"轮毂上变得非常重要。 (即系统地构建一系列"简化/单独解决方案"-测试/验证每个解决方案-然后尝试"加入或最佳组合"这些解决方案。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [µDMA 用户="CB1_MOBIT]MCU 的 ADC 与 SPI 控制/订购 DAC 的 Δ Σ 实现结合使用是否可以实现(部分)"加速"(以及程序/代码效率?) [/报价]

    我认为是这样、我暗示了内部 A/D 标签。 我不确定 UDMA 是否可以在这种上下文中使用、但可能是脱离计时器、或在调节输出后显式触发。 最终可能会有更多的工作需要将其用于中断或轮询。 我认为我们对实际使用风险估算的了解不够。 不过、也可以考虑这一点。

    [引用 USER="CB1_MOBILE]]再会一次-这种情况在"kiss"轮毂上变得(非常)。 (即系统地构建一系列"简化/单独的解决方案"-测试/验证每个解决方案-然后尝试"加入或以最佳方式组合"这些解决方案。)[/引用]

    是的、至少对我来说、是否可以实现目标并不清楚。 这不是一个不大的吞吐量。

    Robert

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

    [引用 user="Robert Adsett72">对我来说、是的、但不清楚是否可以达到目标这不是一个不大的吞吐量。[/报价]

    已商定-但吞吐量取决于"几个功能"的执行时间-而由适当设计的"亲吻"方法提供的"隔离"(自然)应该供应商(似乎)首选的"一次性全部"方法更快地收集此类详细信息。   (因为他们(总是)抵制吻的处方-喜欢无限-不一致/偏离指令-(不令人难忘)、并且没有对通用/带盖的"!"的影响/认可