因为单片机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 版权协议,转载请附上原文出处链接和本声明。