- 硬件:STM32F103VCT6
- 开发工具:Keil uVision4
- 下载调试工具:ARM仿真器
网上资料很多,这里做一个详细的整合。(也不是很详细,但很通俗)。
所用的芯片内嵌3个12位的模拟/数字转换器(ADC),每个ADC共用多达16个外部通道,2个内部通道。
3个:代表ADC1、ADC2、ADC3(下图是芯片固件库的截图)
12位:也叫ADC分辨率、采样精度。先来看看二进制的12位可表示0-4095个数,也就是说转换器通过采集转换所得到的最大值是4095,如:“111111111111”=4095,那么我们怎么通过转换器转换出来的值得到实际的电压值呢?如果我们要转换的电压范围是0v-3.3v的话,转换器就会把0v-3.3v平均分成4096份。设转换器所得到的值为x,所求电压值为y。
那么就有:
16个外部通道:简单的说就是芯片上有16个引脚是可以接到模拟电压上进行电压值检测的。16个通道不是独立的分配给3个转换器(ADC1、ADC2、ADC3)使用,有些通道是被多个转换器共用的。首先看看16个通道在固件库的宏定义(写代码要看的):
到这里大家可能会有疑问,每个通道到底对应哪个引脚呢?下面先给出部分引脚图:
16个通道的引脚都在上面的图中,拿其中的一个进行说明:
ADC123_IN10:字母“ADC”不用多说,“123”代表它被3个(ADC1、ADC2、ADC3)转换器共用的引脚,“10”对应刚才那张宏定义图里面的ADC_Channel_10,这样就能找到每个通道对应的引脚了。
2个内部通道:一个是内部温度传感器,一个是内部参考电压。
在某个项目中要用到芯片里面的AD转换器,那么要怎么写应用代码?(以下是代码讲解)
芯片固件的库函数为我们提供了很多封装好的函数,只要运用它提供的函数接口就可以了,宏观上来讲就搞懂两个事情就行了:
- 初始化(设置用的哪个引脚、单通道、还是多通道同时转换、是否使用DMA等配置)?
- 怎么让转换器进行一次数据获取?
以下分别讲述三种不同方式(单通道、多通道、基于DMA的多通道采集)的ADC应用实例:
/*单通道的ADC采集*/
void Adc_Config(void)
{
/*定义两个初始化要用的结构体,下面给每个结构体成员赋值*/
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/*
使能GPIOA和ADC1通道时钟
注意:除了RCC_APB2PeriphClockCmd还有RCC_APB1PeriphClockCmd&#