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值装入了这个数组中,再把它们读出来即可。

posted @ 2019-12-13 19:47  无乐不作丶  阅读(18081)  评论(0编辑  收藏  举报