简单了解
ADC(Analog to Digital Converter),顾明思义,就是模数转换器,模拟信号转换为数字信号。
STM32一般有两个ADC,每个ADC又有多个通道,每个通道与GPIO一一对应。
ADC转换有多种模式选择,单次,连续,扫描,间断等。
转换后的数字,按照右对齐或者左对齐,存储在16位寄存器中。(一般是右对齐,左对齐主要针对一些精度不够,比如只有8位,那么数据就不需要转换,忽略8个位即可)
- 通道对应关系:
配置过程
基本所有的外设都要经过下面的过程:
配置时钟源
任何的外设都需要一个时钟源,就像人的心脏一样,没有时钟源,或者配置错误,都会导致外设异常。
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
该函数就是配置ADC的时钟。参数是分频系数,这里是指6分频。
这里的分频是基于APB2所说的,因为ADC挂载在APB2上。APB2的时钟频率为72M(STM32F1)。
所以ADC的频率为:72M/6=12M
配置的时候需要注意,ADC的频率不能大于14M
初始化
对ADC进行基础配置,主要有下面几个项:
typedef struct
{
uint32_t ADC_Mode; // ADC 工作模式选择
FunctionalState ADC_ScanConvMode; /* ADC 扫描(多通道) 或者单次
(单通道) 模式选择 */
FunctionalState ADC_ContinuousConvMode; // ADC 单次转换或者连续
转换选择
uint32_t ADC_ExternalTrigConv; // ADC 转换触发信号选择
uint32_t ADC_DataAlign; // ADC 数据寄存器对齐格式
uint8_t ADC_NbrOfChannel; // ADC 采集通道数
} ADC_InitTypeDef;
ADC_Init(ADC1, &ADC_InitStructure);//ADC 初始化
使能
开启ADC功能(使能并不等于开启转换)
ADC_Cmd(ADC1, ENABLE);//开启 AD 转换器
执行复位校准的方法是:
ADC_ResetCalibration(ADC1);
执行 ADC 校准的方法是:
ADC_StartCalibration(ADC1); //开始指定 ADC1 的校准状态
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
开启转换
ADC有单次和连续转换,还有多种触发源。这里我选择的是单次转换以及软件触发。
- ADC转换很快。
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1,ADC_SampleTime_239Cycles5 );
该函数是配置转换周期的,也就是一次转换需要多少个周期。时钟源我们已经说过,时间也就是1/f * 239.5,就拿时钟12M算
1/12us*239.5 ~= 20us,对于实时要求不高的完全可以接受。实时要求高的就可以使用DMA进行多次转换。
1. 配置ADC通道
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel,
uint8_t Rank, uint8_t ADC_SampleTime);
2. 配置转换周期
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );
3. 开启转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
4. 等待转换完成
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
5. 获取转换结果
ADC_GetConversionValue(ADC1);(获取后转换完成标志会自动被清掉)
6. 计算实际电压值
voltage = (float)adcx*(3.3/4096);
寄存器
我搜索了不少博客,好多ADC详解文章真的是详解,把手册上的寄存器全部搬上去了,
巴拉巴拉半天,最后还是不清楚ADC怎么使用的,所以这里就不着重记录ADC的寄存器了,要想看,手册多的很。就捡几个重要的说下吧,以及对应操作的函数。
ADC_CR
控制寄存器,这个寄存器主要配置:
- 扫描模式