当前位置:首页 > 公众号精选 > TsinghuaJoking

01

为什么参加这个比赛?

从小到大,一直就对遥控车比较着迷,但是所限于技术力和财力不足,一直没能真正的研究有关小车的控制这方面。大一其实也了解过这个比赛,不过真正让我开始行动的,还是十八届的自制车模组别。当时看到有关自制车模的相关规则后,我就开始着手进行独立的车模设计。不过,很可惜,当时自制的车模因为没有考虑到电机的扭矩问题,甚至都不能正常的控制跑直线。至此,大二告一段落。

虽然第一次自制车模直接就给了我当头一棒,但是我仍然没有停下脚步.

总结了一下自己的失败原因:采用直驱结构,高速电机扭矩不够。车身太过于沉重,控制起来惯性很大。以及成本较为昂贵,这对于试错来说算是一个致命的缺点。

02 FOC电机设计

何要使用FOC电机呢?源于第一次自制车模经历的失败,经过我在互联网上的不断搜索,得到了一个答案:无刷电机扭矩大,可以直驱(念念不忘的直驱方案)。并且FOC控制的无刷电机效果要更好。

虽然当时甚至不知道无刷是什么原理驱动转起来的,但总要有一些勇往直前的精神,所以我就开始沉浸于无刷电机驱动的知识当中。从开始的电机开环转动、闭环异常(没校准零点)、成功闭环,再到后来的性能优化,控制结构创新,特殊功能制作。这里,耗费了大约整整半年的时间。不过,这段时间里也学到了许多新的知识,学会了从知网寻找算法并且进行落地,学会了很多的控制结构,也详细的了解了各种电机的驱动方式。

一、FOC电机特点

1、性能的优异性

所谓的FOC,其实是一种控制算法,叫成FOC电机多数是指带有FOC控制算法的无刷电机。而FOC的全称是:矢量磁场控制。简单理解就是可以控制出来任意方向的磁场,因为无刷电机没有电刷结构,所以可以避免掉启动阶段的扭矩小这个问题。可以一直以最大的扭矩牵引电机的转子进行转动。相比于有刷电机,FOC控制的电机可以做到满扭矩起步,瞬间切换正反转(仅会被惯性影响切换速度),静音高效(因为没有换向器的火花损耗),并且可以做到低速控制仍然精确。

2、高效的控制

我做的这个FOC电机采用的是CAN通讯方案,因为CAN通讯具有抗共模电压(不需要共地),并且自带CRC和重发机制,可以完美适应控制类的传输。

为了适应速度指令同步生效的需求,通过使用CAN ID0作为广播地址,使用控制位写入同步标志位后,再使用ID0进行广播同步。

3、性能开销的优化

FOC因为涉及到电流解算,park和clark的变换和逆变换。导致所需计算量大大增加。STC的芯片虽然已经有了浮点加速和整数加速功能,但是经过实测,速度仍然不能达到很快。处理完成的一次程序大约需要1ms左右。这显然是不能被接受的。

所以我直接给电流采样和解算砍掉了,因为有感的FOC在生成指定Q轴电压的情况下,已经相当准确了。进行电流解算闭环的作用主要是靠控制精确的Uq和Ud实现更高的动态新能,这里因为性能不允许,所以我就通过尽可能高的性能优化提高控制频率。这里,我使用了查表压缩的方式,将实现SVPWM所需要的PWM占空比数据直接对应到磁编码器的原始数据上。并且根据SVPWM波形的相似性,仅仅存储了一相波形的1/4。然后通过移相和对称映射,就可以实现直接根据编码器原始数据生成对应需求的PWM占空比数据。最后实现的是仅仅使用8K的ROM,就实现了14位精度磁编码器的SVPWM查表映射。这样,多次的浮点类型计算就可以被压缩到一次查表操作,然后只需要两次左右的整数计算,即可得到三相PWM所需要的占空比数据。大大提高了控制的效率。最后的测试成绩是,位置环控制频率11Khz(理想设定的是16Khz,但是会被执行延迟拖慢,所以还有优化空间)。

二、速度模式的实现

速度控制其实是FOC无刷电机的一个极大优势之一,因为可以做到极快的响应速度和非常准确的速度控制。

调节速度环的时候,一直不满足于速度跃变的响应。便一直在思索如何能实现更高的性能。

经过分析,发现提升性能的就只有一条路——提高控制频率,提高控制频率也就等于变相的提高了控制环路的带宽。

此时整个控制系统对于一些微小扰动的反应就会更加灵敏,从而进一步的提升反应速度。

先介绍一些普通的FOC(带有电流环)的控制实现思路,普通的FOC的各级控制环路大多设置为电流环16Khz,速度环8Khz,位置环4Khz。这样调整位置的时候

控制上是位置环串速度环串电流环。更多的干扰交给电流环进行抵抗干扰。这样上层的位置环和速度环的控制频率就不需要这么高的。

但是我的STC-FOC Lite版本因为算力和成本问题,去掉了电流环。所以并没有办法使用电流环进行抗扰动。而之前我设置的是速度模式是速度环4Khz,输出给16Khz的电压控制。

这样并不能完全的发挥出控制性能来,但是此时事情又迎来了转机,我发现如果位置环工作在16Khz下,可以将位置模式的控制性提高的非常高的水准。

所以,我就设计出了以下的控制结构框图:

整个系统只存在一个PID控制环节,并且没有电流解算过程,整个系统运行效率非常的高。这样,因为去掉电流环损失的抗干扰能力,从位置环的高带宽这里就又找回来了。

并且因为我的速度完全是靠计算位置得到的,所以根本就没有引入速度观测的误差和延迟。

体现在测速上就是抗干扰极强且不会受到负载扰动。

三、舵机模式的实现

舵机模式应该算是一种低成本的无刷舵机平替了,因为使用的直驱,可以完美的避免因为外部受力过大造成的齿轮扫齿问题。

并且受到超过抵抗力矩的冲击时,还可以进入堵转保护,有效保护电机。

并且速度极快,可以说没有任何的无刷舵机能比这个更快了(因为是直驱方案,所以也会损失掉力量部分,算是一个小小的缺点吧,毕竟速度和力量总是不能同时拥有的)

不过,单纯的舵机实现,仅仅就是一个带了限位的位置模式而已,如何让这个舵机模式变得更好用呢?

我根据实际的应用场景,做了个自动寻找限位功能,并且带有自动回中。

主要效果就是:上电默认为速度模式,发送模式切换指令到舵机模式,此时电机自行进入不可打断的位置模式寻找机械结构限位,寻找完左右两侧的限位后,自动计算左右限位的中点,自行回正。

并且自动将限位内的范围映射到-1000~+1000的数值上,供舵机模式使用。也就是说,如果限位大小更改,只要两边限位保持对称,那么中点就不会变,而且数值范围仍然是正负1000,不用重新计算匹配问题。

当然,如果完全没有限位,电机会在左转半圈和右转半圈后回正,此时可以为360度舵机。

下面讲解一下原理实现:

首先会记忆当前绝对位置信息,然后分别向左和向右探测边界,探测条件是堵转保护被触发。探测过程中,探测到一个边界以后,会回到第一次记得绝对位置,然后再次向另一边探测。探测出左右边界以后,剩下就是使用位置模式实现了。

这部分程序是CAN处理舵机模式的数据,对输入数据叠加识别到边界位置后,交给位置环处理。

03 CCD摄像头

一、底层效率创新

虽然最后去赛场上的小车并没有装上,但是我仍然对CCD摄像头进行过一定程度的研究,这里也分享一下我的研究成果。

去比赛交流的时候,我也交流过,有发现使用两个或者更多的摄像头情况下,采样使用for循环,进而有些挤占算法功能的运行时间。

我的思路是使用PWM触发ADC采样,输出一个PWM用于CCD的CLK信号,然后使用PWM触发ADC功能,对输出AO端口进行采样,这样可以保证曝光时间的稳定,以及采样间隔的稳定。

同时,使用内存双缓冲保证处理时间和采样时间的不冲突,并且使用了M2M-DMA直接进行内存复制,减轻内核处理压力。

二、摄像头的噪声降低

采样帧率变快以后,因为电压相较低帧率变低,也就更容易受到外界噪声的干扰。此时,缩短MCU和CCD芯片之间的采样线长度,就变得十分重要了。

我通过使用传感器和STC芯片正反对贴的方式,将采样线距离减小到了3mm左右,并且通过进行模拟地和数字地分割。将干扰降到最低。最后,实现了无滤波手段下的900帧CCD图像无噪点采样(实际推荐300帧就很快了,太快了光线不足情况下会出现特征不明显的问题)。

三、搜线算法

这里先给出我的一段函数程序:

可以通过这段程序返回一个float类型的位置,即一段数据中的统计峰值点。

通过配合对灰度图像的梯度计算,就可以得到一个十分准确的图像跳变位置。如果前面的图像稳定性好,可以通过这个算法将原本CCD128的分辨率细分到接近2000的分辨率,并且没有明显的抖动。

四、二值化阈值迭代算法

上面的搜线算法其实只适合进行跳变点跟踪,并且是通过灰度值进行直接跟踪。如果想要使用二值化,那么阈值确定就是一个不小的问题。这部分我研究过大家的开源,一般是分为两个步骤,首先是对没有用的干扰区域进行裁剪。然后是计算整体的平均值,通过平均值乘以一个系数得到一个动态的阈值。

不过这里我有一个计算量更小一些的方法,因为赛道中心总是白色的。所以可以先对赛道中心的几个像素进行平均值,直接乘以0.8或者0.5作为二值化阈值。然后通过二值化后的图像进行搜线。如果能同时搜到赛道的两个边界。则通过这两个边界计算出赛道中心,再次进行第一个平均值取阈值的步骤。如此循环进行迭代,只要亮度变化的剧烈程度不至于在两帧之间造成完全的搜索失误,便可以完成更加简便的动态阈值计算。

04 模结构

一部分主要是对车模结构中,有意思部分的一些展示,我并非机械设计专业。所设计的这些结构大都是参考淘宝的玩具车,或者网上一些成熟设计。

一、平置舵机

不同于见到的竖置舵机结构,我的平置舵机可以在一定程度上给计算带来方便,不需要进行标定,转动的角度就可以代表实际的车轮中心转向角度。因为在进行车身整体控制算法的解算时,可以直接通过控制舵机的角度来反馈解算。

二、摄像头联动结构

这部分虽然最后被我拆下了,但是仍然是一个相当有创意的方案,因为这个方式让舵机可以联动摄像头进行转动,从硬件结构上就避免掉了直道和弯道的区别。使得在进行拐弯的时候并不会丢线。

三、前悬挂

这个主要是用来给转弯提供一定的车身侧倾能力,以防过大的转向惯量侧向翻车问题。并且可以提高在一定的颠簸下。后轮保持持续动力输出的能力。

四、隐藏走线槽

隐藏走线只能算是美观的添加了。这种结构,通过在车模结构上划分出线槽,通过塞入电线以后通过502进行固定,可以极大提高空间利用性。

05 性导航

一、为啥要使用惯性导航

最直接的原因就是写元素有些过于麻烦了,需要使用过多的标志和判断。当时调摄像头已经只剩圆环元素了,但是我对于实际的循迹路径仍然不是很满意。这时候我就开始想应该怎样去给出最优的路径?很显然,太麻烦的算法我一时半会也理解不了,这时候我就想到了机械臂的拖动示教。有了想法,马上就试。当天晚上就完成了一个简单的路径记忆功能,并且可以拥有一定的偏差校准功能。此时,我就像是发现了新世界的大门。开始着手对惯导进行完善。

二、精度问题

最开始,路径的记忆并不是非常准确,只是能大概的看出来拥有拖动示教过的路径。这里如果不考虑打滑问题,我总结了几点在惯导中的精度问题。

首先是对于四轮车模,如果记忆的时候,陀螺仪放置的位置跟舵机位置不同。就需要在复现路径的时候对这段长度进行补偿,方便舵机锁定到正确的航向角。

还有就是利用编码器进行记忆功能的时候,我使用的是按距离触发。之前是编码器800个脉冲(大约1cm)触发一次路径存储或者路径复现。每次触发的时候就直接将编码器记忆清零了。但是因为触发进入800个脉冲的时候,此时脉冲数可能会多出800一些(定时触发检测)。所以会导致累计的长度逐渐出现偏差,所以这里我使用了“add_pos-=800;”来保证每次的触发都减去触发所需的固定距离,从而不会产生这一部分误差。

三、打滑问题

惯性导航的前提就是位置和方向要足够准确,不然无法复现出准确的路径。航向角的准确可以通过使用自身噪声小,精度高的陀螺仪实现。但是距离上的准确,则要通过进行打滑检测和补偿完成。在出发去比赛的前一天,其实我已经完成了打滑检测功能的实现。只不过,因为补偿还没有做好,所以就不能抵抗赛道中的打滑问题。也就限制了惯性导航能发挥的最大速度。

其实精确的位置也可以通过使用鼠标的光电传感器来读取,这样就可以完全避免掉驱动轮测速中,打滑问题的影响了(相当于独立的测速轮)。

而我的打滑检测功能,其实是使用轮边编码器测量加速度和IMU测量加速度进行检测,当两边数据不一致的时候,就可以判定出现了打滑(这部分已经实现了)。

然后是通过不打滑的时候,使用编码器的速度补偿IMU积分出来的速度。在打滑的时候,通过短时间的使用IMU积分的速度数据进行速度数据修正。进而完成位置数据的修正。

06 作成本

一、高成本现状

虽然很多车友对智能车拥有异于常人的热爱,甚至愿意自己掏钱来进行比赛。但是智能车过高的试错成本仍然让那些经费不怎么充足的队伍变得困难。但其实只要选择合理的方案进行自制,成本就不会那么令人难以接受了。

以下我将从较贵或者容易烧毁的部分,给出我的一些解决方案。

二、成本解决方案

首先需要改进的是驱动。据我了解,大家都选择的是DRV8701E+小封装MOS的形式。整体下来成本接近40。并且DRV8701稍微贵一些,炸驱动的时候有可能会连8701一起击穿。从而造成极大的试错成本。

我提供的方式是:EG2132(0.23RMB)+翻新IRLR7843(0.32RMB)。因为这个MOS的Ciss比较小,所以可以用较小的驱动电阻来提高驱动的性能。驱动一个电机,核算成本就只需要4块钱。并且这个MOS拥有161A的驱动能力,内阻也更小,发热也会更小。这样就算不小心给驱动烧掉了,也不会心疼。

MOS选择上,也不用觉得翻新不好,只要是全测的。你要这么想,这都用过这么长时间了,这还能用,这不是证明了其稳定性和体质更好嘛?这里我推荐去淘宝上的三极管之家买MOS,我经常在他们家买MOS,至今还没出现过问题,算是可信。

DCDC电源方面,我更推荐XL1509的方案,因为这个芯片比较耐造,可以抵抗很多过流,电压尖峰这种情况,不容易坏。

焊接上,我推荐大家使用低温锡膏+空气炸锅+三防漆的形式进行。首先是空气炸锅,一般市场上不能调温度最便宜的版本在50元左右,测试其内部温度可以在200°C恒温,使用低温锡膏138°C的熔点正合适。并且可以完美适合正反两面焊接,设计PCB的时候也不用担心两面不好焊接。打好锡膏塞空气炸锅里炸10分钟,拿出来基本就能用。驱动类的可以对接口和按键做一下保护后,用三防漆喷涂一遍,这样可以保证不被进水干扰,而且稳定性大大提高。

三、电机保护策略

大家的电机其实也容易经常因为堵转烧掉。所以我这里给出一种不使用电流传感器的堵转保护方案。

我的这个堵转保护方法,不仅适用于FOC电机,只要满足电机带有位置传感器,直流有刷电机也可以使用。

1、保护原理

首先从原理讲起:

堵转保护,顾名思义就是在电机堵转状态的时候进行保护,最主要的就是如何正确的识别堵转状态。识别到了堵转状态以后,则可以进行保护。

这里的保护分为两种,一种是直接断电保护,但是这样往往会直接失去力矩,不能自动的从堵转状态退出。

所以我更建议使用第二种保护方式,也就是降低电压进行保护。因为无论是无刷电机还是有刷电机,堵转的时候都可以近似于电压直接接在绕组线圈上。

此时的物理模型就是电阻发热模型,所以只要将电压降低到合适的值,便可以保持一定力矩的同时保护电机绕组不被过大的电流烧毁。

说完了保护,接下来说最重要的堵转识别。

2、电机启动

这里就不得不提及一下堵转识别中最容易出问题的点了——“电机启动”

电机启动的时候,无论是有刷电机还是无刷电机,电流都会拥有一个很大的脉冲阶跃值,这个地方与堵转的时候非常类似。

那么我们要如何区分呢?

我的方案中,使用的是延迟判别方式,因为堵转情况下,电流值会一直上升,而启动瞬间,电流只会短暂的超过额定值一会。

允许电机中存在短时脉冲大电流,即可成功解决起步和堵转保护冲突的问题。

这里我的堵转进入逻辑是:如果位置偏差大于400(计算速度的理想位置和实际位置偏差),且速度小于某个数(低速状态),则电流异常计数(I_Error_Cnt)自加,自加到I_Error_Dat(上限阈值)后停止

程序内,判断电流异常计数到达设定最大值后,进入堵转保护。

堵转退出逻辑是:如果速度高于某个数(高速状态),或者电机的设定位置和实际位置偏差小于400(可以判定为没有堵转),则清零电流异常计数,退出堵转模式。

而进入堵转以后,对PID部分的输出,采用双阈值的方式进行保护,即检测到PID输出值超过某个大数后,才切换输出保护为某个小数。

因为堵转的时候PID始终不能调节成功,所以输出会一直为最大值,这时候堵转保护便可以一直生效了。

以上就是我对电机堵转保护的一些理解,希望对大家有所帮助。我的这个算法在我调试以来,从未出现过因为堵住烧毁驱动或者电机的情况,已经相当稳定了。

07 速研究

一、有刷电机差速性能现状

这个其实是比赛前才突发奇想进行研究,经过实际测试确实效果比较好,故也来分享一下这个发现。

首先是我发现大家的拐弯多少的都有点难调,不是转弯过度就是转弯不足。差速中的理论模型和实际中感觉总有一些差池。这部分我总结了几个原因:首先是有刷电机响应速度没有那么快,从一个速度调整到另一个速度基本需要100ms的时间,而舵机调整时间就比较快了,基本是直接就能调整过去(零点几秒甚至零点零几秒,相比有刷电机的调整时间可以忽略不计)。所以前后轮此时出现了不一致的情况,也就会出现前后轮各跑各的。

因为有刷电机本身允许一定程度的速度差,但是代价就是会造成轻微的堵转,进而导致电机线圈大量发热。以至于大家的小车跑完几圈下来电机都嘎嘎烫。

但是我这个差速可以保证电机在各种剧烈拐弯中响应迅速,并且可以使得电机不出现剧烈发烫的情况。因为是靠运行中插入空转进行自然的差速。所以我也称我这个差速方法为“自然差速”。

二、解决方案

基本原理:

四轮小车通过舵机转弯的时候,因为前轮的导向作用,会使得后轮发生速度不一致的情况。我们称这种现象为差速。

在机械差速器的车辆中,因为差速器的结构,可以允许左右轮子输出不同的速度,从而顺利的完成转弯。

但是使用双电机驱动的后轮并没有这种机械结构,直接控制两轮进行差速的话,还会出现因为差速不对造成的漂移(过度)和转向不足(欠调)。所以,这里创新的使用三段式方式驱动直流有刷电机,使得电机包含三个状态:驱动,刹车,空转。

通过在原本的刹车电平中插入空转部分,则允许了差速存在,通过调整这个比例,则可以完成直道和弯道的差速调整。

实测结果:通过使用自然差速和不带自然差速进行堵转。可以得到不带自然差速时堵转为0.5A,带自然差速堵转仅为0.32A。但是此时电机可以获得同样的驱动能力,电流下降了也就代表电机发热可以大大的降低。




本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭