第一:前言
用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 是可变的。
第一:前言
用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 是可变的。
举报