这里可以看到,怎么多了一个参数(上面确实有解释说明,应该填写什么),但是当时我第一反应是看一下这个参数在函数中是怎么用的,于是搜索了一下SingleDiff 这个参数,发现在HAL_ADCEx_Calibration_Start 这个函数中根本没用到这个参数?
为了搞清楚,我还去度娘问了下,发现根本没有关于这个参数的说明,所有的 STM32 ADC 有关的帖子文章,都是一样的, ADC 是啥啥啥,什么模式,解释一下,怎么用等等巴拉巴拉的……
3.1 单端校准和差分校准其实上面的注释说明就是,这个参数就是用来选择使用哪种校准方式:单端校准ADC_SINGLE_ENDED 和 差分校准ADC_DIFFERENTIAL_ENDED。
后来就去翻阅手册资料,下面是查到的说明,这里给大家参考一下:
单端校准:
单端校准是指对 ADC 的单个输入通道进行校准,主要校准项包括偏移误差和增益误差。
单端校准主要针对单端输入的情况,通过比较参考电压和输入信号之间的误差,校准ADC的增益和偏置电压。在单端输入的情况下,参考电压和输入信号之间存在可能的偏差,这会导致ADC采样结果的偏移和误差。为了解决这个问题,可以使用单端校准来校正 ADC 的增益和偏置电压。单端校准的过程是使用一个已知的模拟信号来输入 ADC,然后比较采样结果与该模拟信号的期望值,得到增益和偏置电压的偏差值,然后通过校准将其校正。
单端校准时,ADC将使用内部参考电压作为参考电压,对每个输入通道进行测量,计算出偏移误差和增益误差,并将这些误差保存在相应的寄存器中。
差分校准:
差分校准是指对 ADC 的差分输入通道进行校准,主要校准项也包括偏移误差和增益误差。
差分校准主要针对差分输入的情况,通过比较参考电压和输入信号之间的误差,校准 ADC 的差分增益和偏置电压。在差分输入的情况下,差分增益和偏置电压的偏差也会导致 ADC 采样结果的偏移和误差。为了解决这个问题,可以使用差分校准来校正 ADC 的差分增益和偏置电压。差分校准的过程是使用一个已知的差分输入信号来输入 ADC,然后比较采样结果与该差分输入信号的期望值,得到差分增益和偏置电压的偏差值,然后通过校准将其校正。
差分校准时,ADC 将使用内部参考电压作为参考电压,并将两个输入通道的差值作为输入信号进行测量,计算出偏移误差和增益误差,并将这些误差保存在相应的寄存器中。
3.2 不同系列的校准函数所以在我们使用不同的系列的 HAL 库的时候,虽然校准函数都是HAL_ADCEx_Calibration_Start ,但是也有着一些参数的区别。
对于我目前使用的 STM32L051 来说,HAL校准函数使用的示例如下:
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
大部分情况下直接选择单端校准ADC_SINGLE_ENDED就行了,差分校准还需要外部电路的支持。
对于 STM32F 系列的来说,HAL校准函数使用的示例如下:
HAL_ADCEx_Calibration_Start(&hadc1);
......
3.3 更多的校准模式对于更多的系列,因为自己目前没有用到,我也没有一个一个去找,但是通过资料了解到,对于有些型号,比如 STM32F4 系列的,ADC的校准由硬件自动执行,不需要额外的调用 ADC 校准函数。
虽然我没有去试,但是这个硬件自动执行校准在 STM32CubeMX 中应该可以选择,因为他需要使能,在程序中的体现为:
hadc1.Init.AutoCalibration = ENABLE;
而且在 STM32 系列中,还有支持额外校准模式(共模校准、差分共模校准)的MCU,具体哪个我也不知道,这样的MCU,在使用校准函数HAL_ADCEx_Calibration_Start的时候又多一个参数。但是这里可以告诉大家在遇到的时候不要慌张,这里给出示例。
共模校准:
/*
使能共模校准
*/
HAL_ADCEx_Calibration_Start(&hadc, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
/* 等待共模校准完成 */
while (HAL_ADCEx_Calibration_GetState(&hadc) != HAL_ADC_CALIBRATION_STATE_COMPLETED);
差分共模校准:
/*
使能差分共模校准
*/
HAL_ADCEx_Calibration_Start(&hadc, ADC_CALIB_OFFSET, ADC_DIFFERENTIAL_ENDED);
/*
等待差分共模校准完成
*/
while (HAL_ADCEx_Calibration_GetState(&hadc) != HAL_ADC_CALIBRATION_STATE_COMPLETED);
上面的 ADC_CALIB_OFFSET 是指定进行偏置校准。