多通道的adc就是檢測多個通道的電壓值,用dma來檢測。
cubemx中設置如下。
Number of conversion 的個數就是該adc中要使用的通道數。在下面的rank中設置通道的采樣時間和通道名字。
使能adc的中斷。
在DMA設置中設置模式為循環模式,不然不設置的話只能用一次DMA。數據寬度為一個字節,不然后面開啟dma的adc時要用兩倍。
看程序。
先上代碼。

int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ uint32_t AD_DMA[2]; float a, b; HAL_ADCEx_Calibration_Start(&hadc1); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_ADC_Start_DMA(&hadc1, AD_DMA, 2); a = (float)AD_DMA[0]; b = (float)AD_DMA[1]; /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ printf("PA2電壓為 %.2fV\r\n", (a * 3.3) / 4096); // a除以4096 * 3.3 會更好理解 printf("PA3電壓為 %.2fV\r\n", (b * 3.3) / 4096); printf("\r\n"); HAL_Delay(1000); }
因為HAL庫中,DMA開啟ADC是通過這個函數定義的,HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)。看參數,即先定義一個裝載從DMA讀取的ad值,多少通道就設幾個,不然讀完所用通道之后還有多的地方裝載數據,會造成數據混亂不正確不匹配。
uint32_t AD_DMA[2];
接着要進行一個adc校准。
HAL_ADCEx_Calibration_Start(&hadc1);
函數作用為進行adc的自校准,消除每個電容上的誤差,用在adc_start之前。
接着我們開啟dma的adc模式。
HAL_ADC_Start_DMA(&hadc1, AD_DMA, 2);
最后一個參數意思是裝載的字節長度,一般是多少通道就設多少,在cubemx設置了word,如果是half word,則為兩倍。
最后就是利用dma把adc值裝入了這個數組中,再把它們讀出來即可。