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);
}

 

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