STM32對HAL庫的ADC(多通道DMA)

 

多通道的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);
  }
View Code

因爲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值裝入了這個數組中,再把它們讀出來即可。

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