ADC简介
ADC控制器的功能极其强大。其包含但不限于以下内容
图1. ADC1框图
ADC功能解析
时钟及状态
一、功能介绍ADC的时钟分为数字时钟与模拟时钟。其统一通过CRM_APB2EN的ADCxEN位使能。
二、软件接口
ADC时钟使能,软件由单独的函数接口实现,其软件实例如下:crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK,TRUE);当ADC时钟使能后,软件即可开始进行ADC的一些相关配置。ADC预分频设定,软件由单独的函数接口实现,其软件实例如下:adc_clock_div_set(ADC_DIV_8);此项实际用于设定ADC模拟部分的时钟,其由HCLK分频而来,故ADCCLK=HCLK/div注意:1)模拟部分的ADCCLK由HCLK分频而来,其不可大于28MHz;2)ADC数字部分挂在PCLK2上,为避免同步问题,ADCCLK频率不可高于PCLK2;3)ADC模拟部分电源由ADC_CTRL2的ADCEN,其不受ADC的时钟状态影响。典型的,如果系统需要进入深度睡眠模式,如果不关闭ADCEN,此时ADC模拟器件将还会消耗电流;4)ADC上电有一段等待时间tSTAB,再执行后续触发等操作。
采样转换
一、功能介绍ADC可设定1.5、7.5、13.5、28.5、41.5、55.5、71.5、239.5个采样周期。ADC对通道数据的获取由采样和转换两个部分组成。采样先于转换执行,采样期间内选通需要转换的通道,外部电压对ADC内部采样电容充电,将持续执行设定的采样周期长度时间的充电。采样结束后就会自动开始转换,ADC采用逐次逼近的转换方式,可有效保障转换数据的准确性。此转换方式需要12.5个ADCCLK的转换时间来完成单通道的转换,再结合数据处理,因此单个通道的整体转换时间即单通道单次转换时间(ADCCLK的周期)=采样周期+12.5示例:CSPTx选择7.5周期,一次转换需要7.5+12.5=20个ADCCLK周期。
二、软件接口
ADC采样周期设定,软件由单独的函数接口实现,其软件实例如下:adc_ordinary_channel_set(ADC1,ADC_CHANNEL_4,1,ADC_SAMPLETIME_13_5);adc_preempt_channel_set(ADC1,ADC_CHANNEL_7,1,ADC_SAMPLETIME_41_5);注意:不同通道可设定不同的采样周期;当采用中断或轮询方式获取普通通道数据,为避免数据读取不及时,建议合理增大采样周期;为避免充电不充分导致转换数据不准确,应用允许的条件下,建议合理增大采样周期。
自较准
一、功能介绍ADC具备自校准能力,软件可以执行自校准命令,透过自校准可以计算出一个校准值。不需要软件干预,ADC会自动将该校准值反馈回ADC内部补偿ADC基础偏差,以保障转换数据的准确性。自校准的软件流程如下:
二、软件接口
自校准方式,其软件实例如下:adc_enable(ADC1,TRUE);adc_calibration_init(ADC1);while(adc_calibration_init_status_get(ADC1));adc_calibration_start(ADC1);while(adc_calibration_status_get(ADC1));注意:校准值的存放不会置位CCE标志,不会产生中断或DMA请求。
基本模式
一、功能介绍序列模式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. 抢占自动转换模式
二、软件接口
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);注意:抢占自动转换模式仅对抢占通道组有效;抢占自动转换模式与分割模式不可共用。
不同优先权的通道
一、功能介绍ADC设计有具备不同优先权的两种通道组:普通通道组与抢占通道组。普通通道组通常用于执行常规的数据转换。支持最多配置16个通道,转换将按照设定的通道顺序依次进行。其不具备抢占能力。抢占通道组通常用于执行相对紧急的数据转换。支持最多配置4个通道,转换将按照设定的通道顺序依次进行。其具备抢占能力,即抢占通道组的转换可以打断正在执行的普通通道转换,待抢占通道组转换完毕后再恢复执行被打断的普通通道组转换。
二、软件接口
普通通道组设定,软件包括通道数量、通道数值、转换顺序、采样周期的设定,其软件实例如下:/*config ordinary channel count*/adc_base_struct.ordinary_channel_length=3;adc_base_config(ADC1,&adc_base_struct);/*config ordinary channel*/adc_ordinary_channel_set(ADC1,ADC_CHANNEL_4,1,ADC_SAMPLETIME_41_5);adc_ordinary_channel_set(ADC1,ADC_CHANNEL_5,2,ADC_SAMPLETIME_41_5);adc_ordinary_channel_set(ADC1,ADC_CHANNEL_6,3,ADC_SAMPLETIME_41_5);抢占通道组设定,软件包括通道数量、通道数值、转换顺序、采样周期的设定,其软件实例如下:/*config preempt channel count*/adc_preempt_channel_length_set(ADC1,3);/*config preempt channel*/adc_preempt_channel_set(ADC1,ADC_CHANNEL_7,1,ADC_SAMPLETIME_41_5);adc_preempt_channel_set(ADC1,ADC_CHANNEL_8,2,ADC_SAMPLETIME_41_5);adc_preempt_channel_set(ADC1,ADC_CHANNEL_9,3,ADC_SAMPLETIME_41_5);注意:不同通道可以设定不同的采样周期;同一通道可以被反复编排进转换序列进行转换;序列模式下,普通通道组从OSN1开始转换,抢占通道组是从PSNx开始转换(x=4-PCLEN)。
多种独立的触发源
一、功能介绍ADC支持多种触发源,包含软件写寄存器触发(ADC_CTRL2的OCSWTRG与PCSWTRG)以及外部触发。外部触发包含定时器触发与引脚触发。普通通道还有一种特殊的触发来源,即重复使能ADCEN触发转换。此种情况下不需要使能ADC控制寄存器2(ADC_CTRL2)的OCTEN也可导致普通通道响应转换。注意:定时器触发、引脚触发、软件触发均需要使能触发模式(ADC_CTRL2的OCTEN与PCTEN)。表1. 触发源
二、软件接口
软件写寄存器触发设定,软件由单独的函数接口实现,其软件实例如下:/*config ordinary trigger source*/adc_ordinary_conversion_trigger_set(ADC1,ADC12_ORDINARY_TRIG_SOFTWARE,TRUE);/*config preempt trigger source*/adc_preempt_conversion_trigger_set(ADC1,ADC12_PREEMPT_TRIG_SOFTWARE,TRUE);在ADC使能tSTAB后,软件即可执行adc_ordinary_software_trigger_enable(ADC1,TRUE);/adc_preempt_software_trigger_enable(ADC1,TRUE);来进行普通/抢占通道的触发。外部触发设定,软件由单独的函数接口实现,其软件实例如下:/*config ordinary trigger source*/adc_ordinary_conversion_trigger_set(ADC12_ORDINARY_TRIG_TMR1CH1,TRUE);/*config preempt trigger source*/adc_preempt_conversion_trigger_set(ADC12_PREEMPT_TRIG_TMR3CH4,TRUE);在ADC使能tSTAB后,TMR1CH1的上升沿事件就会触发普通通道组转换,TMR3CH4的上升沿事件就会触发抢占通道组转换。注意:触发间隔需要大于通道组转换的时间,转换期间发生的相同通道组的触发会被忽略;抢占通道转换优先权最高,不管当前是否有普通通道转换,其触发后就会立即开始响应转换;普通触发具备记忆功能,在抢占转换时执行普通触发,该触发会被记录并在抢占转换完毕后响应。
数据后级处理
一、功能介绍ADC具备专有的数据寄存器,普通通道转换完成后数据存储于普通数据寄存器(ADC_ODT),抢占通道转换完成后数据存储于抢占数据寄存器x(ADC_PDTx)。数据寄存器内存储的是经过处理后的数据。该处理包括数据对齐、抢占数据偏移。数据对齐分左对齐和右对齐,以半字为基准摆放,如下图6。抢占数据偏移抢占通道的数据会减去抢占数据偏移寄存器x(ADC_PCDTOx)内的偏移量,因此抢占通道数据有可能为负值,以SIGN作为符号。图6. 数据内容处理
二、软件接口
数据对齐设定,软件由ADC基础部分结构体配置完成,其软件实例如下:adc_base_struct.data_align=ADC_RIGHT_ALIGNMENT;adc_base_config(ADC1,&adc_base_struct);抢占数据偏移设定,软件由单独的函数接口实现,其软件实例如下:/*set preempt channel's conversion value offset*/adc_preempt_offset_value_set(ADC1,ADC_PREEMPT_CHANNEL_1,0x000);adc_preempt_offset_value_set(ADC1,ADC_PREEMPT_CHANNEL_2,0x111);adc_preempt_offset_value_set(ADC1,ADC_PREEMPT_CHANNEL_3,0x202);adc_preempt_offset_value_set(ADC1,ADC_PREEMPT_CHANNEL_4,0x123);
过采样器
一、功能介绍ADC具备过采样功能。一次过采样是透过转换多次相同通道,累加转换数据后作平均实现的。
若平均后数据大于16位,只取靠右16位数据,放入16位数据寄存器。使用过采样时,忽视数据对齐及抢占数据偏移的设定,数据一律靠右摆放。表2. 最大累加数据与过采样倍数及位移系数关系
普通通道过采样被打断后的恢复方式普通通道过采样中途被抢占通道转换打断后的恢复方式由OOSRSEL设定
图7. 普通过采样被打断后的恢复方式
普通通道过采样触发模式普通通道过采样的触发模式由OOSTREN设定
此模式下,中途被抢占通道触发打断后,须重新触发普通通道才会恢复转换普通通道过采样。图8. 普通过采样触发模式
抢占通道过采样抢占过采样可与普通过采样同时使用,也可分别使用。抢占过采样不影响到普通过采样的各种模式。图9. 抢占自动转换下的过采样模式
二、软件接口过采样率、过采样移位及过采样使能设定,软件由单独的函数接口实现,其软件实例如下:/*set oversampling ratio and shift*/adc_oversample_ratio_shift_set(ADC1,ADC_OVERSAMPLE_RATIO_8,ADC_OVERSAMPLE_SHIFT_3);/*enable ordinary oversampling*/adc_ordinary_oversample_enable(ADC1,TRUE);
/*enable preempt oversampling*/
adc_preempt_oversample_enable(ADC1,TRUE);
普通通道过采样被打断后的恢复方式设定,软件由单独的函数接口实现,其软件实例如下:
/*set ordinary oversample restart mode*/adc_ordinary_oversample_restart_set(ADC1, ADC_OVERSAMPLE_CONTINUE);普通通道过采样触发模式设定,软件由单独的函数接口实现,其软件实例如下:/*disable ordinary oversampling trigger mode*/adc_ordinary_oversample_trig_enable(ADC1, FALSE);
电压监测
一、功能介绍ADC具备电压监测功能。用以监控输入电压与设定阈值的关系。当转换结果大于高边界ADC_VMHB[11:0]寄存器或是小于低边界ADC_VMLB[11:0]寄存器时,电压监测超出标志VMOR会置起。透过VMSGEN选择对单一通道或是所有通道监测。对单一通道监测的话,由VMCSEL配置通道。
二、软件接口
监测单一通道,软件由单独的函数接口实现,其软件实例如下:/*config voltage_monitoring*/adc_voltage_monitor_threshold_value_set(ADC1,0x100,0x000);adc_voltage_monitor_single_channel_select(ADC1,ADC_CHANNEL_5);adc_voltage_monitor_enable(ADC1,ADC_VMONITOR_SINGLE_ORDINARY_PREEMPT);监测所有通道,软件由单独的函数接口实现,其软件实例如下:/*config voltage_monitoring*/adc_voltage_monitor_threshold_value_set(ADC1,0x100,0x000);adc_voltage_monitor_enable(ADC1,ADC_VMONITOR_ALL_ORDINARY_PREEMPT);注意:电压监测一律以转换的原始数据与12位边界寄存器做比较,无视抢占偏移量与数据对齐的设定;若使用过采样器,则是以ADC_VMHB[15:0]与ADC_VMLB[15:0]完整的16位寄存器与过采样数据作比较。
中断及状态事件
一、功能介绍ADC含有多种中断及状态标志。应用需要结合这些标志进行程序设计。
注意:普通通道数据寄存器只有一个,CCE标志只会在序列转换完毕时置位,在多通道应用中,若通过查询CCE状态获取数据的话,每次只能获取序列的最后一个通道数据而造成数据丢失。因此普通通道多通道数据必须使用DMA方式获取。DMA读取转换数据会同步清除CCE标志。
二、软件接口
中断使能设定,软件由单独的函数接口实现,其软件实例如下:/*enable adc preempt channels conversion end interrupt*/adc_interrupt_enable(ADC1,ADC_PCCE_INT,TRUE);标志状态获取,软件由单独的函数接口实现,其软件实例如下:if(adc_flag_get(ADC1,ADC_VMOR_FLAG)!=RESET)标志状态清除,软件由单独的函数接口实现,其软件实例如下:adc_flag_clear(ADC1,ADC_PCCS_FLAG);
多种转换数据的获取方式
一、功能介绍
ADC具备多种转换数据的获取方式。不同通道类型可支持的数据获取方式不同。
二、软件接口
CPU读取抢占通道数据,软件由单独的函数接口实现,其软件实例如下:if(adc_flag_get(ADC1,ADC_PCCE_FLAG)!=RESET){adc_flag_clear(ADC1,ADC_PCCE_FLAG);adc1_preempt_valuetab[preempt_conversion_count][0]=adc_preempt_conversion_data_get(ADC1,ADC_PREEMPT_CHANNEL_1);adc1_preempt_valuetab[preempt_conversion_count][1]=adc_preempt_conversion_data_get(ADC1,ADC_PREEMPT_CHANNEL_2);adc1_preempt_valuetab[preempt_conversion_count][2]=adc_preempt_conversion_data_get(ADC1,ADC_PREEMPT_CHANNEL_3);preempt_conversion_count++;}CPU读取普通通道数据,软件由单独的函数接口实现,其软件实例如下:while(adc_flag_get(ADC1,ADC_CCE_FLAG)==RESET);*(p_adc1_ordinary++)=adc_ordinary_conversion_data_get(ADC1);DMA读取普通通道数据,软件由单独的函数接口实现,其软件实例如下:/*enable dma mode*/adc_dma_mode_enable(ADC1,TRUE);dma_flexible_config(DMA1,FLEX_CHANNEL1,DMA_FLEXIBLE_ADC1);dma_default_para_init(&dma_init_struct);dma_init_struct.buffer_size=3;dma_init_struct.direction=DMA_DIR_PERIPHERAL_TO_MEMORY;…dma_init(DMA1_CHANNEL1,&dma_init_struct);dma_channel_enable(DMA1_CHANNEL1,TRUE);注意:使用CPU读取普通转换数据时,为避免数据读取不及时,通道采样周期需要足够大。
ADC配置解析
以下对ADC的配置流程及数据获取方法进行说明。
ADC配置流程
ADC的配置一般包括如下内容
注意:此处仅是触发源的配置,触发源的使能需在ADC全部配置完毕后才可进行。
至此,ADC的初始化配置就算全部完成。随后,可通过软件或使能硬件触发源进行触发转换。
ADC数据获取方法
ADC支持多种数据获取方法,通常可概括为如下几种
全部0条评论
快来发表一下你的评论吧 !