文章目录软件抗干扰技术数字信号的抗干扰措施数字输入信号软件抗干扰措施数字输出信号软件抗干扰措施数字滤波算术平均值滤波中值滤波滑动平均滤波归一化差比和CPU及程序的抗干扰措施复位掉电保护Watchdog技术总结智能车系列文章汇总软件抗干扰技术前面介绍了一些硬件抗干扰技术不难发现要做好一个完美的硬件系统是需要花大心思的而且很多硬件抗扰方案都需要借助一些元器件来实现这在一定程度上增加了费用而且也增加了硬件设计时的难度这对于学生党而言有些许的不友好实际上在抗扰技术方面除了之前提到的硬件抗扰技术外我们常用的还有软件抗扰技术。今天博主就来扒一扒我们智能车中常用的部分软件抗扰技术。开始介绍抗干扰技术之前先给大家分享一个知识点吧我们都知道对于一个控制系统输入信号越平滑越好可大多数情况下输入的数据往往需要我们处理后才能变得平滑甚至有些波形十分凌乱我们还会采用一些数学方案让他变得近似一条直线或者曲线那么为什么一定要使用信号处理手段让输入信号变得平滑或者是近似线性呢难道输入原始信号就不能实现控制效果了吗这里是笔者根据自动控制原理推测并没有明确的理论推断如有不妥欢迎大家指出相信大家最容易想到的解释就是输入信号决定了输出信号如果不处理这些杂乱的输入信号那么输出的信号就会一片混乱系统也就无法达到稳态进而控制效果也就不理想。对于这个疑问笔者有这样一个想法在自动控制原理以及计算机控制原理里面有介绍我们平时研究的经典控制系统都是线性定常系统学过自动控制原理的同学肯定都还记得有个叫稳态误差的东西在求稳态误差的方法中有一个方法是根据系统型别进行计算想必下面这个表大家还有印象当然没学过自控的同学肯定没印象我们抛开那些理论知识可以从表中看见两个规律1.系统输入r(t)不变时随着型别的提高表中的数据越来越小这个数据就是稳态误差2.当系统型别不变时随之输入信号的不断升级从位置信号1t—速度信号t-----加速度信号1/2t^2)系统的稳态误差不断增加。上面是理论部分的描述接下来我们看个例子考虑到有些同学没学自控啊这里不摆传函这些东西注意下面三幅图蓝色代表输入红色代表系统的输出首先第一幅图很明显输入是一个阶跃信号可以理解为数字从0变为了1该系统的输出经过两拍后可以实现无差跟随稳态误差为零然后是第二幅图输入信号是一个一次函数也就是速度信号该系统也是经历了两拍后就可以无差跟踪稳态误差为零最后是第三幅图可以发现输入信号变成了一条曲线一个二次函数也就是加速度信号此时可以发现系统输出与输入之间恒存在偏差无法做到无差跟踪稳态误差不再为零了。以此类推一下如果输入信号变成了一个三次函数此时根据上面提到的理论稳态误差会进一步加大系统输出无法跟随输入信号此时系统就没法正常工作了。根据上面这个例子我们再扩充一下智能车实际上也是一个线性定常系统它肯定也要遵循上面的控制规律假设我们小车是个二型系统要想让系统稳定工作输入信号是不是最多最多只能是加速度信号输入信号超过二次时系统就没法无差跟随输入了。有人可能会说根据上面的理论知识想让系统可以跟随更高阶的信号不是还可以提高系统型别来实现吗显然提高系统型别也是一个可行方案但是自控中所有的东西都是双刃剑有利它必然会带来弊端提高系统型别后系统的稳定裕度就会减小也就意味着控制器的参数更难调节大家自己想想现在一个PID的参数都要很长时间才能调的合适如果再提高系统型别是不是真的可以一年做车时间都用来调参了呢除此之外整个系统其他部分的环节已经固定了要想改变系统型别只能改变控制器的算法这也会加大单片机内部的运算量同时还会影响到系统的响应速度。数字信号的抗干扰措施数字输入信号软件抗干扰措施干扰信号多呈毛刺状而且作用时间短而数字信号作用时间相对要长得多。改进在采样某一数字信号时可多次重复采样直到连续两次或两次以上采样结果完全一致方为有效。如果多次采样后信号始终变化不定则说明干扰严重就应停止采样并且发出报警信号类似输入如下图时。数字输出信号软件抗干扰措施为了防止受数字输出信号控制的输出设备受干扰产生误动作最有效的方法是不断重复输出数字输出信号并且在可能条件下输出的重复周期越短越好。外设接收一个错误的信息后还来不及做出有效的反应下一个正确的输出信息又到来了就可以及时防止错误动作的发生克服干扰的影响。数字滤波数字滤波是一种软件算法它实现从采样信号中提取出有效信号数值滤除干扰信号的功能。数字滤波与模拟滤波相比具有很多优点。首先由于采用了程序实现滤波无需硬件器件不受外界的影响也无参数变化等问题所以可靠性高稳定性好数字滤波可以实现对频率很低如0.01Hz信号的滤波克服了模拟滤波器的不足数字滤波还可以根据信号和干扰的不同采用不同的滤波方法和滤波参数具有灵活、方便、功能强等优点。缺点数字滤波不足之处在于滤波速度比硬件滤波要慢会造成信号的延迟影响系统响应速度但鉴于数字滤波器具有的上述优点在计算机控制系统中得到了广泛的应用。下面介绍几种常用的数字滤波方式。算术平均值滤波思路连续取 N 个采样值进行算术平均运算N 值较大时 信号平滑度较高 但灵敏度较低N 值较小时 信号平滑度较低 但灵敏度较高N 值的选取 一般流量 N12 压力 N4优点适用于对一般具有随机干扰的信号进行滤波这样信号的特点是有一个平均值 信号在某一数值范围附近上下波动缺点对于测量速度较慢或要求数据计算速度较快的实时控制不适用比较浪费RAM算术平均值滤波程序流程图如下C语言代码片。// An highlighted block/* */#defineN12charfilter(){int sum0;for(count0;countN;count){sumget_ad();delay();}return(char)(sum/N);}智能车中最常用于对ADC采集值进行处理进行一个平滑处理消除个别毛刺信号。代码如下// An highlighted blockLnowADC[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_vADC1_Read_Average(ADC1ch12_C2); QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ*/u16ADC1_Read_Average(ADC_CHx_e ADC_Channel_x,uint8_t times){u32 temp_val0;u8 t,delay;for(t0;ttimes;t){temp_valADC1_Read(ADC_Channel_x);for(delay0;delay50;delay);}returntemp_val/times;}中值滤波思路连续采样 N 次N 取奇数把 N 次采样值按大小排列取中间值为本次有效值B、 优点能有效克服因偶然因素引起的波动干扰对温度、 液位的变化缓慢的被测参数有良好的滤波效果C、 缺点对流量、 速度等快速变化的参数不宜C语言代码片。// An highlighted block#defineN11charfilter(){char value_buf[N];char count,i,j,temp;for(count0;countN;count){value_buf[count]get_ad();delay();}for(j0;jN-1;j)//冒泡法{for(i0;iN-1-j;i){if(value_buf[i]value_buf[i1]){tempvalue_buf[i];value_buf[i]value_buf[i1];value_buf[i1]temp;}}}returnvalue_buf[(N-1)/2];}滑动平均滤波递推平均滤波法又称滑动平均滤波法思路把连续取 N 个采样值看成一个队列队列的长度固定为 N每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的 N 个数据进行算术平均运算,就可获得新的滤波结果N 值的选取 流量 N12 压力 N4 液面 N4~12 温度 N1~4优点对周期性干扰有良好的抑制作用 平滑度高适用于高频振荡的系统缺点灵敏度低对偶然出现的脉冲性干扰的抑制作用较差不易消除由于脉冲干扰所引起的采样值偏差不适用于脉冲干扰比较严重的场合比较浪费 RAM内联代码片。// An highlighted block/* */#defineN12char value_buf[N];char i0;charfilter(){char count;int sum0;value_buf[i]get_ad();if(iN)i0;for(count0;countN;count)sumvalue_buf[count];return(char)(sum/N);}有关数字滤波器还有很多大家可以根据自己的需求去尝试我也上传了一个滤波器的文档到资源需要的同学自行下载。归一化归一化见名知意就是把所有采集到的参数转换为同一个范围的数据归一化的思路获取变量最大值并记录后面所有的采集值都与此最大值进行对比根据比值再×对应的数据范围即可。主要作用是消除更换场地后电磁信号出现的偏差。代码片。// An highlighted block/************************************************************************* * 函数名称void InductorNormal(void) * 功能说明采集电感电压并归一化 * 参数说明无 * 函数返回无 * 修改时间2020年11月18日 * 备 注 注意要先标定运放的放大倍数尽量四个一致或者接近 *************************************************************************/voidInductorNormal(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];// 刷新最小值elseif(LnowADC[0]ad_max[0])LnowADC[0]ad_max[0];// 刷新最大值if(LnowADC[1]ad_min[1])LnowADC[1]ad_min[1];elseif(LnowADC[1]ad_max[1])LnowADC[1]ad_max[1];if(LnowADC[2]ad_min[2])LnowADC[2]ad_min[2];elseif(LnowADC[2]ad_max[2])LnowADC[2]ad_max[2];if(LnowADC[3]ad_min[3])LnowADC[3]ad_min[3];elseif(LnowADC[3]ad_max[3])LnowADC[3]ad_max[3];// 40 70 70 40LleftV(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]);MagneticFieldLleftVLleftPLrightPLrightV;}使用归一化后所有的采集数据都被归到1-100内可以根据比例调节各特征参数这样可以解决更换场地后带来的影响。差比和差比和可以很好地使输入变得平滑且能保证数据波动不那么剧烈能够是系统输入尽可能的平滑。如下图所示系列1为归一化后的左右电感差值系列二为差比和后的效果对比可以发现差比和后的波形明显比原始波形波动范围小。差比和的思路就是两个输入变量的差值比上两个输入变量的和而后再乘以合适的比例即可。ServoDuty(LleftV-LrightV)*600/(LleftVLrightV);CPU及程序的抗干扰措施CPU是计算机的核心。当CPU受到干扰不能按正常状态执行程序时就会引起计算机控制的混乱这就是通常所说的程序“跑飞”或“死机”所以需要采取措施使CPU在受到干扰的情况下尽可能无扰地恢复系统正常工作。注意尤其是在单片机系统中应当充分考虑系统的抗干扰性能。下面是几种常见的针对CPU的抗干扰措施复位对于失控的CPU最简单的方法是使其复位程序自动从头开始执行。为完成复位功能在硬件电路上应设置复位电路。复位方式有上电复位、人工复位和自动复位三种。掉电保护在软件中应设置掉电保护中断服务程序该中断为最高优先级的非屏蔽中断使系统能对掉电作出及时的反应。首先进行现场保护把当时的重要状态参数、中间结果甚至某些片内寄存器的内容一一存入具有后备电池的RAM中。其次是对有关外设作出妥善处理如关闭各输入输出口使外设处于某一非工作状态等。最后必须在片内RAM的某一个或两个单元存入特定标记的数字作为掉电标记然后进入掉电保护工作状态。Watchdog技术当程序“跑飞”到一个临时构成的死循环中时冗余指令和软件陷阱将不起作用造成系统完全瘫痪。看门狗技术可以有效解决这一问题。当系统运行时看门狗与CPU同时工作。程序正常运行时会在规定的时间内由程序向看门狗发复位信号使定时系统重新开始定时计数没有输出信号发出当程序“跑飞”并且其他的措施没有发挥作用时看门狗便不能在规定的时间内得到复位信号其输出端会发出信号使CPU系统复位。代码片。// An highlighted blockintmain(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_Arrive0;//定时10ms到达标志位break;}}}}总结整个智能车的系列到此也就结束了欢迎大佬们来批评指正笔者也已经开始搬砖了关于八邻域、边沿检测、拟合、曲率这些后面看情况工作不忙就更前面有疑问的同学可以私信但回复可能不会那么的及时望谅解。也祝愿大家新年新气象智能车都取得好成绩。智能车系列文章汇总智能车浅谈——硬件篇智能车浅谈——方向控制篇智能车浅谈——电机控制篇智能车浅谈——图像篇智能车浅谈——控制规律篇智能车浅谈——过程通道篇智能车浅谈——抗干扰技术硬件篇智能车浅谈——抗干扰技术软件篇