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.

[参考译文] TM4C1294NCPDT:如何将以100KHz 从 ADC 采样的数据记录到我的 PC (已经尝试过 UART、但传输速率很低)?

Guru**** 2463330 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/655517/tm4c1294ncpdt-how-to-log-data-sampled-from-adc-at-100-khz-to-my-pc-already-tried-uart-but-transfer-rate-is-low

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

您好!

我必须使用 EK-TM4C1294XL 评估套件构建数据记录器。 我尝试了示例程序单端 ADC。 我有2个问题:

1) 如何确保以10KHz 的频率对数据进行采样?

2) 如何将采样数据发送到 PC?

我尝试使用 UART 以921600波特发送采样数据、但当我使用时间戳记录接收到的数据时、数据点之间的时间差为70ms。 如何 发送数据? 我是否需要以 USB 方式连接电路板、或者是否在 SD 卡中存储数据?

int
main (void)
{
//#if defined (target_is_TM4C129_RA0)|| \
//定义(target_IS_TM4C129_RA1)|| \
//定义(TARGET_IS_TM4C129_RA2)
uint32_t ui32SysClock;
//#endif

//
//该数组用于存储从 ADC FIFO 读取的数据。 它
//必须与正在使用的序列发生器的 FIFO 一样大。 此示例
//使用 FIFO 深度为1的序列3。 如果是另一个序列
//与更深的 FIFO 一起使用,则必须更改数组大小。
//
uint32_t pui32ADC0Value[1];

//
//使用 PLL 将时钟设置为以20MHz (200MHz/10)运行。 时间
//使用 ADC,您必须使用 PLL 或提供16 MHz 时钟
//源。
// TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值
板上的//晶体。
//
//#if defined (target_is_TM4C129_RA0)|| \
//定义(target_IS_TM4C129_RA1)|| \
//定义(TARGET_IS_TM4C129_RA2)
ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、20000000);
//#else
// SysCtlClockSet (SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_MAIN |
// SYSCTL_XTAL_16MHz);
//#endif

//
//设置用于显示消息的串行控制台。 这是
//仅用于此示例程序,ADC 操作不需要。
//
InitConsole();

//
//在控制台上显示设置。
//
UARTprintf ("ADC ->\n");
UARTprintf ("类型:单端\n");
UARTprintf ("示例:一个\n");
UARTprintf ("更新速率:250ms\n");
UARTprintf ("输入引脚:AIN0/PE3\n\n");

//
//必须启用 ADC0外设才能使用。
//
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);


// SysCtlADCSpeedSet (SYSCTL_ADCSPEED_1MSPS);
//
//对于此示例、ADC0与端口 E7上的 AIN0一起使用。
//您使用的实际端口和引脚可能有所不同,请参阅
//数据表以了解更多信息。 需要启用 GPIO 端口 E
//因此可以使用这些引脚。
// TODO:将其更改为您正在使用的 GPIO 端口。
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

//
//为这些引脚选择模拟 ADC 功能。
//请查阅数据表以查看每个引脚分配的函数。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);

//
//使用处理器信号触发器启用采样序列3。 序列3
//将在处理器发送信号启动时执行单次采样
//转换。 每个 ADC 模块有4个可编程序列、序列0
//至序列3。 此示例任意使用序列3。
//
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_PROCESSOR、0);

//
//在序列3上配置步骤0。 对中的通道0 (ADC_CTL_CH0)进行采样
//单端模式(默认)并配置中断标志
//(ADC_CTL_IE)将在采样完成时置1。 告诉 ADC 逻辑
//这是序列3上的最后一次转换(ADC_CTL_END)。 序列
// 3只有一个可编程步骤。 序列1和2有4个步骤、和
//序列0有8个可编程步骤。 因为我们只做一个
//使用序列3进行转换,我们将仅配置步骤0。 了解详情
//有关 ADC 序列和步骤的信息、请参考数据表。
//
ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH0 | ADC_CTL_IE |
ADC_CTL_END);

//
//由于采样序列3现在已配置,因此必须将其启用。
//
ADCSequenceEnable (ADC0_BASE、3);

//
//清除中断状态标志。 这样做是为了确保
//中断标志在我们进行采样之前被清除。
//
ADCIntClear (ADC0_BASE、3);

//
//永久采样 AIN0。 显示控制台上的值。
//
while (1)
{
//
//触发 ADC 转换。
//
ADCProcessorTrigger (ADC0_BASE、3);

//
//等待转换完成。
//
while (!ADCIntStatus (ADC0_BASE、3、false))
{
}

//
//清除 ADC 中断标志。
//
ADCIntClear (ADC0_BASE、3);

//
//读取 ADC 值。
//
ADCSequenceDataGet (ADC0_BASE、3、pui32ADC0Value);

//
//在控制台上显示 AIN0 (PE3)数字值。
//
UARTprintf ("AIN0 =%4D\n"、pui32ADC0Value[0]);

//
//此函数提供了生成恒定长度的方法
//延迟。 函数延迟(以周期为单位)= 3 *参数。 延迟
//任意地250ms。
//
//#if defined (target_is_TM4C129_RA0)|| \
//定义(target_IS_TM4C129_RA1)|| \
//定义(TARGET_IS_TM4C129_RA2)
// SysCtlDelay (ui32SysClock / 3000000);
//#else
SysCtlDelay (SysCtlClockGet ()/30000);
//#endif
}
}

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

    我还计算了节拍数。 对于 printf 操作、它需要大约2500个节拍、而对于 while 循环中的其余代码、它需要大约相同的数字。

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

    [引用 user="APOORV Garg"]1.) 如何确保以10KHz 的频率对数据进行采样?[/报价]

    在用户手册中读出触发 A/D 的定时器

    [报价用户="APOORV Garg"]我尝试使用 UART 以921600波特率发送采样数据,[/quot]

    在包络估算的后面、这是您应该从通信开始的基本计算

    921600波特率/10 = 92160 CPS

    92160 CPS/每样本12个字符=每秒7680个样本

    这是发送采样信息的绝对最大值。

    [引用 user="APOORV Garg"]UARTprintf ("AIN0 =%4D\n"、pui32ADC0Value[0]);

    printf 系列函数运行缓慢(当发生问题时)

    [引用 user="APOORV Garg"]///此函数提供了生成恒定长度//延迟的方法。 函数延迟(以周期为单位)= 3 *参数。 延迟//任意250ms。 //[/引号]

    这与您宣称的目标相矛盾。

    [引用用户="APOORV Garg"]/#if defined (target_is_TM4C129_RA0)||// defineed (target_is_TM4C129_RA1)||// defineed (target_is_TM4C129_RA2)// SysCtlDelay (ui32C129_RA1)||// define/ SysClocktl (#tl)//(SysClocktl)/#300tl (e/(SysClocktl)/#eTxtf)//(eTl)

    正如手动 SysCtlClockGet 中所述、它不适用于'129。

    Robert

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

    *** “喜欢” ***

    海报似乎(尚未)已认识到(任何)试图显示此类数据-显然是与数据采集率"同步"(通过海报注明为100KHz)-远远超过人眼处理和识别的能力!    (因此毫无意义)

    重复-代码示例"推送 UART"(作为快速/简单的显示介质)-但(始终)无法充分警告(往往是破坏性)由 UART 施加的延迟!     

    在以下两种情况之间是否没有明显的"断开":

    • 需要和/或希望查看此类"已处理值"
    • 需要/希望在(部分)"高速!"下执行此类"处理"

    同样、太多的客户端用户"错过了"这种情况。    应该注意的是、"显示更新速度"超出了一定的范围-显示变得不可读。    (请注意即将到来的"冬奥会"(来自首尔)、其中"十秒"屏幕显示"飞逝"(仅值得注意)-建议"十"屏幕字符"更新/秒"为"最高(对大多数人来说最舒适)观看率"。   (以更高的速率扫描显示屏-问题是"屏幕字符更新速率"-它在(大多数)观测器的可识别和/或舒适区域内...)

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

    您好!
    因此、即使我以100KHz 的频率对数据进行采样、我也可以如何采集数据(100kHz 时)、以便我可以实际利用收集的数据。
    显然、如果我们希望以如此高的速度收集数据、UART 不是一个选项。

    这可以通过使用 LWIP 堆栈的以太网(UDP)实现吗?


    此致、
    奥 poorv