一、概述
首先介绍一下stm32 adc模块的几个重要的特点:
- 12位分辨率
- 18通道(其中2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V))
- 转换范围:0~3.6V
- 转换速率1MHz(这里的转换速率指的是最大采样频率)
- ADC供电要求:2.4V到3.6V
-
ADC输入范围:VREF- ≤ VIN ≤ VREF+ (64脚以下的芯片,
Vref+是和VDDA连接在一起的
。需要注意的就是VDDA和VDD的压差必须小于300mV ,否则可能由于上电断电的非同时性,导致数据的丢失。然而这就有可能导致了ADC参考电压的非精确性。) - 规则通道转换期间有DMA请求产生
这里插一句:stm32各个电压的用途。
VDD – 单片机3.3V 电源正,VSS – 单片机3.3V 电源负,VDDA – 单片机A/D 转换器电源正,VSSA – 单片机A/D 转换器电源负。
注意这里由于STM32F103系列单片机的内部高速RC 振荡器(HSI)由VDDA、VSSA 供电,故即使不使用单片机自带的A/D 转换器,也必须保证VDDA、VSSA 的供电,否则STM32F103单片机不能正常启动。
二、具体操作步骤
(1)设置ADC时钟频率
回想一下我们之前的时钟树:
这里我们的ADCCLK使用的是APB2的时钟(通常等于系统时钟72Mhz),这里可以经过ADC prescaler 预分频器进行分频。这个预分频器在时钟配置寄存器(RCC_CF)15:14位。
(2)设置IO口为模拟输入
(3)ADC配置
主要有以下几个寄存器
1)ADC状态寄存器(ADC_SR)
这个寄存器是用来查看每一个AD转化工程的完成情况,其中最重要的就是转化结束位EOC。我们可以用它作为ADC中断的标志位。
2)ADC控制寄存器1、2(ADC_CR1、2)
这两个寄存器包含里几乎所有重要的设置:
3)ADC采样时间寄存器1(ADC_SMPR1、2)
SMPx[2:0]:选择通道x的采样时间 (Channel x Sample time selection)
4)ADC规则序列寄存器1(ADC_SQR1、2)
5)、ADC规则数据寄存器(ADC_DR)
三、STM32F10x系列芯片ADC通道和引脚对应关系