STM32 ADC --- DMA采样

STM32 ADC --- DMA采样

文章目录

cubeMX配置

上面红框中选择配置为连续转换模式 ,即通过HAL_ADC_Start_DMA()函数启动,便可以以一直进行转换,只需要从指定的数组中读取数据即可。如果配置为DISABLE则需要在每次需要转换的时候通过HAL_ADC_Start_DMA()函数启动。另外需要注意的一点时当使用连续转换模式时,下面的DMA配置中必须配置为循环模式 ,否则可能无法正确获取到数据。

重要 :cubeMX配置使用DMA时的一个问题

如果先配置过不使用DMA的ADC工程,再重新配置使用DMA时,生成代码中ADC初始化在DMA初始化之前,这样可能导致ADC+DMA无法正常工作,因而无法正确获取到数据。

正确的初始化顺序应该是MX_DMA_Init()初始化应该放在MX_ADC1_Init()初始化的前面。这样ADC+DMA才能正常工作。

cubeMX配置工具中可以根据上图所示调整每个初始化函数的顺序。

代码编写

基于上面ADC配置为连续转换模式和DMA配置为循环模式

一维数组接收数据

c 复制代码
#define CHANNEL_NUM 2
uint16_t adc_converted_value[CHANNEL_NUM]; //元素0表示1通道数据,元素1表示2通道数据

//启动ADC采样
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_converted_value, CHANNEL_NUM);

//TODO:数据处理
// voltage = adc_converted_value[0] / 4096.0f * 3.3 * factor1;
// voltage = adc_converted_value[1] / 4096.0f * 3.3 * factor2;

二维数组接收数据

c 复制代码
#define SAMPLE_NUM 10
#define CHANNEL_NUM 2
// 行表示数据组,0列的10个数据表示通道1数据,1列的10个数据表示通道2的数据
/*
| 00 | 01 |
| 10 | 11 |
| 20 | 21 |
    ...
| 90 | 91 |
  ch1  ch2
*/
uint16_t adc_converted_value[SAMPLE_NUM][CHANNEL_NUM]; 

//启动ADC采样
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_converted_value, SAMPLE_NUM * CHANNEL_NUM);

//TODO:数据处理
	uint16_t sum1 = 0, sum2 = 0;
    for(uint16_t i = 0; i < SAMPLE_NUM; ++i) {
      sum1+= adc_converted_value[i][0];
      sum2+= adc_converted_value[i][1];
    }
    sum1 /= SAMPLE_NUM;
    sum2 /= SAMPLE_NUM;
    voltage = bsp_adcGetChargerVoltage(sum1);
    current = bsp_adcGetChargeCurrent(sum2);
相关推荐
Lumos6fly4 小时前
《嵌入式通讯协议栈实战》 5 AT24C02与OLED
stm32·单片机
平凡的小蚂蚁13 小时前
Exynos4412-POP-7inLCD裸机开发完整教程(STM32 库风格)
驱动开发·stm32·单片机·嵌入式硬件·嵌入式·硬件工程
破晓单片机13 小时前
096、STM32项目分享开源:蓝牙智能手环
stm32·单片机·嵌入式硬件·开源
振南的单片机世界16 小时前
1MΩ内阻+10pF寄生电容=信号“低通谋杀”
arm开发·stm32·单片机·嵌入式硬件
十月的皮皮17 小时前
STM32从零到量产开发:四路继电器工业控制模块开发 -上位机主窗口设计说明
c语言·stm32·单片机·stm32cubemx
wuyk55517 小时前
第1章:无刷电机核心原理与运行机制
c语言·开发语言·stm32·单片机·嵌入式硬件·机器学习
WWJA王文举17 小时前
HAL库、标准库、LL库和寄存器开发有什么区别?STM32四种开发方式一次讲透
stm32·单片机·嵌入式硬件
胡八一1 天前
虚拟串口com0com安装教程
驱动开发·stm32·单片机
姓刘的哦1 天前
STM32内置Flash
stm32
大爱编程♡1 天前
STM32-USART串口
stm32·单片机·嵌入式硬件