【问题标题】:Streaming ADC data through UART通过 UART 流式传输 ADC 数据
【发布时间】:2021-08-07 01:01:46
【问题描述】:

我正在尝试通过 STM32 核板上的 UART 从 8 位 ADC 流式传输采样值。

我使用带有 DMA 的 ADC。采样率大约是 6kHz,用 100 个转换值填充缓冲区大约需要 17 毫秒。

之后,我想通过 UART 以 115200 的波特率发送这些值。由于 ADC 转换值是 HALF_WORD,对于 100 个转换值,我必须发送 1600 位。这意味着我可以在不覆盖数据的情况下将它们发送 14 毫秒。

这是我在代码中的尝试:

/* Private variables*/

#define ADC_BUF_LEN 100

uint16_t adc_buf[ADC_BUF_LEN];


uint8_t flag = 0;

 /* USER CODE BEGIN 2 */

HAL_ADC_Start_DMA(&hadc, (uint32_t*)adc_buf, ADC_BUF_LEN);

HAL_TIM_Base_Start(&htim2);

while (1)

  {
    
    if (flag==1)

        {

        HAL_UART_Transmit(&huart4,(uint8_t*)adc_buf,100,1);

        flag = 0;

        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_9);

        }

        else

        {}

  }

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) 
{
  
    HAL_GPIO_TogglePin(GPIOA,LED_GREEN_Pin);

    
  flag = 1;

    
}

我已将带有传输数据的图片附加到终端。 对于输入,ADC 满足 1 kHz 正弦波 2 V p-pk。 我可以用肉眼看到我的系统无法正常工作。

如果我绘制该数据,它不会是正弦波。
该项目用于 EMG 信号处理:我需要对信号进行采样,然后在 Python 中进行处理。

【问题讨论】:

  • 您的时间计算不正确。以 115200 波特和 8N1 传输 200 字节至少需要 17.36 毫秒。而数据每 16.67 毫秒生成一次。你的计划跟不上。似乎您忽略了构成每个传输字节的起始位和停止位。
  • 我将 UART 加速到 460800 位/秒,但仍然无法正常工作。还有更多。

标签: signal-processing stm32 uart dma adc


【解决方案1】:

HAL_UART_TransmitTimeout参数设置为1是不正确的。您已经计算出需要 14 毫秒!这意味着该函数将在仅传输一小部分数据后放弃并返回。

要在没有数据间隙的情况下多次执行此操作,您需要同时在 ADC 和 UART 上使用 DMA。

启用 ADC DMA 的半传输中断,或轮询半传输标志。当您收到它时,在缓冲区的前半部分以 DMA 模式启动 UART。它应该在 7 毫秒内完成,即 ADC DMA 开始覆盖其包含的数据之前的 1.5 毫秒。当您获得 ADC DMA 完成中断或标志时,在缓冲区的后半部分启动 UART DMA。

另外,大多数 STM32 上的 DMA 也支持“双缓冲区”模式,其工作方式或多或少相同,但您只使用完整的中断,并且您有两个单独的数据指针,而不是计算半个缓冲区的偏移量.

【讨论】:

  • 是的,谢谢,我改了,但还是不行。我会尝试半转移。我认为问题在于我使用相同的缓冲区来存储 ADC 样本并通过 UART 传输。
猜你喜欢
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多