本帖最后由 ArterySW 于 2023-4-27 20:02 编辑
AT32F423 ADC使用指南
前言
AT32 的ADC 是一个将模拟输入信号转换为设定分辨率数位数字信号的外设。采样率最高可达
5.33MSPS。多达26 个通道源可进行采样及转换。具备多种功能强大的模式,本文主要以ADC 的特
色功能进行讲解和案列解析。
支持型号列表:
支持型号 AT32F423xx
1 ADC 简介
ADC 控制器的功能极其强大。其包含但不限于以下内容
时钟及状态,由数字和模拟时钟两个部分组成
分辨率及采样转换,可配置分辨率为12/10/8/6 位的转换,采样周期支持广范围的配置
自校准,自带校准功能以纠正数据偏移
基本模式,支持多种模式,不同模式可组合使用满足多种应用
不同优先权的通道,普通通道与抢占通道具备不同的优先权
多种独立的触发源,包括TMR、EXINT、软触发等多种触发选择
数据后级处理,包括数据的对齐,抢占通道偏移量等多种处理
转换中止,可软件控制在ADC 不掉电状态下实现转换中止
过采样器,普通及抢占通道均支持过采样
电压监测,通过对转换结果的判定来实现电压监测
中断及状态事件,具备多种标志指示ADC 状态,且某些标志还具备中断功能
多种转换数据的获取方式,包括DMA 获取、CPU 获取两种方式实现转换数据的读取
多达26 个通道:IN0~IN17,IN20~IN27
图1. ADC1 框图
2 ADC 功能解析
2.1 时钟及状态
2.1.1功能介绍
ADC 的时钟分为数字时钟与模拟时钟。其统一通过CRM_APB2EN 的ADCxEN 位使能。
数字时钟:即PCLK2,经HCLK 分频而来,提供给数字部分使用。
模拟时钟:即ADCCLK,经ADC 预分频器分频而来,提供给模拟部分使用。
模拟时钟源可以选择HCLK 或PLLCLK,通过CRM_MISC1 的PLLCLK_TO_ADC 位选择。
2.1.2软件接口
ADC 时钟使能,软件由单独的函数接口实现,其软件实例如下:
crm_periph_clock_enable(CRM_ADCx_PERIPH_CLOCK, TRUE);
当ADC 时钟使能后,软件即可开始进行ADC 的一些相关配置。
ADC 模拟时钟源选择,其软件实例如下:
crm_adc_clock_select(CRM_ADC_CLOCK_SOURCE_PLLCLK);
ADC 预分频设定,软件由ADC 公共部分结构体配置完成,其软件实例如下:
adc_common_struct.div = ADC_HCLK_DIV_4;
adc_common_config(&adc_common_struct);
此项实际用于设定ADC 模拟部分的时钟,其由HCLK 或PLLCLK 分频而来。
注意:
1)模拟部分的ADCCLK 由HCLK 分频而来,其不可大于80MHz;
2)ADC 数字部分挂在PCLK2 上,为避免同步问题,ADCCLK 频率不可高于PCLK2;
3)当选择PLLCLK 作为ADC 模拟时钟源时,此时必须保证系统时钟SCLKSEL 选择PLL/2。
4)ADC 模拟部分电源由ADC_CTRL2 的ADCEN,其不受ADC 的时钟状态影响。典型的,如果系统需要进入
深度睡眠模式,如果不关闭ADCEN,此时ADC 模拟器件将还会消耗电流;
5)ADC 上电有一段等待时间,应用应该在判定到ADC 的RDY flag 置位后再执行后续触发等操作。
2.2 分辨率及采样转换
2.2.1功能介绍
ADC 可随意设定12、10、8、6 位分辨率使用。
ADC 可设定2.5、6.5、12.5、24.5、47.5、92.5、247.5、640.5 个采样周期。
ADC 对通道数据的获取由采样和转换两个部分组成。
采样先于转换执行,采样期间内选通需要转换的通道,外部电压对ADC 内部采样电容充电,将持续
执行设定的采样周期长度时间的充电。
采样结束后就会自动开始转换,ADC 采用逐次逼近的转换方式,可有效保障转换数据的准确性。此
转换方式需要分辨率位数个ADCCLK 的转换时间来完成单通道的转换,再结合数据处理,因此单个
通道的整体转换时间即
单通道单次转换时间(ADCCLK 的周期) = 采样周期 + 分辨率位数 +0.5
示例:
CSPTx 选择6.5 周期,CRSEL 选择10 位,一次转换需要6.5+10 + 0.5 = 17 个ADCCLK 周期。
2.2.2软件接口
ADC 分辨率设定,软件由单独的函数接口实现,其软件实例如下:
adc_resolution_set(ADC1,ADC_RESOLUTION_6B);
注意:ADC 的自校准只能在12 位分辨率下进行,切分辨需安排在校准完成后执行。
ADC 采样周期设定,软件由单独的函数接口实现,其软件实例如下:
adc_ordinary_channel_set(ADC1, ADC_CHANNEL_4, 1, ADC_SAMPLETIME_12_5);
adc_preempt_channel_set(ADC1, ADC_CHANNEL_7, 1, ADC_SAMPLETIME_47_5);
注意:
不同通道可设定不同的采样周期;
当采用中断或轮询方式获取普通通道数据,为避免溢出,建议合理增大采样周期;
为避免充电不充分导致转换数据不准确,应用允许的条件下,建议合理增大采样周期。
2.3 自校准
2.3.1功能介绍
ADC 具备自校准能力,软件可以执行自校准命令,透过自校准可以计算出一个校准值。不需要软件
干预,ADC 会自动将该校准值反馈回ADC 内部补偿ADC 基础偏差,以保障转换数据的准确性。
校准值有两种获取方式:
软件下自校准命令,由硬件自动计算,产生的校准值保存在ADC->CALVAL 寄存器内
软件直接根据经验值,手动设定校准值,该值同样被保存在ADC->CALVAL 寄存器内
自校准的软件流程如下
在12 位分辨率状态下使能ADC
等待ADC 的RDY 标志置位
执行初始化校准命令并等待初始化校准完成
执行校准命令并等待校准完成
根据应用需求切换到期望配置的分辨率
等待ADC 的RDY 标志置位
执行完上述流程后,即可开始进行ADC 的触发转换
2.3.2软件接口
完整的校准及设定分辨率需由组合命令实现,依据校准值设定方式可区分如下两种
自校准方式,其软件实例如下:
adc_resolution_set(ADC1,ADC_RESOLUTION_12B);
/* adc enable */
adc_enable(ADC1, TRUE);
while(adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET);
/* adc calibration */
adc_calibration_init(ADC1);
while(adc_calibration_init_status_get(ADC1));
adc_calibration_start(ADC1);
while(adc_calibration_status_get(ADC1));
/*set resolution to 6bit.this because calibration must perform at 12 bit resolution */
adc_resolution_set(ADC1,ADC_RESOLUTION_6B);
while(adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET);
写经验值校准方式,其软件实例如下:
adc_resolution_set(ADC1,ADC_RESOLUTION_12B);
/* adc enable */
adc_enable(ADC1, TRUE);
while(adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET);
/* adc calibration */
adc_calibration_value_set(ADC1, 0x3F);
/*set resolution to 6bit.this because calibration must perform at 12 bit resolution */
adc_resolution_set(ADC1,ADC_RESOLUTION_6B);
while(adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET);
注意:
校准值的存放不会置位OCCE 标志,不会产生中断或DMA 请求;
ADC 的自校准只能在12 位分辨率下进行,切分辨需安排在校准完成后执行。
2.4 基本模式
2.4.1功能介绍
序列模式
ADC 支持序列模式设定,开启序列模式后,每次触发将序列中的通道依序转换一次。
用户于ADC_OSQx 配置普通通道序列,普通通道从OSN1 开始转换;于ADC_PSQ 配置抢占通道
序列,抢占通道是从PSNx 开始转换(x=4-PCLEN)。
抢占通道转换示例:
ADC_PSQ[21:0] = 10 00110 00101 00100 00011,此时扫描转换顺序为CH4、CH5、CH6,而不
是CH3、CH4、CH5
图2. 序列模式
反复模式
ADC 支持反复模式设定,开启反复模式后,当检测到触发后就即会反复不断地转换普通通道组。
图3. 反复模式+抢占自动转换模式
分割模式
ADC 支持分割模式设定。
对于普通通道组,分割模式可依据设定将通道组分割成长度较小的子组别。一次触发将转换子组别中
的所有通道。每次触发会依序选择不同的子组别进行转换。
对于抢占通道组,分割模式直接以通道为单位进行分割,一次触发将转换单个通道。每次触发会依序
选择不同的通道进行转换。
图4. 分割模式
抢占自动转换模式
ADC 支持抢占自动转换模式设定,开启抢占自动转换模式后,当普通通道转换完成后,抢占通道将
自动接续着转换,而不需要进行抢占通道的触发。
图5. 抢占自动转换模式
2.4.2软件接口
ADC 序列模式和反复模式设定,由ADC 基础部分结构体配置完成,其软件实例如下:
adc_base_struct.sequence_mode = TRUE;
adc_base_struct.repeat_mode = TRUE;
adc_base_config(ADC1, &adc_base_struct);
注意:
序列模式对普通及抢占通道组均有效;
反复模式仅对普通通道组有效,抢占通道组不具备反复模式功能;
反复模式与分割模式不可共用;
反复模式可与抢占自动转换模式共用,将实现依次反复的转换普通通道序列及抢占通道序列。
ADC 分割模式设定,软件由单独的函数接口实现,其软件实例如下:
/* set ordinary partitioned mode channel count */
adc_ordinary_part_count_set(ADC1, 1);
/* enable the partitioned mode on ordinary channel */
adc_ordinary_part_mode_enable(ADC1, TRUE);
/* enable the partitioned mode on preempt channel */
adc_preempt_part_mode_enable(ADC1, TRUE);
注意:
分割模式对普通及抢占通道组均有效;
抢占通道组分割模式子组别长度不可设定,其固定为单个通道;
分割模式与反复模式、抢占自动转换模式不可共用,普通通道与抢占通道的分割模式不可共用。
抢占自动转换模式设定,软件由单独的函数接口实现,其软件实例如下:
/* preempt group automatic conversion after ordinary group */
adc_preempt_auto_mode_enable(ADC1, TRUE);
注意:
抢占自动转换模式仅对抢占通道组有效;
抢占自动转换模式与分割模式不可共用。
更多详细内容请参考附件:
AN0161_AT32F423_ADC_Application_Note_ZH_V2.0.0.pdf
(1.17 MB)
|