2021年11月5日星期五

[STM32] ADC 轉換器 - 使用 DMA 多通道模式

 

STM32 ADC


緣起


針對前一篇的 Polling 多通道輪詢模式 方式做個簡單的比較。


基本設定


這次使用 NUCLEO-F401RE 開發版測試,執行 STM32CubeIDE 後直接進入 ADC1 設定項目,選擇其中 3 個 ADC Input 。

IN0    ->    PA0
IN1    ->    PA1
IN4    ->    PA4
STM32 ADC


DMA Settings 的標籤設定


先點取 Add ,選擇 ADC1

DMA Request Settings  的 Mode 選擇 Circular  ,連續DMA請求

STM32 ADC



Parameter Settings 標籤


Resoltion 維持 12 Bits 解析能力,也就是 0 ~ 4095 範圍。

Scan Conversion Mode 設定 Enabled 

Continuous Conversion Mode 設定 Enabled

DMA  Continuous Requests   設定  Enabled

Number Of Conversion 選擇 3 ,表示有 3 組ADC Iinput

Rank 要各自選擇 Channel

Sampling Time    這裡建議初步先設定最大值 480 Cycles

其他設定項目維持 Default 值。
STM32 ADC


儲存後 ,由 STM32CubeIDE 產生程式碼。


程式碼


打開 main.c

首先建立 2 個 Value


uint8_t x;
uint16_t ADCArray[3];

在 While 主迴圈之前啟動 ADC DMA , 最後的參數是指請求 DMA 時的資料筆數。目前設 3 個通道及陣列就直接設定 3 。這裡可以按照 3 的倍數擴大取得資料筆數,不過這裡先簡單使用。

if(HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADCArray,3) != HAL_OK)
{
       printf("ADC initialization error!\r\n");
}

while 主迴圈

  while (1)
  {
    /* USER CODE END WHILE */
         HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
         printf("idx[%d] value[%d]\r\n",x,ADCArray[x] );
         x++;
         if(x >=3)
         {
               x = 0;
               printf("\r\n");
         }
         HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
3 組 ADC Input 的資料會自動儲存到記憶體也就是陣列裡。

好了,這樣就完成了。

簡易的測試方法是將剛剛設定的 ADC 腳位 ,分別接入 3.3V 。看看是否 print 的 值是否是 4095 。接地是否為 0 
在這裡陣列裡的資料會依序 Channel 0 ,Channel 1 , Channel 4 分別填入,這個就比 Polling 的方式方便了。
原始碼連結


相關連結

ADC 轉換器 - 使用 Polling 多通道輪詢模式

0 comments:

發佈留言