前言
本文将简单介绍配置cubemx进行adc的采样,本篇只简述多通道(dma)采集。
STM32CubeMX-ADC hal库 1 单通道采样(非dma模式)
一、cubemx配置
F1和F4是cubemx配置是有区别的。
STM32F1
首先打开adc的2个通道
这时候是无法开启扫描转换模式的
要先启用规则转换模式并且这里的数值填为2
总配置如下
还要打开DMA,dma的设置的data wideth为word,因为adc转化结果数据寄存器为32位。
不用开启adc的全局中断.
STM32F4
要按照步骤来哈,
2步骤不操作就没有3的配置。
4的dma开启以后才能选择5的位置,一定要把5的位置打开,不然adc只工作一次。
6你不配置的话他自动两个是一个 channel 口那就错了。
二、代码
1.开启adc采集dma转换
在开启之前要定义一个全局变量用于存储
uint32_t dma_adc_buffer[2];
主循环之前调用开启
HAL_ADC_Start_DMA(&hadc1,dma_adc_buffer,2);
2.显示数据
LCD_ShowNum(110,70,dma_adc_buffer[0],4,16);
LCD_ShowNum(110,170,dma_adc_buffer[1],4,16);
HAL_Delay(100);
三、平均值
由于读出来的数值比较跳动所以需要取出平均值
可以把dma存储的数组长度设置为2的整数倍
#define NUM_CHANNELS 2
#define NUM_SAMPLES_PER_CHANNEL 100
uint32_t dma_adc_buffer[NUM_CHANNELS*NUM_SAMPLES_PER_CHANNEL];
uint32_t dma_adc_buffer_av[NUM_CHANNELS];
两个数据就会在数组里面依次排列
也就是奇数项的是一个偶数项的另一个
然后我们要开启dma
HAL_ADC_Start_DMA(&hadc1,dma_adc_buffer,NUM_CHANNELS*NUM_SAMPLES_PER_CHANNEL);
现在通过遍历整个数组就能得到你要的那个值了
for (int channel = 0; channel < NUM_CHANNELS; channel++) {
uint32_t sum = 0;
for (int i = 0; i < NUM_SAMPLES_PER_CHANNEL; i++) {
sum += dma_adc_buffer[NUM_CHANNELS*i+channel];
}
dma_adc_buffer_av[channel] = sum / NUM_SAMPLES_PER_CHANNEL;
// 输出每个通道的平均值
}
你也可以通过遍历指针得到,这样会快一些
for (int channel = 0; channel < NUM_CHANNELS; channel++) {
uint32_t sum = 0;
for (int i = 0; i < NUM_SAMPLES_PER_CHANNEL; i++) {
uint32_t *channel_data= &dma_adc_buffer[NUM_CHANNELS*i+channel];
sum += *(channel_data);
}
dma_adc_buffer_av[channel] = sum / NUM_SAMPLES_PER_CHANNEL;
// 输出每个通道的平均值
}