前言
由于STM32F1ADC的精度最高位12位,在一些精度要求高的场景明显不足,因此需要提高ADC的精度,这里采用过采样发来提高ADC精度
一、软件实现部分
我是基于正点原子战舰V3的板子来实现的,主要就是对输入信号设置好相应的采样率,满住奈奎斯特的至少两倍原则。然后根据要提高多少位精度对多少个ADC采集数据进行相加,然后进行移位来确定精度(不是简单的取平均)。
下面展示一些 内联代码片
。
// A code block
/*ADC_OVSR:过采样率,取值2,4,8,16,32,64,128,256*/
#define ADC_OVSR 256
/*ADC_shif:ADC结果右移,0~8/
#define ADC_shift 4
//在freemodbus下我只能实现15位精度,因为他的保持寄存器是u16的,还不知道怎么改底层函数
void adc_20bit_value(void)
{
static u32 adc_buff=0,adc_sum = 0;
static float adc_volt=0;
if(adc_500ms_flag == 1)
{
adc_500ms_flag=0;
printf("\r\n The current AD value = %d \r\n", ADCConvertedValue);
printf("The acurate AD value = %d \r\n", ADC_ACCURATE_DAT);
printf("The acurate AD value = %.8f \r\n", adc_volt);
}
if(adc_10ms_flag == 1) //¹ý²ÉÑùµÃµ½16λadcÖµ
{
adc_10ms_flag = 0;
for(adc_buff=1;adc_buff<=ADC_OVSR;adc_buff++)
{
adc_sum = adc_sum+ADCConvertedValue;
if(adc_buff==ADC_OVSR)
{
ADC_ACCURATE_DAT = adc_sum>>ADC_shift;
adc_sum = 0;
}
}
adc_volt= (float)ADC_ACCURATE_DAT/1048576*3.3;
}
}