【发布时间】: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