上周五夜里十点过后,老张猛地给我传来一条微信,截屏里呈现的是他的舵机测试场景,那个机械臂抖动得如同患了帕金森病一般。他讲项目在这儿已停滞三天,客户催促得很急切,要是再无法解决就得更换供应商了。
老张,是我于展会结识的友人,其自行开办了一个小型工作室,专门承接各类自动化的小型改造工作。此次承接了一个关于智能窗帘的项目,借助单片机来控制舵机,以此达成自动开合的效果。听起来好像挺简单的,然而真正动手去做的时候,却处处都是难题接连不断的状况,到处状况百出满是坑!
我向他询问,表述为“你所运用的是何种单片机?” 老张给出的回应是,那是最为常见的那种八位机,原因是其具备价格低廉的特性。然而问题恰恰产生在此二者之间 —— 尽管价格方面的确较为便宜,可是PWM输出的精准程度却存在不足的状况。
舵机呀,这个东西实际上是颇为挑剔的,它的内部具备一个控制电路,依靠接收脉冲宽度去决定转角,标准舵机的脉冲周期是20毫秒呢。并且高电平宽度处于0.5到2.5毫秒之间进行变化,以此对应0到180度,倘若你使用的是一个定时器不准确的单片机,那么所产生的脉冲宽度会飘忽不定,舵机可不就会跟着抖动起来吗?
老张开在深圳龙华的工作室那儿,他接连熬了两个通宵,尝试了各种各样的滤波,然而效果都不尽如人意。之后我让他转变一下思考角度:“不要仅仅局限于在软件方面一味地钻研,硬件方面同样也需要去考量考量。”。
在去年春天,于东莞厚街,在我们伟创动力的技术分享会上,我讲过这个事。当时,有个做机器人教育的客户,遇到了类似问题。他们使用着某款通用单片机,在控制五个舵机同时动作的时候,总有一两个反应迟钝。
过后我们剖析发觉,乃是单片机的IO口驱动力量欠缺。舵机于工作瞬间之时的电流可不是小的,尤其是启动那一瞬间,能够达到几百毫安。普通IO口怎么承受得住呢?电压被拉低,脉冲产生形变,舵机自然而然就不听从使唤了。
实际的解决办法其实是较为简易的:添加一个驱动电路。运用一个三极管或者MOS管去进行一个简单的电流放大处理,成本的增添不超过五毛钱,成效能够迅速显现出来。老张听闻之后猛烈地拍打大腿说道:“我怎么就没能想到这一层次呢!”。
有关程序这一方面,老张先前的编写方式实在是太直男风格了,他仅仅使用了一个delay函数在那儿生硬地进行延时操作,以此来生成PWM脉冲,这样的编写方式在单片机不做其他工作的时候还算可以,然而一旦需要同时处理传感器数据或者通讯,定时就会紊乱。
我向他发送了一段我们平常惯用的写法框架,采用定时器中断进行操作,主循环按照其原本该执行的任务执行,定时器到达设定时间便会产生中断,在中断服务程序当中更新 IO 口状态,如此一来脉冲精度可以控制在微秒级别,舵机转动极为顺滑。

“中断优先级的相关设置是需要予以注意的,”我处于电话途中向他进行着提醒,“涉及舵机控制的中断不要设置得过高水准,否则其他相应的任务将会产生如同被饿死了一般的状况。”老张在电话另一端以嗯嗯声进行着记载,通过如此我完全能够在脑海之中想象出他朝着电脑屏幕轻点头部的模样。
老张所负责的窗帘项目,存在要将四个舵机予以控制,使其同步实现开合的情况。他一开始萌生的想法,乃是采用顺序控制的方式,即一个舵机动作完毕之后,才会轮到下一个舵机动作。然而,在进行测试期间,窗帘呈现出类似毛毛虫那般,一截一截地缓慢挪动的状态,模样实在是难看极了。
同时对多路舵机实施控制,其关键之处乃在于定时器的运用。一个定时器能够产生多路PWM,只需将各路的比较值计算妥当便可。在我们伟创动力为客户打造的机械手方案当中,有六个舵机协同开展工作,所采用的便是此种方法。
硬件方面也是存在着相应讲究的,电源要充足适配,最为理想的状况是每个舵机单独进行供电,或者选用具备高功率的电源,不然一旦有一个开始运作起来,其他的就总会面临电压不稳的状况,那么又将会发起抖动,老张过后更换了我们所配备的稳压模块,即便四个舵机同时启动也能够稳如泰山般保持稳定。
问题基本上解决了不少,然而老张那里又出现了一个新情况:时不时会有某个舵机忽然失常,转到尽头就不再返回了。这样的随机故障是最难查找的。
我吩咐他将示波器连接上,去捕捉出现异常状况时的脉冲波形,果不其然呀,存在几次脉冲宽度忽然之间转变为3毫秒之上,这超出了舵机的正常可以接收的范围,究其原因在于他所编写的程序当中有个地方数组出现了越界情况,偶尔间会对PWM参数进行篡改。
针对调试此类问题,需要具备一定的侦探思维,要明确究竟是硬件方面的问题还是软件方面的问题,接着再去缩小其范围,对于硬件问题需查看电源情况以及信号状态,而对于软件问题则要查看时序以及变量情况,老张后来已然养成了一种习惯,即针对关键参数都会去进行范围检查,对于异常值会直接将其过滤掉。
在项目的最终阶段,老张针对成本进行了推算,结果发现超出了预算范围。究其原因,乃是增添了驱动电路,并且更换了电源模块,尽管所呈现出的效果颇为良好,然而在价格层面却丧失了优势。
这再度回归到那个经典的问题,即性价比。实际上,要是对于精度的要求并非特别高,那么能够借助软件校准去弥补硬件方面的不足。我们曾做过一个浇花系统,采用的是最便宜的单片机以及最普通的舵机,借助软件记录每个舵机的误差特性,进而进行反向补偿。
犹如你结识某个人,晓得其走路老是偏向右边,那么当你要他前往左边之时那就多呼喊一些。舵机亦是如此,每份的机械特性存在些许不同,测量得出,记录下来,在程序里面予以补偿消除。如此这般硬件成本并未有所增加,精度却提高了相当大的幅度。
待到老张的窗帘项目最终进行交付之际,客户表现得格外满意舵机厂家伟创动力,声称运行起来既安静且平稳。随后他给我发送了一个红包,我并未收下,仅仅表示下次前来东莞时请为我准备一杯茶即可。

其实从事技术工作的人皆是如此,碰到问题便会感到头疼,而解决问题却会上瘾。那个周末,老张身处龙华的工作室,一直待到凌晨三点,最终看到四个舵机同步且平稳地转动起来时,他声称比中彩票还令人高兴。
电源这件事情,讲起来看似容易,糟糕起来却让人头疼至极。好多抖动方面的问题究其根源都是电源不够纯净。舵机一旦产生动作,电流就会突然发生变化,电源的电压如同乘坐过山车一般起伏不定,单片机随之也陷入困境了。
增添一个大电容属于常规性操作,然而电容并非越大就越好。倘若太大,那么启动充电便会缓慢,要是太小,滤波效果就会较差。通常情况下,我们推荐在电源的入口放置一个容值为100μF的电解电容,并且在每个舵机的旁边放置一个容值为0.1μF的瓷片电容,如此远近相互结合效果最为理想。
,老张后来发现了一个细节,那就是电源线的长度以及粗细同样是存在影响的。,他工作台上的电源距离舵机为半米远,而且线还是细的,据此电阻压降是十分明显的。然后,更换了粗短一些的线之后,问题又减少了一部分。所以说,从事自动化工作是不能够仅仅去看核心器件的,周边那些细节同样是能够决定成败的。
码的可移植特性,老张往昔不太予以留意,他认为一个项目即一套代码,能够运行便可,直至承接了一个相似的新项目,欲将旧代码搬运过来加以运用, 过程痛苦不堪。
恰当的舵机控制代码与那种积木类似,底层的驱动、中层的控制、上层的应用要分开去编写。底层仅仅是进行精准脉冲产生的操作,中层负责实施把角度转变为脉宽的动作,上层开展业务逻辑层面的处理工作那。如此一来,当更换单片机之际,仅仅 需要对底层作出修改;当更换应用之时,仅仅需要将上层变更。
在我们内部存在着一个驱动库,它对那些作了封装。具体包括初始化函数,角度设置函数,速度控制函数;其接口是统一的,在更替平台的时候,主要的那项工作便是去适配底层定时器。老张在查看了我们的框架以后,将自身的代码重新撰写了一回,声称往后维护会省事好多。
瞧见老张开初搞得焦头烂额之后又变得游刃有余,我认定这便是技术人员的成长经历路径。每一个坑都被踩过,才能够记住道路该如何去走。单片机对舵机进行控制,讲它难吧并非很难,讲它简单吧也并非简单,关键之处在于要把每一个环节都思索清楚。
倘若你同样在摆弄这些东西,碰到了相似问题,说不定老张的遭际能给你个警示。技术这条道路,独自一人前行易于迷失方向,大家多多相互交流,彼此帮衬一下,总归能够寻得解决办法。
若觉着这些经验具备有用性,那么便可点个赞予以支持。要是存有自身的心得或者疑问,欢迎于评论区展开研讨,咱们一同探究。不妨将其收藏起来,待下次碰到问题之际翻出来瞧瞧,说不定便能省下几个通宵。把它转发给同样在搞硬件的朋友,使其能少踩些坑。
顺道一提,留意我,往后还会去分享更多于实际项目当中碰到的问题以及解决办法。毕竟处于这个行业领域内,实战经历相较于理论而言更为关键,你觉得是不是这样呢?