STM32自带AD采样滤波方法
本方法实测有效,可以提高转换精度。数据采集滤波求平均值的方法也可以用于其他专业AD转换芯片。如果转换要求高精度,必须注意REF参考源电压的稳定性。
uint32_t ADC_Single_Convert(void)
{
HAL_GPIO_WritePin(ADC_GPIO_Port,ADC_Pin, GPIO_PIN_RESET); //打开ADC开关
HAL_Delay(10);//等待电压稳定
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 50);
uint8_t i=255;
while (!HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
{
i--;
if (i ==0)
{
break; //防止AD死循环
}
}
uint32_t ad_Temp = HAL_ADC_GetValue(&hadc1);
HAL_GPIO_WritePin(ADC_GPIO_Port,ADC_Pin, GPIO_PIN_SET); //关闭ADC开关
return ad_Temp;
}
/*电压采样14次,去掉2个最大值,2个最小值,剩余10个值求平均数*/
void ADC_Dxpd(void)
{
int i, j, temp, isSorted;
//优化算法:最多进行 n-1 轮比较
for(i=0; i<14-1; i++)
{
isSorted = 1; //假设剩下的元素已经排序好了
for(j=0; j<14-1-i; j++)
{
if(adc_nums[j] > adc_nums[j+1])
{
temp = adc_nums[j];
adc_nums[j] = adc_nums[j+1];
adc_nums[j+1] = temp;
isSorted = 0; //一旦需要交换数组元素,就说明剩下的元素没有排序好
}
}
if(isSorted) break; //如果没有发生交换,说明剩下的元素已经排序好了
}
}
/*求10个数的平均值*/
uint16_t ADC_Average(void)
{
uint16_t sum = 0;
for(uint8_t i=2; i<12; i++)
{
sum = sum + adc_nums[i];
}
return sum/10;
}
void Get_Batvotage(void)
{
uint16_t Value_average;
HAL_ADC_MspInit(&hadc1);
HAL_Delay(1);
HAL_ADCEx_Calibration_Start(&hadc1);//自校准
HAL_Delay(10);
for(uint8_t i=0; i<14; i++)
{
adc_nums[i] = ADC_Single_Convert();
HAL_Delay(10);
}
HAL_ADC_Stop(&hadc1);
HAL_ADC_MspDeInit(&hadc1);
ADC_Dxpd();
Value_average = ADC_Average();
}