緣起
針對前一篇的 Polling 多通道輪詢模式 方式做個簡單的比較。
基本設定
這次使用 NUCLEO-F401RE 開發版測試,執行 STM32CubeIDE 後直接進入 ADC1 設定項目,選擇其中 3 個 ADC Input 。
IN0 -> PA0
IN1 -> PA1
IN4 -> PA4
DMA Settings 的標籤設定
先點取 Add ,選擇 ADC1
DMA Request Settings 的 Mode 選擇 Circular ,連續DMA請求
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 值。
儲存後 ,由 STM32CubeIDE 產生程式碼。
程式碼
打開 main.c
首先建立 2 個 Value
uint8_t x;
uint16_t ADCArray[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 的方式方便了。
原始碼連結
0 comments:
發佈留言