STM32CubeIDE ADC通过DMA获取方法

目录

一、MX配置

二、 生成的代码

三、 用户代码

方法1 连续采集100次

方法2 不间断采集


一、MX配置

注意使能持续转换模式 

DMA配置:

二、 生成的代码

1. ADC初始化

2. 底层初始化

三、 用户代码

方法1 连续采集100次

uint16_t ADC_Value[100],ad1;
float adv;

//开启转换
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Value, 100);

HAL_Delay(1);//需要一定的延迟

//计算
ad1 = 0;
for(i=0;i<100;i++)
	{
	  ad1=ADC_Value[i];
	}
adv = (float)(ad1 / 100) / 4096 * 3.3;//获取100次得到的值求平均

//打印ADC值
printf("adcValue= %f V",adv);

方法2 不间断采集

  在方法1中,ADC采完100次之后不会继续循环采集。如果需要不断得获取新的数值,则需要重新开启转换。

  在ADC的DMA设置内,DMA Request  Settings中,Mode更改为Circular,则DMA就会不断的将新的值存在数组ADC_Value中,写到末尾则从头开始写。注意,如果开启了多个通道,则每个通道会按照顺序依次存在数组中,例如开启通道1和通道2,则通道1会存在偶数索引([0],[2],...),通道2会存在奇数索引的数组内([1],[3],...),如果数组开辟的空间为奇数个,则下次会通道2先存在偶数,如此循环往复,以此类推。

  本方法2目的是要发挥ADC的转换速度极限,即不消耗代码延迟让ADC一直工作。(释放CPU可以做其他任务)

前方高能

修改DMA配置:

Mode 改为Circular, Increment Address 的√去掉。

代码如下:

uint16_t ADC_Value[100],ad1;
float adv;

//开启
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Value, 100);//本次其实只用到了数组第一位

//回调函数,每次DMA转换完成就会被调用一次
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
  ad1=ADC_Value[0];
  adv = (float)ad1 / 4096 * 3.3;
  printf("adcV= %f ",adv);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章