STM32F1 ADC实验(HAL库版)

ADC(Analog-to-Digital Converter)即模数转换器,输入模拟电压即可转换为数字量。

一、STM32的ADC

  STM32F1有三个ADC,分别是ADC1、ADC2、ADC3,根据STM32参考手册可知,ADC1和ADC2均有16个输入通道,ADC3有若干个输入通道(根据芯片类型不同有差异),还有有一个内部温度传感器通道和一个光敏传感器通道。分布在各个引脚上,可根据STM32 芯片手册查询。如ADC1 IN1 (通道1)在PA1上。

二、STM32 ADC的一些概念 (单次转换、连续转换、扫描模式)

  1、单次转换:一次转换结束后,需要手动开启才能进行下一次转换。

  2、连续转换:一次转换结束后继续下一次转换。

  3、扫描模式:对多通道的转换进行逐个转换。若此时开启单次转换模式,扫描完所有通道后需要手动启动下一次扫描转换;若此时开启连续转换模式,扫描完成后自动进入下一次扫描转换,所以扫描模式需要配合DMA才能读取数据。

 

三、ADC的配置(HAL库版)

  要使用ADC,必须先对其进行配置,HAL库提供了若干函数来对ADC进行配置。

  1、配置ADC时钟,这个基本没有什么修改的余地

RCC_PeriphCLKInitTypeDef ADC_CLKInit;
ADC_CLKInit.PeriphClockSelection=RCC_PERIPHCLK_ADC;            //ADC外设时钟
ADC_CLKInit.AdcClockSelection=RCC_ADCPCLK2_DIV6;            //分频因子6时钟为72M/6=12MHz
HAL_RCCEx_PeriphCLKConfig(&ADC_CLKInit);                    //设置ADC时钟

  2、配置ADC,使用到哪个ADC就配置哪个

__HAL_RCC_ADC1_CLK_ENABLE();            //使能ADC1时钟
ADC1_Handler.Instance=ADC1;
ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
ADC1_Handler.Init.ScanConvMode=DISABLE;                      //不扫描模式
ADC1_Handler.Init.ContinuousConvMode=DISABLE;                //不连续转换
ADC1_Handler.Init.NbrOfConversion=1;                         //一个规则通道转换 
ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发
HAL_ADC_Init(&ADC1_Handler);                                 //初始化 

  其中扫描模式和连续转换模式根据需求改,规则转换通道数NbrOfConversion 为你要使用的ADC转换通道数。

  3、自动校准ADC,调用即可

HAL_ADCEx_Calibration_Start(&ADC1_Handler);                     //校准ADC

  4、配置输入的I/O口

GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE();            //开启GPIOA时钟
GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_0;            //PA1和PA0
GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟输入
GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
HAL_GPIO_Init(GPIOA,&GPIO_Initure);

  5、配置通道之后开启ADC转换

ADC_ChannelConfTypeDef ADC1_ChanConf;
ADC1_ChanConf.Channel=ch;                                   //通道
ADC1_ChanConf.Rank=1;                                       //第1个序列,序列1  
ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_239CYCLES_5;
//采样时间 HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf); //通道配置 HAL_ADC_Start(&ADC1_Handler); //开启ADC

 

  • Channel是需要进行ADC转换的通道,其值为 ADC_CHANNEL_0~ADC_CHANNEL_16 或者 ADC_CHANNEL_TEMPSENSOR(内部温度传感器)或者 ADC_CHANNEL_VREFINT 光敏传感器
  • Rank的意思是:假如有多个通道需要转换,本通道将是第Rank个进行转换。因为例程中只有1个通道要转换,所以是第一个转换。

 

  6、HAL库提供了一个轮询转换和一个获取转换结果的函数

HAL_ADC_PollForConversion(&ADC1_Handler,10);                //轮询转换
 
HAL_ADC_GetValue(&ADC1_Handler);                //返回最近一次ADC1规则组的转换结果

 

三、应用

  若需要采用多通道扫描模式进行转换,需要用到DMA功能,我还在学习中,以后再更。

  若使用单次转换进行两个通道转换,串行单次转换两次即可。

  

posted @ 2018-05-20 21:44  sovagxa&静默  阅读(21769)  评论(0编辑  收藏  举报