一、采样计算
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
二、误差处理
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);
2.2 采集值较小,误差较大
场景:
例:ADC基准电压为3.3V,进行采集电压值为1.65V。使用AD进行循环采样,采样值比应为0.5,但是实际采样值每次都小于0.5,并且误差较大。
处理:
由于采样周期太小导致采样不准确。
合理增大采样周期,视项目功能而定。
例如将ADC_SampleTime_1Cycles5修改为ADC_SampleTime_239Cycles5。
其他:
觉得有用请点赞,谢谢!!!