zoukankan      html  css  js  c++  java
  • 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
    ", (a * 3.3) / 4096); // a除以4096 * 3.3 会更好理解
            printf("PA3电压为 %.2fV
    ", (b * 3.3) / 4096);
            printf("
    ");
            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值装入了这个数组中,再把它们读出来即可。

  • 相关阅读:
    从零入门 Serverless | Knative 带来的极致 Serverless 体验
    SpringCloud 应用在 Kubernetes 上的最佳实践 — 高可用(熔断)
    阿里巴巴成立云原生技术委员会,云原生升级为阿里技术新战略
    解构云原生,从概念到落地:阿里云、声网、微博、好未来、CNCF 的专家们怎么看?
    人工智能训练云燧T10
    云计算应用场景分析
    昇腾全栈解决方案
    自动驾驶解决方案架构
    自动驾驶开发云平台业务分析
    ResNet-50模型图像分类示例
  • 原文地址:https://www.cnblogs.com/zjx123/p/11990955.html
Copyright © 2011-2022 走看看