对于参与智能汽车竞赛的新人来说,比较难的是不知道从哪里入手。回想起自己第一次做车的时候也遇到了这个问题,便在此增加一个章节,给大伙儿理理思路。这个章节并没有严格的区分软件和硬件,具体的一些思路顺序都是笔者个人的参赛经历总结而出,给大伙儿做个参考。

智能车制作初级阶段
智能车车的第一步是确定硬件配置。用什么微控制器,是常用的K60,KL26还是性能更好的K64,K66?常用的型号网上成熟的中文的资料较多也有不少第三方的资料支持。性能更好的产品带来更多的挑战,比如说要看英文的手册,但也可以运算更快,实现更复杂的算法。如果选择的微控制器带有FPU(Float Point Unit,浮点运算单元) ,则对于存在着大量浮点运算的平衡组就更好不过啦。
确定微控制器之后就要学习如何应用微控制器了,学习的方法和渠道有很多。我个人建议先用各类库学习上手,实现基本功能后看着Reference Manual学习寄存器操作。虽然现在半导体厂商大都提供官方的SDK或者库文件,但是学习寄存器操作也是很重要的,这一点我想中南大学的车友尤其是朱葛峻的学弟们应该更有感触。自然在确定型号之后,就要去实现功能了,比如说让线性CCD能采集到收据(GPIO和ADC),能采集到陀螺仪加速度计的数据(SPI或I2C或ADC)。然后让电机转起来(FTM产生PWM),让电机转起来之后为了实现闭环控制还需要对转速进行测量采集啊,这就需要对旋转编码器数据进行采集(FTM或LPTMR)。

这些基本功能实现了之后,咱们得让他们按照一个相对固定的运行时序工作,这就需要使用定时中断了(PIT)。如果想看看运行过程中的一些数据,常用的就是蓝牙模块,这就需要用到微控制器里的串口了(UART)。另外做摄像头的同学最好再看一下中断嵌套和中断优先级。当然,各种IDE工具也要学着用了啊,什么CodeWarrior、IAR、MDK、KDS(Kinetis Design Studio)之类的,找个自己喜欢用的用着顺手的。
接下来就是做硬件的同学重点关注了。硬件要学习的东西比较杂,也比较细,首先要了解器件。电容大伙儿都知道,那么电容有哪些分类?钽电容和其他的电解电容有什么区别,适用于哪些场合?为什么在电机驱动母线上加钽电容容易炸?这些都是需要了解的。类似的还有电感、电阻。对于器件还需要关注电气性能,需要查阅手册了解工作电压,工作电流和典型电路设计。关于这些本书前面的章节有了很好的介绍,资深工程师凤姐介绍的很详细了,下面我就继续说顺序和思路。

了解好最基本的电阻电容电感后,就可以看看常见的稳压芯片。稳压芯片要结合着其他功能模块一起看,比如说选用的微控制器的供电电压是多少,线性CCD的供电电压是多少,为什么有的人会在OLED的信号线上串联20-50Ω的电阻等等,这些都是要结合具体的外设进行设计的。与此同时要注意看功耗即最大输出电流,因为稳压芯片的输出能力是有限的,一个稳压芯片能给几个外部设备几个功能模块供电,是需要进行计算的。还要注意的是,要对稳压芯片的电流输出留有余量,比如说一个最大输出电流500ma的稳压芯片,咱们给外设供电的时候要留点余量,比如说只用400ma。
对于一个硬件工程师来说,焊接是基本功。如果焊接不过关,那么后面就会有很多奇奇怪怪的问题,比如说虚焊,这里借用超哥的一句话:"虚焊是万恶之源"。对于焊接,在焊接时最好在焊接台前放一个小的电扇,但是不要对着人吹。方向要反过来把焊接中产生的烟气吸走,在焊接完成后要及时关闭焊台避免烙铁头氧化。对于焊台里的海绵,不要弄得水太多,我自己的经验是将海绵用水湿润,用手轻轻的压一下就可以了。

对于刚刚入门的硬件来说,最好不要直接就画PCB板子。如果能用洞洞板(也有人叫万用板)手焊一些板子出来用用,会对后续的学习比较有帮助。因为在这个过程中即练习了焊接技术,也对电路板的设计有了更感性的认识。其实硬件的同学在很大程度上充当着定方案的角色,但这个并不是绝对的。因此需要做硬件的同学广泛的了解不同芯片,传感器的异同和优缺点。在了解好各个功能模块的供电和设计好电源管理之后,就可以进入硬件电路中比较大头的部分了,电机驱动的设计。
电机驱动一般由两种方案,集成芯片构成H桥和分立器件构成H桥。对于H桥的概念以及这两种方案的具体区别,设计前文中都有具体介绍,这里就不在赘述了,分立器件构成的电路在其他工程领域内应用的还是挺多的,建议还是仔细研读研究一下。对于传感器,平衡车中常用的姿态传感器,旋转编码器以及循迹传感器(线性CCD,摄像头,电磁传感器)的接口接口电路也要有所了解。电磁传感器的基本原理和放大方法也是很重要的一环,常用的放大电路芯片由LMV358,NE5532,LM386等等,另外基本上智能车竞赛中已经基本上没什么人用三极管对信号进行放大处理了。

在这里还有必要学习一下运算放大器的知识,比如说什么叫增益带宽积啊,是不是轨到轨运放啊。在学习上述内容的时候,其实就可以开始学习如何用EDA工具进行PCB板的绘制了,常用的工具有Altium Designer,Cadence,PCB的绘制中的细节,前面的章节也有介绍。如果是刚入门的电路,还是建议自己在洞洞板上搭一下验证一下再去画PCB,且不说如果打样回来电路不能用浪费钱,就是这个电路不能用这个事儿就挺闹心的。画PCB的时候也可以了解一下PCB制板的工艺流程,相信这些知识也会让你受益匪浅。
硬件电路中少不了需要调试,最常用的两个助手就是万用表和示波器。万用表使用时有几个点想提醒一下,电压档和电流档的接头是不一样的,用完后最好及时恢复常用状态(通常是电压档),自己在用的时候也要检查一下接头的接口位置和档位的选择。笔者之所以强调这一点是因为见过因此造成的炸机。另外一点是蜂鸣档的使用,蜂鸣档可以用来简单的判断的通断,但是这不是判断问题根源的绝对因素。因为蜂鸣档是当阻抗低于某一数值就会发出鸣叫,最好的判断短路的方法还是打到电阻档看阻抗。

示波器的使用也不用多说,看信号看波形的助手,但是示波器测量电压并不是很准。另外用示波器的时候注意看清楚用的是直流档还是交流档,经常有同学测了半天测不出来数据,结果过去一看测得一个电压信号用的交流档。无论是我们自己用洞洞板焊接出来的电路,还是外出PCB打样的PCB板,在第一次上电时建议分区域分功能焊接并检测。焊接好第一个电源模块后,上个电用万用表测测电压是不是我们想要的,然后一步一步的焊接测试。这样可以最大程度的减少硬件电路的损坏并发现问题。哪怕你这个电路这个板子之前已经用过好久,我还是建议这样做。因为板厂的工艺并不是能够保证百分之百的稳定。
还记得当年我们第一次用沉金工艺的一块电路板,一回来电源和地线就是短路的,那酸爽简直不敢相信。另外关于车模的搭建,智能车制作论坛上有很多往届参赛车模的照片,第一次搭建可以先仿制结构。
我们再看软件,软件的同学在学会用单片机之后就可以开始学习PID控制技术。智能车是用的是数字PID,对应的数字PID分为增量式和绝对式两种,其实在智能车领域内这两个方法的最终效果是一样的,因为智能车的执行机构无论是舵机还是电机都不具有积分特性,最终接收的信号都是绝对的数值而非增量数值。普通的PID学会了可以看看PID的各类改进型,比如说积分分离PID,微分先行PID等等。学习好了可以在单片机上写写看,看看有没有疑问,接下来就可以尝试在车上进行实验和运行了。

在小车的制作过程中,时时刻刻要记得分清主要矛盾和次要矛盾。在绝大多数情况下要先解决有无问题再去解决好坏问题。对于首次在车模实体上进行实验,首先需要解决的是让电机转起来。别的不说,先输出个PWM让电机转起来,并借此记录下来电机运行的正方向。下一步我们就要研习算法让小车站起来了。
平衡车想站起来得先获取姿态倾角,如何获取姿态倾角呢,前文也是有介绍的。在这里想强调一点(敲黑板!划重点!),要确定一个正方向。比如说以小车前进方向为正方向,倾角以向前倾斜为正方向等等。正方向的方向可以不一样,但是一定要统一。获取倾角之后就可以利用倾角偏差让车站起来了,简单的PD控制就可以让车站起来。这个PD参数整定的时候建议慢慢来,不要一下子给的很大,这样没准儿电机一猛转就扫齿了。看车有站起来的趋势再慢慢的把参数给大。有时候你调了半天参数还是站不起来,可以检查一下正方向的问题。

当平衡车站起来了,你也就完成了万里长征的第一步(入了这个坑就慢慢走吧,既来之则安之)。这时候就涉及到一些平衡组老司机常说的一个内容,车调的软了,车调的硬了。其实这里的软硬是平衡车抗拒外界扰动的能力,最简单的近乎玄学的方法就是用手握住车,前后小幅度的掰,感受车模反抗的力度大小。至于PD参数的大小还是要自己去体会了。
在调试过程中要做好防撞保护工作,其实在完成了姿态解算之后就可以加一个最简单的软件保护。简单的说就是一个撞停保护,设定个倾角阈值。阈值要设定两个哟,因为平衡车的倾角在运行过程中是可以变化的,保不齐是向前倒还是向后倒呢。当平衡车的姿态倾角超过这个阈值时关掉PWM的输出,让电机停下来防止电机的疯转使车模受损。
在这里插一句放在这里可能不太沾边的话,如果你调好的车(四轮车也如是),进入运行状态后电机就开始疯转,也许是编码器除了问题,比如说线头虚了或者是编码器坏了。不仅软件上要做保护,硬件和机械上也要做点处理。比方说在车前面加一小块防撞泡沫,在发生撞击时起到一个缓冲的作用。调试的时候也要注意,如果车撞了电机发生堵转,一定要在第一时间过去关掉电源。因为发生堵转时通过电机驱动和电机的电流极大,十分容易将电机或者驱动烧坏。

在十一届比赛的的赛场上笔者就亲眼目睹了两次电机堵转。一次是B车冲出赛道撞到防护泡沫上发生堵转,电机驱动冒烟,部分焊锡融化,及时将电源关闭后还能正常使用。另一次的结果就比较伤感了,C车撞击到障碍上,车手没有及时的去将电源关掉(可能是期待车模能蹭过去),然后就看着C车小电机里面各种嘣火花、冒烟,等参赛队员再次发车时发现,电机不转坏掉了。记得笔者最初对车模进行调试时甚至在小车上帮了一根绳子,最终放开手脚把绳子解掉还是到了分区赛的预赛。
在姿态控制调好之后,个人建议先去调试一下方向控制。当然这里所说的方向控制是指实现功能。比方说前面有偏差了,车子能不能有个反应。电磁车斜放在跑道上能不能摆正,光电车和摄像头车前面放个引导线,车子能不能跟引导线移动而运动。当然这里面会涉及到循迹传感器的使用,所以这里的一两句话一带而过的背后还是需要同学们对循迹传感器做一些了解。

所以,在完成了姿态控制和方向控制之后,速度控制就要来了。笔者一直认为速度控制是平衡车的精髓,也是最不好调的部分。因为速度控制和姿态控制之间是有耦合关系的。二者之间的关系在前文中也有了叙述,在这里也就不再多说些什么了。
智能车制作进阶
初级阶段实际上是实现了基本功能,只是能让车跑起来。要想让车跑的更好,咱们还得再多付出一些努力。关于进阶阶段也只是说一点自己的经验和想法,大伙儿还是要放开思路,不要局限在此。
既然是进阶阶段,最好能做个上位机,看数据方便一些。看数据常用的方法有两种,一种是用蓝牙把数据发出来;另一种则是用SD卡把数据存下来。用蓝牙的话要注意波特率设置,波特率不能太大,太大的话容易误码,也不能太小,太小的话发送速度太慢。蓝牙的发送数据量相对比较小并且相对比较耗时。在这里也做个小的提示,咱们平衡车里面浮点计算多,如果想要发送浮点数,要记得乘以一个大的数然后再发出来。这样就避免了可能存在的截断误差。

如果在调车时发现加了蓝牙后,车的运行就不那么正常了,那十有八九是蓝牙传输耗时太长对程序运行的时序产生了影响。简单的看看数据变化,把数据从串口助手中导出来放进MATLAB就可以了。如果想功能做的更强大一点还是推荐用C++制作。有了这些工具,数据观测就方便多了,也就可以更好地找问题,定位bug了。
其次还可以去试试别的控制方法,比如说模糊控制。尤其是在方向控制上,模糊控制还是可以大有作为的。硬件电路在后期主要工作还是做稳定,在保证稳定的前提下尽可能的将板子做的小一点。电路在做稳定的同时,也可以尝试一些新的东西。比如说在电机调速的方面使用双闭环控制,这就需要在电机驱动上增加电流采样传感器。传感器可以是专用的芯片,也可以是采样电阻。
本着学习的目的还是可以将这两个电路同时放在一个板子上的。用跳线或者电阻焊盘进行选择。当然这里说的跳线和0欧姆电阻只是一个方法和思路,在电机驱动这种通过电流较大的地方一定要注意器件的电流通过能力。在实际做产品的时候,通常也需要对方案进行对比。常用的一个方法就是在电路上设计多个方案,然后通过跳线或者0欧姆电阻进行选择。之所以做多个方案,要考量多个方案的性能差异和特点,还要考量制作成本的问题。对于目前参加竞赛的同学们来说,由于购买的总数量相对比较小,所以还并不是特别在意器件成本的问题。然而如果是一个产品,在大规模生产之后,可以用这么一句话来说:"电路板上没有一个电阻一个电容是多余的!"

软件上可以尝试用一下恩智浦官方提供的嵌入式软件电机控制和电源转换库。嵌入式软件库包含了基础数学运算和高级数学变换。这些数据库经过高度的优化,提供C语言调用函数接口。库函数分为六组:
数学库(MLIB):基本的数学运算(加、减、乘、除、移位等);
常规函数库(GFLIB):包括了基本的数学运算,三角函数,简单的查表以及常规的PID控制器;
通用电机控制库(CMCLIB):包含矢量调制、Park和Clarke变换、特定电机相关函数等,用于构建数字化控制的电机驱动;
常规数字滤波器库(GDFLIB):带通滤波器;
高级控制库(AMCLIB):可以在没有位置或速度传感器的前提下,通过磁场定向控制技术构建变速交流电机驱动系统,提供了极低成本解决方案;
电源控制库(PCLIB):包含电源转换应用所需的控制回路算法,例如:PI、PID和带低通滤波器控制器的PID,2P-2Z和3P-3Z控制器算法;
每一个库都以单独的模块提供,这些库的接口都已合并到一个公共接口文件中,从而减少了应用程序所需的文件数量。应用汇编语言编写的最基础的数学、滤波器和电机控制的相关函数,优化了执行速度。做软件的同学不妨尝试一下,感觉这个库还是很给力的。
后期在一定程度上还要注意轮胎,摩擦摩擦,提高摩擦力也是蛮重要的。在这里还要提高车模对赛场环境的适应性,换个场地能不能跑,能不能跑好都是挑战。在进阶阶段上面,有时候更多的还是要多花费时间在分析数据和理论学习上面,知其然知其所以然。因为越到后面,理论的作用越强大。

文中插图,来自于河海大学文天学院智能车队