STM32 ADC采样率如何计算

第一:前言

用STM32 采集数据必须依据信号源设置采样频率。根据奈奎斯特定律,采样率必须是信号源最大频率的2倍以上,但是在实际的需求当中,采样率应该是Fs>3Fmax .

采样周期=转换时间+读取时间 .   

转换时间=采样时间+12个时钟周期(STM32F4)或者  转换时间=采样时间+12.5个时钟周期(STM32F1)

采样时间是STM32采集模拟量的时间,采集的时间越长越精。对于每个要转换的通道,采样时间建议尽量长一点,以获得较高的准确度,但是这样会降低ADC的转换速率。

第二:方法

以STM32F407ZGT6为例, AHB 域的最大频率为168MHz。高速 APB2 域的最大允许频率为168MHz。低速 APB1 域的最大允许频 率为 42 MHz。

/** 
  * @brief   ADC Common Init structure definition  
  */ 
typedef struct 
{
  uint32_t ADC_Mode;                      /*!< Configures the ADC to operate in 
                                               independent or multi mode. 
                                               This parameter can be a value of @ref ADC_Common_mode */                                              
  uint32_t ADC_Prescaler;                 /*!< Select the frequency of the clock 
                                               to the ADC. The clock is common for all the ADCs.
                                               This parameter can be a value of @ref ADC_Prescaler */
  uint32_t ADC_DMAAccessMode;             /*!< Configures the Direct memory access 
                                              mode for multi ADC mode.
                                               This parameter can be a value of 
                                               @ref ADC_Direct_memory_access_mode_for_multi_mode */
  uint32_t ADC_TwoSamplingDelay;          /*!< Configures the Delay between 2 sampling phases.
                                               This parameter can be a value of 
                                               @ref ADC_delay_between_2_sampling_phases */
  
}ADC_CommonInitTypeDef;

ADC_Prescaler : 设置ADC 的时钟频率,一共有4个选项,2分频,4分频和8分频。

#define ADC_Prescaler_Div2                         ((uint32_t)0x00000000)
#define ADC_Prescaler_Div4                         ((uint32_t)0x00010000)
#define ADC_Prescaler_Div6                         ((uint32_t)0x00020000)
#define ADC_Prescaler_Div8                         ((uint32_t)0x00030000)

因此我们需要找到被分频的时钟频率是多少? 来自于时钟树的APB2(高速总线),APB1(低速总线)  。

APB2负责AD,I/O,高级TIM,串口1。APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM

#define RCC_APB2Periph_ADC               ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00000400)
	

ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );//采样时间

采样时间是很重要的指标:

#define ADC_SampleTime_3Cycles                    ((uint8_t)0x00)
#define ADC_SampleTime_15Cycles                   ((uint8_t)0x01)
#define ADC_SampleTime_28Cycles                   ((uint8_t)0x02)
#define ADC_SampleTime_56Cycles                   ((uint8_t)0x03)
#define ADC_SampleTime_84Cycles                   ((uint8_t)0x04)
#define ADC_SampleTime_112Cycles                  ((uint8_t)0x05)
#define ADC_SampleTime_144Cycles                  ((uint8_t)0x06)
#define ADC_SampleTime_480Cycles                  ((uint8_t)0x07)
#define IS_ADC_SAMPLE_TIME(TIME) (((TIME) == ADC_SampleTime_3Cycles) || \
                                  ((TIME) == ADC_SampleTime_15Cycles) || \
                                  ((TIME) == ADC_SampleTime_28Cycles) || \
                                  ((TIME) == ADC_SampleTime_56Cycles) || \
                                  ((TIME) == ADC_SampleTime_84Cycles) || \
                                  ((TIME) == ADC_SampleTime_112Cycles) || \
                                  ((TIME) == ADC_SampleTime_144Cycles) || \
                                  ((TIME) == ADC_SampleTime_480Cycles))

对于STM32F407  主频时钟是168Mhz

ADC 采样率最高的是时钟是:最大采样率: 168/((12+3)*(2*2))=2.8Mhz

                                                 最小采样率: 168((12+480)*(2*8))=21341Hz

                                                   总结12 是不变的,480 和3 是变化的,2 是不变的属于APB2 时钟,但是 DIV8 和DIV2  是可变的。

 

 

 

参考:http://news.eeworld.com.cn/mcu/article_2016101230376.html

          https://blog.csdn.net/Cowena/article/details/50389652

 

  • 13
    点赞
  • 171
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值