1
摘要
本应用笔记主要介绍 HC32F460 系列 MCU 的模数转换器(以下简称 ADC)的特点及使用方法,包括扫描模式、转换数据平均功能、模拟看门狗、可编程增益放大器和协同模式等。
2
ADC 简介
2.1
功能简介
HC32F460 系列 MCU 内部集成 ADC1 和 ADC2 两个 ADC 模块(系统框图如图 2-1),挂载于AHB-APB(APB3)总线,可配置 12 位、10 位和 8 位分辨率,支持最多 16 个外部模拟输入通道和 1 个内部基准电压/8bitDAC 输出的检测通道。这些模拟输入通道可以任意组合成一个序 列(序列 A 或序列 B),一个序列可以进行单次扫描(包括两个动作:采样和转换),或连续扫描。支持对任意指定通道进行连续多次扫描,并对转换结果进行平均。ADC 模块还搭载模拟看门狗(以下简称 AWD)功能,可对任意指定通道的转换结果进行监视,检测是否超出设定的阀值。
![](https://b2b.big-bit.com/file/upload/202107/15/14291032289363.png)
2.2 主要特性
HC32F460 系列 MCU 的 ADC 具有如下主要特性:
1) 高性能
可配置 12 位、10 位和 8 位分辨率
周边时钟(数字时钟)PCLK4 和 A/D 转换时钟 ADCLK 的频率比可选择:
PCLK4 : ADCLK = 1 : 1,2 : 1,4 : 1,8 : 1,1 : 2,1 : 4
ADCLK 可选与系统时钟 HCLK 异步的 PLL 时钟,此时 PCLK4 : ADCLK = 1:1
采样率:2.5MSPS(PCLK4 = ADCLK = 60MHz,12 位分辨率,采样 11 周期)
各通道可独立设置采样时间
各通道独立数据寄存器
数据寄存器可配置数据对齐方式
连续多次转换平均功能
模拟看门狗,监视转换结果
不使用时可将 ADC 模块设定为停止状态
2) 模拟输入通道
最多有 16 个外部模拟输入采样通道
1 个内部基准电压/8bitDAC 输出的检测通道
最多有 16 个外部模拟输入引脚,外部模拟输入引脚可与采样通道自由映射
3) 转换开始条件
软件启动开始转换(只支持序列 A)
外设事件触发开始转换(支持序列 A 和序列 B)
外部引脚触发开始转换(支持序列 A 和序列 B)
4) 转换模式
序列 A 单次扫描
序列 A 连续扫描
双序列扫描
协同模式
5)
序列 A 扫描结束中断和事件 ADC_EOCA
序列 A 扫描结束中断和事件 ADC_EOCB
模拟看门狗通道比较中断和事件 ADC_CHCMP,序列比较中断和事件 ADC_SEQCMP
上述 4 个事件输出都可启动 DMA
2.3 引脚配置
HC32F460 系列 MCU 的 ADC1 有 17 个采样通道,最多支持 16 个外部模拟输入引脚,通道0~15 可与外部模拟输入引脚自由映射,通道 16 用于内部基准电压/8bitDAC 的输出检测。ADC2 有 9 个采样通道,最多支持 8 个外部模拟输入引脚,通道 0~7 可与外部模拟输入引脚自由映射,通道 8 用于内部基准电压/8bitDAC 的输出检测。
3
ADC 应用
3.1
模拟输入引脚与通道
HC32F460 系列 MCU 的 ADC 模块模拟输入引脚等配置,
默认情况下,ADC1 的 CH0(通道 0)对应模拟输入引脚 ADC1_IN0,CH1 对应
ADC1_IN1……,CH16 为内部模拟通道,只能用于检测内部基准电压、8bitDAC1 或
8bitDAC2。也就是,默认情况下,ADC1 序列 A 的通道选择寄存器 ADC1_CHSELRA0(或序列 B 的通道选择寄存器 ADC1_CHSELRB0)的 bit0 置 1,即选择了模拟输入引脚 ADC1_IN0,bit1 置 1,即选择模拟输入引脚ADC1_IN1;序列 A 的通道选择寄存器ADC1_CHSELRA1(或序列 B 的通道选择寄存器 ADC1_CHSELRB1)的 bit0 置 1,即选择了内部模拟输入,用于检测内部基准电压、8bitDAC1 或 8bitDAC2。但是,HC32F460 系列的 ADC 模块具有模拟输入引脚与通道自由映射(除用于检测内部模拟输入的通道外)的功能,可满足用户不同的应用需求。例如,可将引脚 ADC12_IN10 映射到ADC1 的一个通道(如 CH0,不能映射到 CH16),或同时映射到多个通道(如 CH0、CH2 和 CH3)。
ADC2 通道与引脚的默认对应关系和通道重映射与 ADC1 的类似。
关于通道重映射,固件例程 adc_11_channel_remap 给出了其具体用法。
3.2 模拟输入的采样时间和转换时间
关于 ADC 时间的详细说明,请参考用户手册“模拟输入的采样时间和转换时间”一节中,寄存器 ADC_SSTR 和 ADC 电气特性部分,请严格按照手册要求设置采样时间。在满足应用需求的情况下,请尽量将采样时间设置得大一些,尤其在对多个通道采样时,如果通道的采样时间设 置偏小,可能会导致相邻通道(如序列 A 配置了 CH0、CH5、CH7,那么 CH0 和 CH5、CH5 和 CH7 都是相邻通道)之间透过采样电容发生耦合,而使转换结果不准确。
3.3 模式和功能
ADC 的通道可配置为序列 A 或序列 B,序列 A 和序列 B 可单独设置不同的触发源。两个序列共有四种扫描方式:
序列 A 单次扫描;
序列 A 连续扫描;
序列 A 单次扫描,序列 B 单次扫描;
序列 A 连续扫描,序列 B 单次扫描。
各通道还可设置平均功能,可连续扫描设定次数后,计算转换的平均值,并将平均值保存到数据寄存器中;模拟看门狗 AWD 在通道转换结束后对转换结果进行比较,可生成通道比较中断和事件 ADC_CHCMP,在整个序列扫描结束后,根据各通道比较结果生成序列比较中断和事件 ADC_SEQCMP;可编程增益放大器 PGA,可对模拟输入信号放大后再转换;协同工作模式下,ADC1 和 ADC2 可同时转换或连续交替转换;模拟输入引脚可与 ADC 通道的自由映射,再结合协同模式,可实现对指定模拟输入的高频扫描。
3.4 序列 A 单次扫描模式
3.4.1 说明
在此模式下,ADC 执行单个或多个通道的单次扫描,并在转换完成后停止.
3.4.2 应用
该模式可以设置单个或多个通道。设置多个通道时,可实现对多个通道进行依次扫描,这些通道可设置不同的采样时间,用户不必在扫描过程中停止 ADC,即可以不同的采样时间重新扫描下一个通道,可避免额外的 CPU 负载以及繁重的软件开发。
该模式是最简单的 ADC 模式,应用方式灵活。如在系统启动前,可以用这种模式检测系统的一些状态信息,如电压、压力、温度等,以确定系统是否可以正常启动;在系统运行中,可用 这种模式,按需检测系统状态,以获取系统实时状态。
应用例程 adc_01_sa_base 给出了该模式的具体用法。
3.5 序列 A 连续扫描模式
3.5.1 说明
连续扫描模式可对单个通道或多个通道进行连续不断的扫描。连续扫描模式允许
ADC 在后台工作。因此,ADC 可在没有任何 CPU 干预的情况下对通道进行连续(循环)扫描通道。此外,还可以在连续扫描模式下使用 DMA,从而降低 CPU 负载。
3.5.2 应用
此模式设置单个通道时,可用于监视电池电压、测量和调节烤箱温度等应用。在用于调节烤箱温度时,系统将读取温度并与用户设置的温度进行比较。当烤箱温度达到所需温度时,关闭加热电阻器的电源。
设置多个通道时,与多通道单次扫描模式类似,只是在完成序列的最后一个通道后不会停止扫描,而是从第一个通道重新开始扫描并无限循环下去。多通道连续扫描模式,可用于监视多电池充电器中的多个电压和温度。系统在充电过程中读取每节电池的电压和温度。当电压或温度达到最大值时,将切断相应电池与充电器的连接。
应用例程 adc_01_sa_base 中有该模式的设置以及简单的应用方法。
3.6 双序列扫描模式
3.6.1 说明
此处将“序列 A 单次扫描、序列 B 单次扫描”和“序列 A 连续扫描、序列 B 单次扫描”两种模式整合为双序列扫描模式进行介绍。双序列扫描模式,只是在前两种模式中增加了序列 B 的扫描。双序列扫描模式下,序列 B 必须由外部引脚或内部事件触发转换,软件启动对序列 B 无 效,序列 A 可由软件启动扫描,也可由外部引脚或内部事件触发扫描。序列 B 的优先级高于 序列 A. 配置 ADC_CR1.RSCHSEL 为 0 时,当序列 A 被中断后,恢复时,从被中断通道继续扫描.
3.6.2 应用
可在前两种模式的应用中,加入需要实时响应(更高优先级)扫描的通道,将其配置为序列B。例程 adc_04_sa_sb_event_trigger 实现了双序列扫描的基本用法。
3.7 转换数据平均功能
3.7.1 说明
转换数据平均功能,可设置连续扫描 2、4、8、16、32、64、128 或 256 次后,将转换结果平均后,保存到数据寄存器。该功能可去除一定的噪声成分,使结果更加准确。该功能的优势是可以在无任何硬件变更的情况下提高 ADC 的准确度,缺点是降低了转换速度和频率(相当于降低了有效采样率)。
3.7.2 应用
针对不同的应用,可设置不同的连续扫描次数,该次数取决于需要的精度、最低转换速度等。应用笔记没有单独为该功能提供例程,在例程 adc_01_sa_base 中有该功能的配置方式。
3.8
模拟看门狗
3.8.1
说明
HC32F460 系列 MCU 的模拟看门狗,可配置为上下限比较或区间比较。用户可预先设置比较条件和相应的上下限或区间。在通道转换结束后,模拟看门狗对转换结果
进行比较,如果满足比较条件,则产生通道比较中断和事件 ADC_CHCMP,在整个序列扫描结束后,根据各通道比较结果生成序列比较中断和事件 ADC_SEQCMP。每个使能模拟看门狗的通道,只要其转换结果满足比较条件,都会产生一次中断和事件 ADC_CHCMP;每个序列,只要其中一个通道的转换结果满足比较条件,都会产生中断和事件 ADC_SEQCMP。在条件满足后,一个序列只产生一次中断和事件 ADC_SEQCMP。也就是,一个 ADC 模块,一轮
扫描结束后,可产生多次中断和事件 ADC_SEQCMP,最多两次(因为最多只有两个序列)中断和事件 ADC_SEQCMP。
注意:
- 不推荐同时使用 ADC_CHCMP 中断和 ADC_SEQCMP 中断。
3.8.2
应用
在一些控制系统中,需要严格监测电压、压力、温度等信号的范围,使用模拟看门狗能够快速地检测到这些信号的异常状况,并做出相应的应对措施,以确保设备安全。例程adc_08_sa_sb_awd_base 给出了模拟看门狗的配置和基本应用方法;但通常,模拟看门狗的中断用法更为高效,应用也更为普遍,例程 adc_09_sa_sb_awd_interrupt 给出了模拟看门狗的中断配置和用法。
3.9
内部模拟通道
3.9.1
说明
ADC1 和 ADC2 都具有一个用于检测内部模拟输入的通道,分别为通道 16 和通道 8,用来检测三个可选择的内部模拟输入量,内部基准电压、8bitDAC1 输出8bitDAC2 输出。
注意:
- 只能选择 ADC1 和 ADC2 其中之一的内部检测通道,来检测三个内部模拟输入的其中一个,不能同时使用 ADC1 和 ADC2 的内部检测通道。
3.9.2
应用
在一些系统中,可能由于某些原因导致 ADC 的参考电压不稳定,从而无法知道模拟输入的实际电压值,这时,可用 ADC1 或 ADC2 的内部检测通道,来检测内部基准电压(在系统工作电压正常时恒为 1.1V),来反推 ADC 当前的参考电压,从而得知模拟输入当前的实际电压值。具体实现如下:
1.
在某已知参考电压 VREF1 下测得内部基准电压的 ADC 值为 VAL1;
2.
随着系统的运行,参考电压可能随着供电源(如电池)的电压降低而下降,此时测得内部基准电压的 ADC 值为 VAL2,设此时参考电压为 VREF2;
3.
由于内部基准电压是恒定的,所以有:
VAL1 × VREF1 = VAL2 × VREF2;
VREF2 = (VAL1 × VREF1) / VAL2;
由此已知当前参考电压为 VREF2,就不难得到模拟输入的实际电压了。
例程 adc_10_internal_channel 展示了内部通道的各种配置和简单用法。