大家在使用ADC采样的时候是否计算过ADC的采样率,这个问题非常关键!
以下为GD32F303系列MCU中有关ADC的参数,其中ADC时钟最大值为40MHz,12位分辨率下最大采样率为2.86MSPS.如果ADC时钟超频的话,可能会造成ADC采样异常,因而对于ADC时钟以及采样率的计算很重要。
首先给大家介绍下ADC时钟如何配置,如下为RCU时钟树中有关ADC时钟的说明,通过ADCPSC控制位可以选择ADC时钟来自于AHB还是APB2分频,若ADCPSC配置为0,ADC时钟为APB2时钟2/4/6/8/12/16分频,若ADCPSC配置为1,ADC时钟为AHB时钟5/6/10/20分频。
ADC时钟配置可通过以下rcu_adc_clock_config函数实现。
/*! \brief configure the ADC prescaler factor \param[in] adc_psc: ADC prescaler factor only one parameter can be selected which is shown as below: \arg RCU_CKADC_CKAPB2_DIV2: ADC prescaler select CK_APB2 / 2 \arg RCU_CKADC_CKAPB2_DIV4: ADC prescaler select CK_APB2 / 4 \arg RCU_CKADC_CKAPB2_DIV6: ADC prescaler select CK_APB2 / 6 \arg RCU_CKADC_CKAPB2_DIV8: ADC prescaler select CK_APB2 / 8 \arg RCU_CKADC_CKAPB2_DIV12: ADC prescaler select CK_APB2 / 12 \arg RCU_CKADC_CKAPB2_DIV16: ADC prescaler select CK_APB2 / 16 \arg RCU_CKADC_CKAHB_DIV5: ADC prescaler select CK_AHB / 5 \arg RCU_CKADC_CKAHB_DIV6: ADC prescaler select CK_AHB / 6 \arg RCU_CKADC_CKAHB_DIV10: ADC prescaler select CK_AHB / 10 \arg RCU_CKADC_CKAHB_DIV20: ADC prescaler select CK_AHB / 20 \param[out] none \retval none */ void rcu_adc_clock_config(uint32_t adc_psc)
ADC时钟计算好后,根据不同的分辨率就可以计算采样率了,如下图所示,不同的分辨率对应的采样转换时间是不同的,比如12位分辨率,采样转换就需要14个ADCCLK。
综上举例:如果系统时钟AHBCLK为120M,APB2时钟为60M,如果ADC时钟配置为rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6),那么ADCCLK的时钟为60M/6=10M,若ADC配置为12位分辨率,则ADC采样转换时间为14/10M=1400ns,采样率为10M/14=714KSPS.
画两个重点:1、ADC采样时钟一定不要超过手册标注的最大值;2、若采样定时触发ADC采样的话,定时触发的周期要大于多通道ADC采样时间之和。
发表评论 取消回复