STM32
直播中

骨灰级发烧友

12年用户 673经验值
私信 关注
[问答]

怎样去计算STM32 ADC的采样率呢

怎样去计算STM32 ADC的采样率呢?ADC采样率最高的时钟是什么?

回帖(1)

周颂焱

2021-10-26 11:33:06
  第一:前言
  用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 是可变的。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分