STM32F3系列的ADC具有高性能与低功耗的特征,本文以STM30F301C8T6举例。
该芯片的ADC具有AHB从总线接口,允许快速数据处理;且ADC转换时间与AHB总线时钟频率无关,相互独立。也就是说,该系列的ADC可以拥有72MHz的时钟频率,12位精度在快速通道下可以达到0.19μs的转换时间,慢速通道也可以达到0.21μs。低精度下(如10位)转换时间仅需0.16μs。并且有自校准以及可编程采样时间等其他STM32系列ADC通有的功能。
时钟
STM32F301x6/8系列具有双时钟域结构,即意味着ADC时钟是从AHB总线独立出来的,所以ADC可以由两个可选择的时钟源输入:
a)ADC时钟可以是一个特定的时钟源,名为“ADCxy_CK(xy=12或34),与AHB时钟独立且异步。它可以配置在RCC中,以提供高达72MHz的频率(PLL输出)。要选择此方案,ADCx_CCR寄存器的位CKMODE[1:0]必须置0。该选项具有ADC时钟频率可以达到最大的优点,无论已选择AHB时钟是什么。ADC时钟最终可除以一下系数进行分频:1、2、4、6、8、12、16、32、64、128、256。
b)ADC时钟可从ADC总线接口的AHB时钟导出,除以一个可编程的系数(1、2或4)。在这种模式下,根据位CKMODE[1:0]可选择一个可编程的除法系数(1、2或4)。要选择此方案,ADCx_CCR寄存器的位CKMODE[1:0]必须与“00”不同。该选项具有绕过时钟域重新同步的优点。当ADC由计时器触发和应用程序要求ADC精确触发且无任何不确定性时非常有用。
电压校准
开始ADC操作前需要进行以下操作:
- 使能ADC内部电压校准器
- 启动校准或启用ADC之前,软件必须等待ADC电压调节器的启动时间(TADCVREG_STUB)。这个
时间必须通过软件实现。在最坏的工艺/温度/电源情况下TADCVREG_STUB等于10µs。
转换时间
转换开始和转换结束之间的时间是配置的采样时间加上取决于数据精度的逐次逼近时间分辨率:
外部触发和触发极性
如果EXTEN[1:0]控制位(对于规则转换)或JEXTEN[1:0]位(对于注入转换)与“0b00”不同,则外部事件能够触发所选极性的转换。当软件将位ADSTART置1,规则转换有效;当软件将位JADSTART置1,则注入转换选择有效。
注:外部中断线11触发为事件6—EXT6
代码
adc.h
#ifndef __ADC_H
#define __ADC_H
#include <stm32f30x.h>
#define ADC1_IN3_PORT GPIOA
#define ADC1_IN3_PIN GPIO_Pin_2
void Adc_Init(void);
#endif
adc.c
#include "adc.h"
#include "delay.h"
void Adc_Init(void)
{
/*define structure variables*/
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure