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功能,我还在学习中,以后再更。
若使用单次转换进行两个通道转换,串行单次转换两次即可。