大家在使用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采样时间之和。


点赞(0)

评论列表 共有 0 条评论

暂无评论