最近用stm32 去检测电压发现会偏差70mv左右,而且上下波动20mv左右
于是找到了一些解决方法
1.最重要的一步
在初始化adc之后,进行校准
MX_ADC1_Init();
HAL_Delay(200);
HAL_ADCEx_Calibration_Start(&hadc1);
关于延时本人经测试,并没有太大差别,但又帖子说明,可以减小误差,自行测试。
2.延长采样时间
(1)在配置中修改
(2)在代码中修改
找到下面代码中simplingtime,右键查找ADC_SAMPLETIME_71CYCLES_5的定义,选择你所需要的周期
//void MX_ADC1_Init(void)
//{
// ADC_ChannelConfTypeDef sConfig = {0};
/** Common config
*/
// hadc1.Instance = ADC1;
// hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
// hadc1.Init.ContinuousConvMode = DISABLE;
// hadc1.Init.DiscontinuousConvMode = DISABLE;
// hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
// hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
// hadc1.Init.NbrOfConversion = 1;
// if (HAL_ADC_Init(&hadc1) != HAL_OK)
// {
// Error_Handler();
}
/** Configure Regular Channel
*/
// sConfig.Channel = ADC_CHANNEL_0;
// sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
// if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
// {
// Error_Handler();
// }
//}
计算公式:
采样时间=(12.5+采样周期)/时钟频率
3.进行软件滤波
这里采样最简单的方法
因为我测得数据中发现是围绕着目标值上下波动,且周期性出现尖峰,
直接采样多次测量,取平均值得方法。
for(i=0; i<max; i++ )
{ HAL_ADC_Start(&hadc1);
while(HAL_OK==HAL_ADC_PollForConversion(&hadc1,10))
{
HAL_ADC_Stop(&hadc1);
sum+=HAL_ADC_GetValue(&hadc1);
}
}
adc_Value=sum/max;
sum=0;
adc_Value=adc_Value*3300/4096;//采集到的out电压 mv
4.其他原因导致的测量偏差
最主要的就是没有共地,或者多地。
测试中,实用的stm32f103rc8t6最小系统板,因为采样了usb转ttl模块供电,同时使用了,usb线,接在排插上供电,多地,导致测量数据大幅偏差。