智能车浅谈——抗干扰技术软件篇

软件抗干扰技术

前面介绍了一些硬件抗干扰技术,不难发现,要做好一个完美的硬件系统是需要花大心思的,而且很多硬件抗扰方案都需要借助一些元器件来实现,这在一定程度上增加了费用,而且也增加了硬件设计时的难度,这对于学生党而言有些许的不友好,实际上,在抗扰技术方面除了之前提到的硬件抗扰技术外,我们常用的还有软件抗扰技术。今天博主就来扒一扒我们智能车中常用的部分软件抗扰技术。
开始介绍抗干扰技术之前,先给大家分享一个知识点吧,我们都知道对于一个控制系统,输入信号越平滑越好,可大多数情况下输入的数据往往需要我们处理后才能变得平滑,甚至有些波形十分凌乱我们还会采用一些数学方案让他变得近似一条直线或者曲线,那么为什么一定要使用信号处理手段让输入信号变得平滑或者是近似线性呢?难道输入原始信号就不能实现控制效果了吗?(这里是笔者根据自动控制原理推测,并没有明确的理论推断,如有不妥,欢迎大家指出)
相信大家最容易想到的解释就是,输入信号决定了输出信号,如果不处理这些杂乱的输入信号,那么输出的信号就会一片混乱,系统也就无法达到稳态,进而控制效果也就不理想。
对于这个疑问笔者有这样一个想法,在自动控制原理以及计算机控制原理里面有介绍,我们平时研究的经典控制系统都是线性定常系统,学过自动控制原理的同学肯定都还记得有个叫稳态误差的东西,在求稳态误差的方法中,有一个方法是根据系统型别进行计算,想必下面这个表大家还有印象,当然没学过自控的同学肯定没印象,我们抛开那些理论知识,可以从表中看见两个规律:
1.系统输入r(t)不变时,随着型别的提高,表中的数据越来越小,这个数据就是稳态误差;
2.当系统型别不变时,随之输入信号的不断升级(从位置信号1(t)—>速度信号t----->加速度信号1/2t^2)系统的稳态误差不断增加。
在这里插入图片描述
上面是理论部分的描述,接下来我们看个例子,考虑到有些同学没学自控啊,这里不摆传函这些东西;注意下面三幅图,蓝色代表输入,红色代表系统的输出,
首先第一幅图很明显输入是一个阶跃信号可以理解为数字从0变为了1,该系统的输出经过两拍后可以实现无差跟随,稳态误差为零
然后是第二幅图,输入信号是一个一次函数也就是速度信号,该系统也是经历了两拍后就可以无差跟踪,稳态误差为零
最后是第三幅图,可以发现输入信号变成了一条曲线一个二次函数也就是加速度信号,此时可以发现系统输出与输入之间恒存在偏差,无法做到无差跟踪,稳态误差不再为零了。以此类推一下,如果输入信号变成了一个三次函数,此时根据上面提到的理论,稳态误差会进一步加大,系统输出无法跟随输入信号,此时系统就没法正常工作了。
在这里插入图片描述
根据上面这个例子,我们再扩充一下,智能车实际上也是一个线性定常系统,它肯定也要遵循上面的控制规律,假设我们小车是个二型系统,要想让系统稳定工作,输入信号是不是最多最多只能是加速度信号,输入信号超过二次时系统就没法无差跟随输入了。
有人可能会说,根据上面的理论知识,想让系统可以跟随更高阶的信号不是还可以提高系统型别来实现吗,显然,提高系统型别也是一个可行方案,但是自控中所有的东西都是双刃剑,有利它必然会带来弊端,提高系统型别后,系统的稳定裕度就会减小,也就意味着控制器的参数更难调节,大家自己想想,现在一个PID的参数都要很长时间才能调的合适,如果再提高系统型别,是不是真的可以一年做车时间都用来调参了呢,除此之外,整个系统其他部分的环节已经固定了,要想改变系统型别只能改变控制器的算法,这也会加大单片机内部的运算量,同时还会影响到系统的响应速度。

数字信号的抗干扰措施

数字输入信号软件抗干扰措施

干扰信号多呈毛刺状,而且作用时间短,而数字信号作用时间相对要长得多。
改进:在采样某一数字信号时,可多次重复采样,直到连续两次或两次以上采样结果完全一致方为有效。如果多次采样后,信号始终变化不定,则说明干扰严重,就应停止采样,并且发出报警信号,类似输入如下图时。
在这里插入图片描述

数字输出信号软件抗干扰措施

为了防止受数字输出信号控制的输出设备受干扰产生误动作,最有效的方法是不断重复输出数字输出信号,并且在可能条件下,输出的重复周期越短越好。外设接收一个错误的信息后,还来不及做出有效的反应,下一个正确的输出信息又到来了,就可以及时防止错误动作的发生,克服干扰的影响。

数字滤波

数字滤波是一种软件算法,它实现从采样信号中提取出有效信号数值,滤除干扰信号的功能。
数字滤波与模拟滤波相比,具有很多优点。
首先,由于采用了程序实现滤波,无需硬件器件,不受外界的影响,也无参数变化等问题,所以可靠性高,稳定性好;
数字滤波可以实现对频率很低(如0.01Hz)信号的滤波,克服了模拟滤波器的不足;
数字滤波还可以根据信号和干扰的不同,采用不同的滤波方法和滤波参数,具有灵活、方便、功能强等优点。
缺点:数字滤波不足之处在于滤波速度比硬件滤波要慢,会造成信号的延迟,影响系统响应速度;但鉴于数字滤波器具有的上述优点,在计算机控制系统中得到了广泛的应用。下面介绍几种常用的数字滤波方式。

算术平均值滤波

思路:
连续取 N 个采样值进行算术平均运算
N 值较大时: 信号平滑度较高, 但灵敏度较低
N 值较小时: 信号平滑度较低, 但灵敏度较高
N 值的选取: 一般流量, N=12; 压力: N=4
优点:
适用于对一般具有随机干扰的信号进行滤波
这样信号的特点是有一个平均值, 信号在某一数值范围附近上下波动
缺点:
对于测量速度较慢或要求数据计算速度较快的实时控制不适用
比较浪费RAM
在这里插入图片描述
算术平均值滤波程序流程图如下:
在这里插入图片描述
C语言代码片

// An highlighted block
/*
*/
#define N 12
char filter()
{
	int sum = 0;
	for ( count=0;count<N;count++)
	{
		sum + = get_ad();
		delay();
	}
return (char)(sum/N);
}

智能车中最常用于对ADC采集值进行处理,进行一个平滑处理消除个别毛刺信号。 代码如下:

// An highlighted block

LnowADC[0] = ADC1_Read_Average(ADC1ch0_A0,10);   // 左前侧第1个电感,与赛道平行,采集各个电感的AD值
  LnowADC[1] = ADC1_Read_Average(ADC1ch1_A1,10);   // 左前侧第2个电感,与垂直赛道,
  LnowADC[2] = ADC1_Read_Average(ADC1ch8_B0,10); // 右前侧第2个电感,与垂直赛道,
  LnowADC[3] = ADC1_Read_Average(ADC1ch9_B1,10);  // 右前侧第1个电感,与赛道平行,
/*LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
【函数名】u16 ADC1_Read_Average(ADC_CHx_e ADC_Channel_x,uint8_t times)
【功  能】获取几次ADC1采样值的平均值
【参数值】ADC_Channel_x , x为0~16
【返回值】ADC读到的值
【作  者】L Q
【最后更新】2021年1月22日 
【软件版本】V1.0
【调用样例】 ad_v=ADC1_Read_Average(ADC1ch12_C2);
QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ*/
u16 ADC1_Read_Average(ADC_CHx_e ADC_Channel_x,uint8_t times)
{
  u32 temp_val=0;
  u8 t,delay;
  for(t=0;t<times;t++)
  {
    temp_val+=ADC1_Read(ADC_Channel_x);
    for(delay=0;delay<50;delay++);
  }
  return temp_val/times;
}

中值滤波

思路:
连续采样 N 次(N 取奇数)
把 N 次采样值按大小排列
取中间值为本次有效值
B、 优点:
能有效克服因偶然因素引起的波动干扰
对温度、 液位的变化缓慢的被测参数有良好的滤波效果
C、 缺点:
对流量、 速度等快速变化的参数不宜
C语言代码片

// An highlighted block
#define N 11
char filter()
{
	char value_buf[N];
	char count,i,j,temp;
	for ( count=0;count < N;count++)
	 {
		value_buf[count] = get_ad();
		delay();
	}
	for (j=0;j<N-1;j++) //冒泡法
	{
		for (i=0;i<N-1-j;i++)
		{
			if ( value_buf[i]>value_buf[i+1] )
			{
				temp = value_buf[i];
				value_buf [i]= value_buf[i+1];
				value_buf[i+1] = temp;
			}
		}
	}
	return value_buf[(N-1)/2];
}

滑动平均滤波

递推平均滤波法(又称滑动平均滤波法)
思路:
把连续取 N 个采样值看成一个队列
队列的长度固定为 N
每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
把队列中的 N 个数据进行算术平均运算,就可获得新的滤波结果
N 值的选取: 流量, N=12; 压力: N=4; 液面, N=4~12; 温度, N=1~4
优点:
对周期性干扰有良好的抑制作用, 平滑度高
适用于高频振荡的系统
缺点:
灵敏度低
对偶然出现的脉冲性干扰的抑制作用较差
不易消除由于脉冲干扰所引起的采样值偏差
不适用于脉冲干扰比较严重的场合
比较浪费 RAM
内联代码片

// An highlighted block
/*
*/
#define N 12
char value_buf[N];
char i=0;
char filter()
{
char count;
int sum=0;
value_buf[i++] = get_ad();
if ( i == N ) i = 0;
for ( count=0;count<N;count++) sum = value_buf[count];
return (char)(sum/N);
}

在这里插入图片描述
有关数字滤波器还有很多,大家可以根据自己的需求去尝试,我也上传了一个滤波器的文档到资源,需要的同学自行下载。

归一化

归一化,见名知意,就是把所有采集到的参数转换为同一个范围的数据,归一化的思路:获取变量最大值,并记录,后面所有的采集值都与此最大值进行对比,根据比值再×对应的数据范围即可。
主要作用是消除更换场地后电磁信号出现的偏差。 代码片

// An highlighted block
/*************************************************************************
*  函数名称:void InductorNormal(void)
*  功能说明:采集电感电压并归一化;
*  参数说明:无
*  函数返回:无
*  修改时间:2020年11月18日
*  备    注:   注意要先标定运放的放大倍数,尽量四个一致或者接近
*************************************************************************/
void InductorNormal (void)
{
  LnowADC[0] = ADC1_Read_Average(ADC1ch0_A0,10);   // 左前侧第1个电感,与赛道平行,采集各个电感的AD值
  LnowADC[1] = ADC1_Read_Average(ADC1ch1_A1,10);   // 左前侧第2个电感,与垂直赛道,
  LnowADC[2] = ADC1_Read_Average(ADC1ch8_B0,10); // 右前侧第2个电感,与垂直赛道,
  LnowADC[3] = ADC1_Read_Average(ADC1ch9_B1,10);  // 右前侧第1个电感,与赛道平行,
  
  if (LnowADC[0] < ad_min[0])
         LnowADC[0] = ad_min[0];     // 刷新最小值
     else if (LnowADC[0] > ad_max[0])
         LnowADC[0] = ad_max[0];     // 刷新最大值
     if (LnowADC[1] < ad_min[1])
         LnowADC[1] = ad_min[1];
     else if (LnowADC[1] > ad_max[1])
         LnowADC[1] = ad_max[1];
     if (LnowADC[2] < ad_min[2])
         LnowADC[2] = ad_min[2];
     else if (LnowADC[2] > ad_max[2])
         LnowADC[2] = ad_max[2];
     if (LnowADC[3] < ad_min[3])
         LnowADC[3] = ad_min[3];
     else if (LnowADC[3] > ad_max[3])
         LnowADC[3] = ad_max[3];

     // 40 70 70 40
     LleftV = (LnowADC[0] - ad_min[0]) * 100 / (ad_max[0] - ad_min[0]);     // 各偏移量归一化到0--100以内
     LleftP = (LnowADC[1] - ad_min[1]) * 100 / (ad_max[1] - ad_min[1]);
     LrightP = (LnowADC[2] - ad_min[2]) * 100 / (ad_max[2] - ad_min[2]);     // 各偏移量归一化到0--100以内
     LrightV = (LnowADC[3] - ad_min[3]) * 100 / (ad_max[3] - ad_min[3]);
     MagneticField = LleftV+LleftP+LrightP+LrightV;
}

使用归一化后所有的采集数据都被归到1-100内,可以根据比例调节各特征参数,这样可以解决更换场地后带来的影响。
在这里插入图片描述

差比和

差比和可以很好地使输入变得平滑且能保证数据波动不那么剧烈,能够是系统输入尽可能的平滑。如下图所示系列1为归一化后的左右电感差值,系列二为差比和后的效果,对比可以发现差比和后的波形明显比原始波形波动范围小。
差比和的思路就是两个输入变量的差值比上两个输入变量的和而后再乘以合适的比例即可。
ServoDuty=(LleftV-LrightV)*600/(LleftV+LrightV);
在这里插入图片描述

CPU及程序的抗干扰措施

CPU是计算机的核心。当CPU受到干扰不能按正常状态执行程序时,就会引起计算机控制的混乱,这就是通常所说的程序“跑飞”或“死机”,所以需要采取措施,使CPU在受到干扰的情况下,尽可能无扰地恢复系统正常工作。
注意:尤其是在单片机系统中,应当充分考虑系统的抗干扰性能。
下面是几种常见的针对CPU的抗干扰措施:

复位

对于失控的CPU,最简单的方法是使其复位,程序自动从头开始执行。为完成复位功能,在硬件电路上应设置复位电路。
复位方式有上电复位、人工复位和自动复位三种。

掉电保护

在软件中,应设置掉电保护中断服务程序,该中断为最高优先级的非屏蔽中断,使系统能对掉电作出及时的反应。
首先进行现场保护,把当时的重要状态参数、中间结果,甚至某些片内寄存器的内容一一存入具有后备电池的RAM中。
其次是对有关外设作出妥善处理,如关闭各输入输出口,使外设处于某一非工作状态等。
最后必须在片内RAM的某一个或两个单元存入特定标记的数字,作为掉电标记,然后,进入掉电保护工作状态。

Watchdog技术

当程序“跑飞”到一个临时构成的死循环中时,冗余指令和软件陷阱将不起作用,造成系统完全瘫痪。看门狗技术,可以有效解决这一问题。
当系统运行时,看门狗与CPU同时工作。程序正常运行时,会在规定的时间内由程序向看门狗发复位信号,使定时系统重新开始定时计数,没有输出信号发出;当程序“跑飞”并且其他的措施没有发挥作用时,看门狗便不能在规定的时间内得到复位信号,其输出端会发出信号使CPU系统复位。
代码片

// An highlighted block
int main(void)
{
	All_Init();
	while(1)
	{
	
		IWDG_Feed();  				//每次运行完毕进行喂狗

        All_Module_ProDeal();           //所有的动作
        Usart1_Command_Handle();		//串口控制
		Display();						//显示函数
		Key_Action();					//按键操作函数 
		//保证每次while循环的时间固定,消除程序运行时的时序混乱 		
        while(1)
        {
            if(delay_10ms_Arrive)		//定时10ms到达标志位
            {
                delay_10ms_Arrive = 0;	//定时10ms到达标志位
                break;
            }
        }
	}	
}

总结

整个智能车的系列到此也就结束了,欢迎大佬们来批评指正,笔者也已经开始搬砖了,关于八邻域、边沿检测、拟合、曲率这些后面看情况,工作不忙就更,前面有疑问的同学可以私信,但回复可能不会那么的及时,望谅解。也祝愿大家新年新气象,智能车都取得好成绩。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

其中W是我们的权重,X是我们的输入,b是偏置,)">
< <上一篇
下一篇>>