复用IO口,ADC采样

  • Post author:
  • Post category:其他


因为单片机IO是复用,20ms的采样等待,IO消除本身的输出高电压,电容电压值。

所以存在电池ADC值采样抖动,速度ADC采样抖动加周期干扰。

在这里插入图片描述

调试RP1的值可降低,速度ADC干扰。

从软件上;

1.用消抖滤波法,消除电池的电路的抖动干扰。

2.用一阶互补滤波,消除速度周期性干扰。

unsigned char 	icnt = 0;	//去抖次数
unsigned long	Value = 0;	//上次测量值
unsigned long	New_Value = 0;//当前测试值

void Get_Bat_Value(void)
{
    static unsigned char i = 0;
 
    New_Value = get_Bat_value();
    icnt = 0;//去抖清零
    while(New_Value != Value)//判断当前值与上次测量值是否相等
	{
		icnt++;
		if(icnt >= 12)//不同的值超过去抖上限,退出测量
		{
			Value = New_Value;//将当前值替代为上次测量值
			break;
		}
		New_Value = get_Bat_value();//测量当前值,等待下次与上次测量值进行比较
	}
        sum_vbat = New_Value;
//        sum_vbat += 20;
        sum_vbat = (unsigned long)(sum_vbat*1000);
        sum_vbat = sum_vbat/4096;  
        
        smoothbuf_vbat += sum_vbat  ;
        i++;
       if(i >= 20)
       {
         Vbat_value  = smoothbuf_vbat / 20;
         Bat_Level_Judge();
         smoothbuf_vbat = 0;
         i=0;
       }
 
}
unsigned long sum_speed = 0;	
unsigned long sum_speed_num = 0;

void Get_Speed_Value(void)
{
   static  unsigned char i = 0;
   static  unsigned long temp_data = 0;//上次滤波平均值
   static  unsigned long ad_ave = 0;//平均之后的本次滤波
   static  unsigned long ad_sum = 0;//上次滤波的7倍与本次滤波之和
  
     ad_sum = temp_data * 8;
     ad_sum =  ad_sum - temp_data + get_speed_value() ;
     ad_ave = ad_sum / 8;
     temp_data = ad_ave;
   
     sum_speed =  temp_data; 
     sum_speed = (unsigned long) (sum_speed*7000);	// / 4096; 
     
     sum_speed =sum_speed / 4096;
     //一阶滤波  
      
      smoothbuf_speed += sum_speed;    
      i++;  
      if(i >= 10)
      {
        sum_speed_num = smoothbuf_speed / 10 ;
     
        smoothbuf_speed = 0;
        i=0;
      }

      speed_Calculate();//速度转换
}```



版权声明:本文为weixin_46039185原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。