ADC多通道采集(阻塞模式、ADC_DMA模式)

  • ADC多通道采集(阻塞模式)
  • ADC多通道采集(DMA模式)
  • ADC多通道采集(阻塞模式)

    1、时钟源配置

    2、配置RCC时钟(选择第三个选项 Crystal/Ceramic Resonator 晶体/陶瓷谐振器 )

    3、配置一个LED灯,在程序编写中让它闪烁代表程序没有死机。

    4、设置调试模式,我们选择SW

    5、设置串口,因为我们的程序采集到了adc的数值之后会发送到串口调试助手上,证明ADC采集是否成功。选择异步模式、波特率是默认的115200.其他配置也是默认的

    6、配置ADC。这里我选择的两个通到采集,分别是PA0、PA1.主要是配制成:扫描模式、连续转换模式、间断模式、

    设置为2个通道
    采用软件触发方式启动采集
    2个通道各自的参数设置

    7、优先级设置高一点,怕的中断其他干扰
    下面是主要的代码 。

    // 串口重定向和ADC采集的代码
    int fputc(int ch, FILE *f)        //    串口重定向
     {	 
    	 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
       return ch;
     }
    uint16_t Get_adc()
    {
        //开启ADC1
      HAL_ADC_Start(&hadc1);
        //等待ADC转换完成,超时为100ms
        HAL_ADC_PollForConversion(&hadc1,100);
        //判断ADC是否转换成功
        if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)){
             //读取值
           return HAL_ADC_GetValue(&hadc1);
        }
        return 0;
    }
    
    

    下面是while循环的代码

            HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
    		HAL_Delay(1000);
    		for(uint8_t i=0;i<2;i++)
    		{	
    			ADC_Value[i]=Get_adc();//分别存放通道1、2的ADC值
    		}
    		for(uint8_t i=0;i<2;i++)
    		{	
    			printf("ADC通道%d,:%.4f V\r\n",i,(ADC_Value[i]*3.3/4096));
    		}
    

    ADC多通道采集(DMA模式)

    配置基本上与阻塞模式的相同,除了ADC的设置外。


    DMA配置

    mode:模式

    Normal:正常模式,当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次

    Circular: 循环模式,传输完成后又重新开始继续传输,不断循环永不停止

    data width:数据宽度

    byte:字节,通用8位,与u8相同

    word:字长,与硬件的位数相同,STM32是32位,所以对应是u32

    Half Word:半个字长,所以对应是u16

    Memory打钩表示存储ADC值的内存地址(数组)会自增

    1、我们在设置了DMA传输数据,就要取消ADC转换完成中断。

    2、代码的思想。是在while中调用启动函数,待ADC采集及DMA传输完成之后。我们在DMA传输完成中断服务函数中把采集到的职打印到串口上。

    int fputc(int ch, FILE *f)    //     串口重定向
     {	 
    	 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
       return ch;
     }
    #define ADC_MAX_NUM 2 
     
    uint16_t ADC_Values[ADC_MAX_NUM]={0};
     
    //启动函数,需要在main中调用一次
    void ADC_DMA_caiji()
    {
        
        //启动DMA
      HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Values,ADC_MAX_NUM);
        
    }
    void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)//DMA采集完成中断服务函数
    {
    	printf("烟雾%d\r\n",ADC_Values[0]);
    	printf("光电%d\r\n",ADC_Values[1]);
    	
    	HAL_ADC_Stop_DMA(&hadc1);//关闭DMA的ADC采集
    }
    

    下面是在while中的代码

    		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
    		ADC_DMA_caiji();
    		HAL_Delay(2000);//采集速度太快,加了2s的延时。
    

    2、成果展示

    写的不好,请多多见谅。有问题的可以联系我修改。

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 ADC多通道采集

    发表回复