ADC基本原理—M3
STM32 ADC
寄存器和库函数配置
1.1 ADC:
Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。
典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。
1.2 STM32F10x ADC特点:
· 12位逐次逼近型的模拟数字转换器;
· 最多带3个ADC控制器,可以单独使用,也可以使用双重模式提高采样率;
· 最多支持23个通道,可最多测量21个外部和2个内部信号源;
· 支持单次和连续转换模式;
· 转换结束,注入转换结束,和发生模拟看门狗事件时产生中断;
· 通道0到通道n的自动扫描模式;
· 自动校准;
· 采样间隔可以按通道编程;
· 规则通道和注入通道均有外部触发选项;
· 转换结果支持左对齐或右对齐方式存储在16位数据寄存器;
· ADC转换时间:最大转换速率 1us(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到);
· ADC供电要求:2.4V-3.6V;(通常是0~3.3v)
· ADC输入范围:VREF- ≤ VIN ≤ VREF+
1.3 STM32F10x大容量芯片带3个ADC控制器
其中144脚芯片因为带PF脚,所以多5个通道,为21个外部通道。
小于144脚芯片只有16个外部通道。
ADC通道与引脚对应关系:
1.4 ADC引脚
一般情况下,VDD是3.3V,VSS接地,相对应的,VDDA是3.3V,VSSA也接地,模拟输入信号不要超过VDD(3.3V)。
1.5 ADC框图
1.5.1 规则通道和注入通道:
STM32F1的ADC的各通道可以单次,连续,扫描或者间断模式执行。
1.5.2 单次转换 VS 连续转换
连续转换模式会自动启动下次转换
1.5.3 扫描模式
扫描模式的设置是通过配置DMA来实现的;
1.5.4 ADC中断
在框图中的最顶部,显示ADC的各种中断。很显然可以看出:规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们都有独立的中断使能位。
ADC时钟配置
这里需要注意一下,一般情况下:不要让ADC时钟超过14MHz,否则可能不准。
也就是说,如果按照默认设置PCLK2为72MHz,此时应为6分频或者8分频。
RCC_ADCCLKConfig(RCC_PCLK2_DIV6);
ADC_CR1寄存器:
在扫描模式下,由ADCSQRx或ADC_JSQRx寄存器选中的通道被转换。如果设置了EOCIE或者JEOCIE ,在最后一个通道转换完毕后才会产生ECO或者JEOC中断
模式选择:
作用:设置扫描模式、中断允许(转换结束、注入转换结束、模拟看门狗)、双模式选择(一般选用独立模式)等。
ADC_CR2寄存器
作用:设置数据对齐方式、连续转换位、ADC启动位、外部触发转换(一般选用软件转换SWSTART、JSWSTART)。
数据对齐方式:
ADC_SMPRx采样寄存器
ADC_SMPR2寄存器
作用:设置ADC各通道的采样时间。
通道采样时间
ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改。每个通道可以分别用不同的时间采样。
总转换时间如下计算:
TCONV = 采样时间+ 12.5个周期
例如:当ADCCLK=14MHz,采样时间为1.5周期时,TCONV =1.5+12.5=14周期=1μs。
故而,ADC的最小转换时间1us(ADC时钟=14MHz,采样周期为1.5周期下得到)。
ADC_SQR1/SQR2/SQR3规则序列寄存器
作用:设置规则通道序列长度、对应序列中各个转换的通道编号(最多16个)。
ADC_JSQR注入系列寄存器
ADC_DR规则通道数据寄存器
ADC_SR状态寄存器
常用库函数
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
void ADC_DeInit(ADC_TypeDef* ADCx)
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
void ADC_ResetCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
void ADC_StartCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
ADC初始化函数ADC_Init
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
typedef struct
{
uint32_t ADC_Mode; //ADC模式:配置ADC_CR1寄存器的位[19:16]:DUALMODE[3:0]位
FunctionalState ADC_ScanConvMode; //是否使用扫描模式。ADC_CR1位8:SCAN位
FunctionalState ADC_ContinuousConvMode; //单次转换OR连续转换:ADC_CR2的位1:CONT
uint32_t ADC_ExternalTrigConv; //触发方式:ADCCR2的位[19:17]:EXTSEL[2:0]
uint32_t ADC_DataAlign; //对齐方式:左对齐还是石对齐:ADC CR2的位11:ALIGN
uint8_t ADC_NbrOfChannel; //规则通道序列长度:ADC_SQR1的位[23:20]:L[3:0]
}ADC_InitTypeDef;
ADC使能函数:
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
ADC_Cmd(ADC1, ENABLE);//使能指定的ADC1
ADC规则通道配置函数:
设置规则序列通道以及采样周期的库函数是:
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel,uint8_t Rank, uint8_t ADC_SampleTime);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );
ADC获取转换结果函数:
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
例:uint16_t ADC_GetConversionValue(ADC1);//获取ADC1转换结果
这节太难了,写了两周