STM32:HAL多通道ADC数据采集

1、配置ADC,设置5个通道采集

2、使能DMA设置为循环模式

 生成工程后编写函数

1、校准ADC,开启DMA接收,在main函数初始化部分调用

#define ADC_MAX_NUM  5
#define BTN_BUFF_LEN 100
static uint16_t dma_adc_data[BTN_BUFF_LEN * ADC_MAX_NUM];
复制代码
 1 /**
 2  * @brief 校准adc,开启DMA接收
 3  *
 4  */
 5 void Adc_Init(void)
 6 {
 7     // 校准
 8     HAL_ADCEx_Calibration_Start(&hadc1);
 9     HAL_ADC_Start_DMA(&hadc1, (uint32_t *)dma_adc_data, BTN_BUFF_LEN * ADC_MAX_NUM);
10 
11 }
复制代码

/**DMA采集的数据存放buff,采集5个通道,每个通道采集BTN_BUFF_LEN次
* dma_adc_data数据存放方式:HAL_ADC_Start_DMA(&hadc1, (uint32_t *)dma_adc_data, BTN_BUFF_LEN * ADC_MAX_NUM);
* 数据采集u32类型,dma_adc_data为u16类型,
* 第1个u32:通道1和通道2
* 第2个u32:通道3和通道4
* 第3个u32:通道5和通道1
* 第4个u32:通道2和通道3
* 第5个u32:通道4和通道5
*/

dma_adc_data中,第0、5、10、15...个数据为第1通道数据,可求取平均数滤波获取当前ADC值,经测试,无通道间数据干扰的问题

复制代码
/**DMA采集完成标志 */
uint8_t DMA_RECEIVE_OVER = 0;
/**获取的数据存放最大值和最小值 */
static uint16_t adc_max, adc_min;
/**数据累加 */
static uint32_t adc_add;
uint16_t ADC_Values[ADC_MAX_NUM] = {0};
/**
 * @brief Get the Adc Value object 处理原始数据,获取5个通道的数据
 */
static void Get_Adc_Value(void)
{
    if (DMA_RECEIVE_OVER == 1) // DMA数据采集完处理数据
    {
        DMA_RECEIVE_OVER = 0;

        for (uint8_t adc_channel = 0; adc_channel < ADC_MAX_NUM; adc_channel++)
        {
            adc_max = 0;
            adc_add = 0;
            adc_min = 0xffff;
            for (uint16_t i = 0; i < BTN_BUFF_LEN; i++)
            {
                adc_add += dma_adc_data[ADC_MAX_NUM * i + adc_channel];
                adc_max = adc_max > dma_adc_data[ADC_MAX_NUM * i + adc_channel] ? adc_max : dma_adc_data[ADC_MAX_NUM * i + adc_channel];
                adc_min = adc_min < dma_adc_data[ADC_MAX_NUM * i + adc_channel] ? adc_min : dma_adc_data[ADC_MAX_NUM * i + adc_channel];
            }
            ADC_Values[adc_channel] = (adc_add - adc_max - adc_min) / (BTN_BUFF_LEN - 2);
        }
        
    }
}

/**
 * @brief DMA采集完成中断服务函数
 *
 * @param hadc ADC句柄
 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
    // 采集完成标志位置1
    DMA_RECEIVE_OVER = 1;
}
复制代码

 

posted @   易安yan  阅读(1910)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示