STM32CubeMX ADC多通道DMA(循环传输Circular,单次Normal)

Cube配置
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

代码

uint16_t AD_Value[20];
//main.c文件
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)AD_Value,20);

上面配置如果是word,则更改一下定义就好了,cube生成的代码会随着变:

uint32_t AD_Value[20];
//main.c文件
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)AD_Value,20);

分析一下函数原型

HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)

有网友就简单看到原型是uint32_t就认为必须是32位了,其实ad只有12位,数据定义成16位才是物尽其用。产生这个试验想法是基于std库用过一次就是16位的,另外uint16_t AD_Value[20]也可以换成二维数组uint16_t AD_Value[10][2],二者本质没什么区别,好处是通道更多了就只需要改变第二个下标就行了,再其他地方处理AD数据的时候也很方便。
采样的数据:

为了实现ADC多通道DMA滤波,需要进行以下步骤: 1. 使用STM32CubeMX配置ADCDMASTM32CubeMX,选择正确的芯片型号,打开“Pinout & Configuration”选项卡,然后配置ADCDMA的参数。在“ADC”选项卡,选择要使用的通道和采样时间,然后在“DMA”选项卡配置DMA通道和传输模式。 2. 设置ADC DMA模式 在代码,需要将ADC设置为DMA模式。这可以通过在HAL_ADC_Start_DMA函数设置相应的参数来实现。例如,以下代码将ADC设置为连续DMA模式: HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADCBuffer, ADC_BUFFER_SIZE); 3. 实现数据滤波 在ADC数据传输到缓冲区之后,可以对数据进行滤波处理。可以使用各种滤波算法,例如移动平均、值滤波等。以下是一个使用移动平均滤波的示例代码: #define N 10 uint32_t FilteredData[ADC_NUM_CHANNELS]; void FilterData(uint32_t* ADCData) { static uint32_t FilterBuffer[ADC_NUM_CHANNELS][N]; static uint32_t FilterIndex[ADC_NUM_CHANNELS] = {0}; uint32_t i, j; for(i=0; i<ADC_NUM_CHANNELS; i++) { FilterBuffer[i][FilterIndex[i]] = ADCData[i]; FilterIndex[i] = (FilterIndex[i]+1) % N; FilteredData[i] = 0; for(j=0; j<N; j++) { FilteredData[i] += FilterBuffer[i][j]; } FilteredData[i] /= N; } } 在此示例,FilterBuffer是一个二维数组,用于存储ADC数据。FilterIndex是一个数组,用于跟踪每个通道的滤波器缓冲区的位置。FilteredData是一个数组,用于存储滤波后的数据。 4. 处理滤波后的数据 滤波后的数据现在可以用于您的应用程序。可以将其发送到计算机或其他设备,或者用于控制硬件。以下是一个将滤波后的数据通过串口发送到计算机的示例代码: #define UART_TX_BUFFER_SIZE 256 uint8_t UARTTxBuffer[UART_TX_BUFFER_SIZE]; void SendData(void) { uint32_t i; uint32_t len = 0; for(i=0; i<ADC_NUM_CHANNELS; i++) { len += sprintf((char*)(UARTTxBuffer+len), "%d,", FilteredData[i]); } UARTTxBuffer[len-1] = '\n'; HAL_UART_Transmit(&huart1, UARTTxBuffer, len, 100); } 在此示例,使用sprintf函数将滤波后的数据转换为字符串,并将其存储在UARTTxBuffer。然后,使用HAL_UART_Transmit函数将数据发送到计算机。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值