1. 程式人生 > >stm32CubeMx 實現單通道ADC DMA采集

stm32CubeMx 實現單通道ADC DMA采集

adc gen 工具 alt hal circular 傳輸 簡介 image

今天要做的是ADC的實驗

平臺 : STM32F429

開發工具:STM32CubeMx 版本號 5.0.0

實驗目的:實現ADC1 13通道 DMA采集

一 :簡介

  首先,我們來看一下STM32F44XX參考手冊裏關於該芯片的ADC功能介紹

  技術分享圖片

技術分享圖片

二:STM32CubeMx 配置

技術分享圖片

數據對齊方式 為 右對齊

技術分享圖片

使能 連續轉換模式,DMA連續請求

技術分享圖片

設置采樣次數 為 3個周期

技術分享圖片

配置 DMA

技術分享圖片

Mode設置為Circular模式,數據寬度設置為Half Word 2個字節

設置好之後,點擊GENERATE CODE 生成代碼

定義變量

__IO uint16_t ADC_ConvertedValue[20];
__IO float ADC_Volt;

啟動DMA數據傳輸

HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_ConvertedValue[0], 20);

讀取ADC數據

unsigned int i = 0, ADC_Value = 0;
for(i = 0; i < 20; ++i)
{
  ADC_Value += ADC_ConvertedValue[i];
}
ADC_Value = ADC_Value / 20;

printf("ADC Value %d\r\n",ADC_Value);
printf("vol %f\r\n", ADC_Value * 3.3 / 4096);

三 :實驗結果

串口輸出結果

技術分享圖片

四: 實驗中遇到的問題

  1

技術分享圖片

最後一個參數一開始的時候寫1,程序就出現了阻塞的現象。我分析可能是因為DMA選擇的是Circular模式,會一直產生中斷,從而使得CPU都被中斷搶占了,因此將數據傳輸長度改為了20,每次對20個數據進行求均值計算,然後測試沒有問題。

  2 關於采樣周期

采樣周期 是否是越大越精準呢? 我把采樣周期改大了之後,再進行測試,實驗有待驗證

stm32CubeMx 實現單通道ADC DMA采集