我将 ADC3 配置为 16 倍过采样,但实际得到的过采样倍数却是翻倍的 ——ADC3 通道 1 测得值为 5V(实际应为 2.5V)、ADC3 通道 4 测得值为 3.3V(实际应为 1.65V)。
在初始化函数void MX_ADC3_Init(void)中,我配置的参数是:
hadc3.Init.Oversampling.Ratio = 16;
hadc3.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_4;
我跟踪了HAL_ADC_Init()函数的源码,发现这段逻辑:
#if defined(ADC_VER_V5_V90)
if (hadc->Instance == ADC3)
{
/* Configuration of Oversampler: */
/* - Oversampling Ratio */
/* - Right bit shift */
/* - Triggered mode */
/* - Oversampling mode (continued/resumed) */
MODIFY_REG(hadc->Instance->CFGR2,
ADC_CFGR2_OVSR |
ADC_CFGR2_OVSS |
ADC_CFGR2_TROVS |
ADC_CFGR2_ROVSM,
ADC_CFGR2_ROVSE |
hadc->Init.Oversampling.Ratio |
hadc->Init.Oversampling.RightBitShift |
hadc->Init.Oversampling.TriggeredMode |
hadc->Init.Oversampling.OversamplingStopReset
);
}
else
{
当Ratio设为 16 时,代码直接将该值写入CFGR2寄存器,最终导致实际过采样倍数变成了 32 倍。
我将Ratio手动改为0x0C后,得到了预期的采样结果。
|
|