2021-05-5 ADC基本原理

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转换结果

这节太难了,写了两周

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值