一、前言
MM32F0020 有一个 12 位的 ADC,最快转换速率可达 1MHz,有 8 个外部输入通道,1 个内部通道,本文介绍其使用 TIM1_CC4 作为外部触发源,使用单周期扫描模式,转换三个通道的配置过程。
二、解析
ADC 的输入时钟最大不超过 16M,由 AHB Clock 的 pclk 产生,如下图,MM32F0020 的系统时钟最大是 48MHz,APB1_Div 默认是 1,所以需要对 pclk 进行分频,分频系数的设置需要配置 ADC 的 ADC_ADCFG 配置寄存器。
ADC_ADCFG 配置寄存器中关于时钟分频的配置如下图。其需要配置分频系数的高位和低位。
其配置转换的分辨率也在 ADC_ADCFG 配置寄存器中配置,如上图 7-9 位的描述。
接下来需要配置其转换模式,外部触发源,中断使能,以及转换数据的数据对齐方式。这些配置在 ADC_ADCR 控制寄存器中配置。
其中配置数据对齐方式是通过 ADC_ADCR 控制寄存器的第 11 位,转换模式是通过其 9-10 位去配置。
外部触发源通过其 4-6 位去配置。
使能外部触发源由其第 2 位去配置。
本文要使能的中断是,通道序列转换结束的中断,本文要转换 3 个通道,当 3 个通道都转换完成之后,进入中断,选项如下图。
进入中断之后,需要判断通道转换是否完成,可以通过读取 ADC_ADSTA 状态寄存器的第 0 位进行判断。如下图。
注意在出中断之前要清除该位。
另外还可以针对每个通道配置其采样时间,ADC 转换通道的采样时间可通过ADC_SMPR1 和ADC_SMPR2 寄存器中的 SAMPCTL0~SAMPCTL8 配置。下图为 ADC_SMPR1 配置通道 0-7的采样时间,ADC_SMPR2 配置通道 8 的采样时间。
关于每个通道采样时间的计算方式如下。
单个通道的采样时间 = ADC 分频之后得到的时钟 * 采样周期
注意这里只是计算采样时间,并非转换时间,总的转换时间除了采样以外还要加上处理时间,总的转换时间的计算也在下面给出。
假设 ADC 设定的分辨率是 n,设定的采样时间是 m,ADC 分频之后的时钟是 F_adc_clk,那么转换时间就是,
T = (m+n+0.5)/ F_adc_clk
举个例子,设定的是 12bit 的分辨率,采样时间是 3.5 个周期,时钟是 16MHz,
T = (12+3.5+0.5) / 16M = 16 / 16000000 = 1us
接下来配置采样的通道,本文中需要的是任意通道转换,所以先使能任意通道转换,在 ADC_ANY_CR 任意通道控制寄存器中的第 0 位进行使能。
配置任意转换的通道个数,通过 ADC_ANY_CFG 任意通道配置寄存器进行配置,如下图,注意其提示部分。
本文中需要转换 3 个通道,所以配置其为 3 即可。
接下来需要配置任意转换的通道是哪几个通道,通过 ADC_CHANY0 或者 ADC_CHANY1 进行配置。
本文每一次周期扫描只扫描 3 个通道,所以只配置 ADC_CHANY0 的 0-11 位即可。
配置完成以后即可使能 ADC 开始工作,可以通过前面提到的 ADC_ADCFG 寄存器的第 0 位进行使能,然后开始转换。
三、总结
总结一下通过外部触发源去触发 ADC 任意通道转换的寄存器配置流程。
1、使能 ADC 外设时钟
2、配置 ADC_ADCFG 寄存器
3、配置 ADC_ADCR 寄存器
4、配置 ADC_SMPR1 寄存器
5、配置 ADC_ANY_CR 寄存器
6、配置 ADC_ANY_CFG 寄存器
7、配置 ADC_CHANY0 寄存器
相关文档参考放在下面参考资料中。
四、参考资料
1、MM32F0020 的用户手册
2、MM32F0020 的数据手册
评论