STM32自带AD采样滤波方法

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();
  }


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydgd118

您的鼓励是我最大的动力!谢赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值