微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 UART 流式传输 ADC 数据

如何解决通过 UART 流式传输 ADC 数据

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

我将 ADC 与 DMA 结合使用。采样率约为 6kHz,用 100 个转换值填充缓冲区需要大约 17 毫秒。

之后,我想通过波特率 115200 的 UART 发送这些值。由于 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;

    
}

toggled pins

terminal data

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

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

解决方法

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

要多次执行此操作而不会出现数据间断,您需要同时在 ADC 和 UART 上使用 DMA。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。