lvuu 发表于 2022-11-18 18:45

STM32 ADC 采样时间计算与误差处理

一、采样计算

1.1 已知:

f * s = 1,时间与周期成反比。

1.2 未知:

如下参数:

1. 配置的STM32的系统时钟频率,例如:72MHZ。
2. 设置的ADC分频因子,例如:RCC_PCLK2_Div6,即6分频。
3. 设置的ADC采样时间,例如:ADC_SampleTime_239Cycles5, 即239.5个周期。
1.3 计算:

以系统时钟频率为72MHZ,ADC分频因子为RCC_PCLK2_Div6, ADC的采样时间为ADC_SampleTime_1Cycles5,进行计算

ADCCLK(ADC的时钟频率 ) = 72MHZ(系统时钟频率) / 6 (ADC分频因子) = 12MHZ。

一个ADC周期占用的时间 = 1 / 时钟频率 = 1 / 12MHZ = 0.0833334 uS
一次采样总的时间 = 采样时间 + 12.5个周期 = 1.5周期 + 12.5周期 = 14周期 = 14 * 0.0833334 = 1.166667 uS
两次采样间隔时间 = 1.166667 uS (ADCCLK为12MHZ时的最小采样间隔时间)

同理,计算ADCCLK为12MHZ时的最大采样间隔时间 = 239.5周期 + 12.5周期 = 252周期 = 21 uS

lvuu 发表于 2022-11-18 18:46

二、误差处理

2.1 较小误差

场景:
例:ADC基准电压为3.3V,进行采集电压值为1.65V。使用AD进行采样,采样值比应为0.5,但是实际采样值比在0.5附近徘徊。
处理:

固件库使用ADC_StartCalibration()函数进行ADC校准;
HAL库使用HAL_ADCEx_Calibration_Start()函数进行ADC校准。
注意:
ADC校准过程应该在 ADC开始函数之前,或者ADC结束函数之后。
以HAL为例:
HAL_ADCEx_Calibration_Start(&hadc);
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc, 0XFFFF);
value = HAL_ADC_GetValue(&hadc);
HAL_ADC_Stop(&hadc);
————————

lvuu 发表于 2022-11-18 18:47

2.2 采集值较小,误差较大

场景:
例:ADC基准电压为3.3V,进行采集电压值为1.65V。使用AD进行循环采样,采样值比应为0.5,但是实际采样值每次都小于0.5,并且误差较大。
处理:
由于采样周期太小导致采样不准确。
合理增大采样周期,视项目功能而定。
例如将ADC_SampleTime_1Cycles5修改为ADC_SampleTime_239Cycles5。
页: [1]
查看完整版本: STM32 ADC 采样时间计算与误差处理