模拟/数字转换ADC
简介
12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行
ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值
ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生
主要特性
● 12位分辨率
● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断
● 单次和连续转换模式
● 从通道0到通道n的自动扫描模式
● 自校准
● 带内嵌数据一致性的数据对齐
● 采样间隔可以按通道分别编程
● 规则转换和注入转换均有外部触发选项
● 间断模式
● 双重模式(带2个或以上ADC的器件)
● ADC转换时间:
─ STM32F103xx增强型产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)
─ STM32F101xx基本型产品:时钟为28MHz时为1μs(时钟为36MHz为1.55μs)
─ STM32F102xxUSB型产品:时钟为48MHz时为1.2μs
─ STM32F105xx和STM32F107xx产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)
● ADC供电要求:2.4V到3.6V
● ADC输入范围:VREF- ≤ VIN ≤ VREF+
● 规则通道转换期间有DMA请求产生
ADC结构框图
ADC开关控制
通过设置ADC_CR2寄存器的ADON位可给ADC上电。当第一次设置ADON位时,它将ADC从断电状态下唤醒。
ADC上电延迟一段时间后(tSTAB),再次设置ADON位时开始进行转换。
通过清除ADON位可以停止转换,并将ADC置于断电模式。在这个模式中,ADC几乎不耗电(仅几个μA)。
ADC 转换组分类
规则组
● 规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。
规则组中转换的总数应写入ADC_SQR1寄存器的L[3:0]位中
注入组
● 注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入
组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]位中
触发注入模式
清除ADC_CR1寄存器的JAUTO位,并且设置SCAN位,即可使用触发注入功能。
1. 利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换。
2. 如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫描方式进行转换。
3. 然后,恢复上次被中断的规则组通道转换。如果在注入转换期间产生一规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。
自动注入模式 JAUTO
如果设置了JAUTO位,在规则组通道之后,注入组通道被自动转换。这可以用来转换在
ADC_SQRx和ADC_JSQR寄存器中设置的多至20个转换序列。
在此模式里,必须禁止注入通道的外部触发。
如果除JAUTO位外还设置了CONT位,规则通道至注入通道的转换序列被连续执行
注意: 不可能同时使用自动注入和间断模式
Note:规则组可以被注入组打断转换
ADC 转换模式
单次转换模式
单次转换模式下,ADC只执行一次转换。该模式既可通过设置ADC_CR2寄存器的ADON位(只
适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0。
一旦选择通道的转换完成:
● 如果一个规则通道被转换:
─ 转换数据被储存在16位ADC_DR寄存器中
─ EOC(转换结束)标志被设置
─ 如果设置了EOCIE,则产生中断。
● 如果一个注入通道被转换:
─ 转换数据被储存在16位的ADC_DRJ1寄存器中
─ JEOC(注入转换结束)标志被设置
─ 如果设置了JEOCIE位,则产生中断。
然后ADC停止。
连续转换模式 CONT
在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。此模式可通过外部触发启
动或通过设置ADC_CR2寄存器上的ADON位启动,此时CONT位是1。
每个转换后:
● 如果一个规则通道被转换:
─ 转换数据被储存在16位的ADC_DR寄存器中
─ EOC(转换结束)标志被设置
─ 如果设置了EOCIE,则产生中断。
● 如果一个注入通道被转换:
─ 转换数据被储存在16位的ADC_DRJ1寄存器中
─ JEOC(注入转换结束)标志被设置
─ 如果设置了JEOCIE位,则产生中断
扫描模式 SCAN
此模式用来扫描一组模拟通道。
扫描模式可通过设置ADC_CR1寄存器的SCAN位来选择。
一旦这个位被设置,ADC扫描所有被ADC_SQRX寄存器(对规则通道)或ADC_JSQR(对注入通道)选中的所有通道。
在每个组的每个通道上执行单次转换。在每个转换结束时,同一组的下一个通道被自动转换。
如果设置了CONT位,转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。
如果设置了DMA位,在每次EOC后,DMA控制器把规则组通道的转换数据传输到SRAM中。
而注入通道转换的数据总是存储在ADC_JDRx寄存器中
间断模式 DISCEN
规则组
此模式通过设置ADC_CR1寄存器上的DISCEN位激活。它可以用来执行一个短序列的n次转换
(n<=8),此转换是ADC_SQRx寄存器所选择的转换序列的一部分。数值n由ADC_CR1寄存器的
DISCNUM[2:0]位给出。
一个外部触发信号可以启动ADC_SQRx寄存器中描述的下一轮n次转换,直到此序列所有的转
换完成为止。总的序列长度由ADC_SQR1寄存器的L[3:0]定义。
举例:
n=3,被转换的通道 = 0、1、2、3、6、7、9、10
第一次触发:转换的序列为 0、1、2
第二次触发:转换的序列为 3、6、7
第三次触发:转换的序列为 9、10,并产生EOC事件
第四次触发:转换的序列 0、1、2
注意: 当以间断模式转换一个规则组时,转换序列结束后不自动从头开始。
当所有子组被转换完成,下一次触发启动第一个子组的转换。在上面的例子中,第四次触发重
新转换第一子组的通道 0、1和2。
注入组
此模式通过设置ADC_CR1寄存器的JDISCEN位激活。在一个外部触发事件后,该模式按通道
顺序逐个转换ADC_JSQR寄存器中选择的序列。
一个外部触发信号可以启动ADC_JSQR寄存器选择的下一个通道序列的转换,直到序列中所有
的转换完成为止。总的序列长度由ADC_JSQR寄存器的JL[1:0]位定义。
例子:
n=1,被转换的通道 = 1、2、3
第一次触发:通道1被转换
第二次触发:通道2被转换
第三次触发:通道3被转换,并且产生EOC和JEOC事件
第四次触发:通道1被转换
注意:
1 当完成所有注入通道转换,下个触发启动第1个注入通道的转换。在上述例子中,第四个触发重新转换第1个注入通道1。
2 不能同时使用自动注入和间断模式
3 必须避免同时为规则和注入组设置间断模式。间断模式只能作用于一组转换。
温度传感器
温度传感器可以用来测量器件周围的温度
温度传感器在内部和ADC1_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值
温度传感器模拟输入推荐采样时间是17.1μs
当没有被使用时,传感器可以置于关电模式
内部温度传感器更适合于检测温度的变化,而不是测量绝对的温度。如果需要测量精确的温度,应该使用一个外置的温度传感器
ADC温度传感器特性
温度(°C) = {(V25 - VSENSE) / Avg_Slope} + 25
Temp_Value = (1.43 - ADC_Conversion_Voltag_Value)/0.0043+25
模拟看门狗
如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置。
阀值位于ADC_HTR和ADC_LTR寄存器的最低12个有效位中。通过设置ADC_CR1寄存器的AWDIE位以允许产生相应中断
通过配置ADC_CR1寄存器,模拟看门狗可以作用于1个或多个通道

ADC STM32 CUBE_MX 配置
ADC HAL库函数List
stm32f1xx_hal_adc.c
/* ADC初始化和去初始化函数 */
HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc);
/* 初始化MSP回调函数 */
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc);
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc);
/* ADC回调函数注册 */
HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID, pADC_CallbackTypeDef pCallback);
/* ADC回调函数注销 */
HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID);
/* ADC启动和停止函数 */
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
/* 轮询方式查询转换是否完成 */
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);
/* 轮询方式查询模拟看门狗事件是否产生 */
HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout);
/* ADC启动并使能ADC EOC转换完成中断 */
HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);
/* ADC停止并失能ADC EOC转换完成中断 */
HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
/* ADC启动并开启DMA传输 */
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);
/* ADC停止并停止DMA传输 */
HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);
/* 查询规则转换组转换值*/
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);
/* ADC 规则组通道配置*/
HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig);
/* ADC 模拟看门狗配置*/
HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef* hadc, ADC_AnalogWDGConfTypeDef* AnalogWDGConfig);
中断及回调函数
/* ADC 中断服务函数 */
void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);
/* ADC EOC规则组转换完成中断回调 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);
/* ADC JEOC注入组转换完成中断回调 */
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc);
/* ADC DMA传输半完成中断回调 */
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc);
/* ADC 模拟看门狗中断回调 */
void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc);
/* ADC DMA传输错误中断回调 */
void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc);
stm32f1xx_hal_adc.h
typedef struct
{
uint32_t DataAlign; /*数据对齐方式*/
uint32_t ScanConvMode; /*扫描模式配置*/
FunctionalState ContinuousConvMode; /*连续转换模式*/
uint32_t NbrOfConversion; /*连续转换通道数配置*/
FunctionalState DiscontinuousConvMode; /*间断模式配置*/
uint32_t NbrOfDiscConversion; /*间断模式转换数*/
uint32_t ExternalTrigConv; /*外部触发配置*/
}ADC_InitTypeDef; /*ADC 初始化结构体*/
typedef struct
{
uint32_t Channel; /*选择要配置的规则通道*/ ADC_CHANNEL_0 ~ ADC_CHANNEL_17
uint32_t Rank; /*配置规则通道转换序列*/ ADC_REGULAR_RANK_1 ~ ADC_REGULAR_RANK_16
uint32_t SamplingTime; /*配置规则通道采样率*/
}ADC_ChannelConfTypeDe; /*ADC 规则通道配置结构体*/
typedef struct
{
uint32_t WatchdogMode; /*配置模拟看门狗工作模式*/ mode: single/all
uint32_t Channel; /*配置模拟看门狗监控通道*/ 只有在配置为单通道模式时使用
FunctionalState ITMode; /*配置模拟看门狗中断使能*/
uint32_t HighThreshold; /*配置模拟看门狗高阈值*/
uint32_t LowThreshold; /*配置模拟看门狗低阈值*/
uint32_t WatchdogNumber; /*保留未使用*/
}ADC_AnalogWDGConfTypeDef; /*ADC 模拟看门狗配置结构体*/
typedef struct __ADC_HandleTypeDef
{
ADC_TypeDef *Instance; /*!< 寄存器基地址 */
ADC_InitTypeDef Init; /*!< ADC 初始化结构体 */
DMA_HandleTypeDef *DMA_Handle; /*!< DMA 句柄 */
HAL_LockTypeDef Lock; /*!< ADC locking object */
__IO uint32_t State; /*!< ADC communication state (bitmap of ADC states) */
__IO uint32_t ErrorCode; /*!< ADC Error code */
}ADC_HandleTypeDef; /*ADC 句柄*/
stm32f1xx_hal_adc_ex.c
/*ADC 自校准函数 */
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc);
/*ADC 注入组转换开始/停止 */
HAL_StatusTypeDef HAL_ADCEx_InjectedStart(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADCEx_InjectedStop(ADC_HandleTypeDef* hadc);
/*ADC 注入通道轮询查询EOC转换标志 */
HAL_StatusTypeDef HAL_ADCEx_InjectedPollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);
/*ADC 注入组转换开始/停止 带中断使能/失能 */
HAL_StatusTypeDef HAL_ADCEx_InjectedStart_IT(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADCEx_InjectedStop_IT(ADC_HandleTypeDef* hadc);
/*ADC 注入组转换数据查询 */
uint32_t HAL_ADCEx_InjectedGetValue(ADC_HandleTypeDef* hadc, uint32_t InjectedRank);
/*ADC 注入通道配置 */
HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef* hadc,ADC_InjectionConfTypeDef* sConfigInjected);
/*ADC 双ADC模式通道配置 */
HAL_StatusTypeDef HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef *hadc, ADC_MultiModeTypeDef *multimode);
/*ADC 双ADC模式转换数据查询 */
uint32_t HAL_ADCEx_MultiModeGetValue(ADC_HandleTypeDef *hadc);
/*ADC 双ADC模式DMA方式启动/停止 */
HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length);
HAL_StatusTypeDef HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef *hadc);
stm32f1xx_hal_adc_ex.h
typedef struct
{
uint32_t InjectedChannel; /*注入通道配置*/
uint32_t InjectedRank; /*注入通道转换序列*/
uint32_t InjectedSamplingTime; /*注入通道采样率配置*/
uint32_t InjectedOffset; /*注入通道数据便宜配置*/
uint32_t InjectedNbrOfConversion; /*注入通道转换数选择*/
FunctionalState InjectedDiscontinuousConvMode; /*注入通道间断模式*/
FunctionalState AutoInjectedConv; /*注入通道自动注入配置*/
uint32_t ExternalTrigInjecConv; /*注入通道外部触发配置*/
}ADC_InjectionConfTypeDef; /*注入通道配置结构体*/
typedef struct
{
uint32_t Mode; /*双ADC模式选择*/
}ADC_MultiModeTypeDef; /*双ADC模式配置*/