28BYJ48 步进电机驱动记

一、背景

        之前设计了一款轮式驱动单元,结构上是为了实现“可转向驱动轮”。

        当时凭直觉选择了标准舵机作为转向动力,但经过这些年的使用,发现合适价位的舵机性能无法满足需求,而满足需求的舵机成本又背离了轮式驱动单元的设计初衷(低成本编程学习素材);期望在30元以内选择一款合适舵机的愿望一直没有实现(曾经选到过一款30元左右的数字舵机,可后来没有了);这个价位范围内的舵机通常不是转向精度不够,就是小角度转动根本不响应,基于舵机做出的小车一直不是很满意。

       最近在逛“淘宝”时发现一款步进电机 — 28BYJ48,自带1/64减速,价格最低的只有3元左右,好的也不过8元(有一个厂家直销的15元),关键是好像是某种家电上用的,并非那种拆机品,卖一阵子就没了。这个价位配上驱动后也不会很贵,体积、价位十分合适,含1/64减速,力矩不应该太小。5mm输出轴,有现成的法兰盘联轴器可用:

        其安装孔尺寸正巧和我设计的轮式驱动单元转向圆盘相配,价格也合适(2.5元/只)。

         故动了替换舵机的心思,这就有了如下的“步进电机驱动记”

二、需求

        能代替目前使用的标准舵机,可以驱动轮式驱动单元转向。

        因轮式驱动单元设计时就考虑到尽量减小转向阻力,结构上设计了等效平面轴承,并且轮子的着地点在转向轴心,轮胎截面为圆形,接地面很小,基本无转向阻力,所需要的力矩不应该太大;而且,作为转向作用,基本无需保持力

        标准舵机(如MG995、996)一般有10~20kg的力矩,此处应该用不上。

        因没有测量过实际转向时所需的力矩,故无法确定需要多大力矩,只能试试。

        转向范围:略大于 180度

        转向速度:能达到标准舵机的指标即可,约为60度/秒

三、实施

3.1 电机性能评估

        首先买了两个中等价位的电机(6元/只),为方便测试,买了一块驱动板,实际上就是三极管驱动电路(用的ULN2003)。

       用 STM32F103C8核心板,按店家的示例编写了驱动程序,上电测试,两个电机一个转,偶尔启动不了,一个不转;而且,转的那个稍一受力,就停了。失望!

        不太死心,感觉电机不至于这么差。

        仔细研究资料后,觉得驱动示例程序有点太粗糙,用的是四拍驱动,此为四相电机,似乎应该是八拍方式驱动。

       按电机资料,自己编写了四相八拍驱动程序,上电测试,两个电机均能可靠转动,且用手捏输出轴也不影响。尝试了几个不同的速度(驱动脉冲时间)后,发现电机性能还不错,在八拍驱动模式下,来回运转多次,无失步现象。唯一不足是速度略慢,初步测试最快只能达到45度/秒;不过,小车本身就是学习素材,问题不大,可以接受。因此重燃希望!

        测试所用驱动模块是ULN2003,这种双极型电路有较大饱和压降: 

       按电机线包电阻50欧计算,驱动电流大约100mA,压降达1V左右,使用USB口供电,电压只有5V,实际供给电机的电压只有4V左右,如果能保证5V供电,力矩应该更大。

       决定自己设计驱动电路,选用我最常用的MOS管CJ3400,最大4A驱动电流,压降极低:

       MOS管标注的是导通电阻,按上表参数,即便是52毫欧,在100mA电流下只有0.0052V压降,可以忽略。

       由于用八拍驱动,程序略微复杂,且要占用4个IO口,故考虑用一个简单的MCU完成电机驱动控制逻辑,封装成一个驱动模块,通过UART实现对电机的控制。这样小车的控制器编程就比较简单,和使用舵机类似,甚至比舵机更为方便。自己编程的驱动模块可以根据需要灵活增减相应功能,使之更符合轮式驱动单元的转向需求,免受标准产品的功能制约;还增加了学习素材。

       根据前面做的STM32F103测试程序,用STC12LE5208(51系列MCU)或STM32的M0系列MCU即可。但用STC需要使用Keil(MDK),用STM32可以使用 Arduino IDE,是开源平台,更符合学习场景。权衡之后,选择了STM32G030F6P6;首先是价格合适,只有2元左右;其次是封装合适,SSOP20封装,体积小,IO口足够,且无需外部晶振,PCB排版方便。

3.2 实施过程

3.2.1 第一版设计

        根据使用需求,设计主要实现以下几点:

        A)将电机和驱动电路组合为一体,并按轮式驱动单元的使用方式设计,构成一个模组,可以直接用于轮式驱动单元,与舵机等效。

        B)内置MCU,对外接口为UART,使用命令操作电机,实现转向。

        C)增加左、右转向限位,在功能上和舵机等效,并方便矫正。

        D)使用MOS管驱动,改善性能。

        E)因为驱动控制内置,故需要考虑上电过程,避免四个线包同时通电。

        以下为初次设计的电路,选择霍尔电路3144作为限位:

        首次设计,只做了5片PCB样板,自购器件焊接:

       编程基于Arduino(STM32Duino),基于Arduino IDE编程比较方便,不用详细阅读芯片手册。本想继续使用我原来基于 STM32F103编写的FreeRTOS程序框架,无奈内存不够,只得作罢;在原来的程序模板上消除RTOS,采用简单轮询方式调度实现,但保留了模板原有的功能,如内存读、写,调试信息输出,任务看护。

       编程完成后,测试效果如愿,实现了自动加速转动、指定速度转动、绝对角度自动初始化,加上法兰联轴器后,手捏感觉力矩挺大,信心大增。

       不足的是:上电复位过程中还是出现了4个线包同时供电的情况,交付加工前添加的电源开关设计不严谨,未起作用。

       由于带负载测试有点麻烦,且过于自信,在没有全面测试的情况下就启动了第二版设计,导致后续出现问题,后面详述。

3.2.2 第二版设计

        在第一版基础上,改进驱动设计,放弃电源开关,增加一级三极管驱动,使得MCU在复位期间 IO 口高阻状态下不会使驱动导通,消除了四个线包同时供电的情况。

       由于增加了一级三极管,可以不使用MCU的OD输出模式,便于Arduino编程,因为其pinMode函数设置中没有这个选项。同时,由于增加了一级驱动,使得MOS管驱动电压可以提升到12V;28BYJ48电机有5V和12V两种规格,增加了驱动板的灵活性。正好所选的霍尔传感器3144支持电源为5~24V,1117-3.3V的输入电压允许最大12V。因此,第二版设计的供电可以在 5 ~12V 范围内,具体电路如下:

        由于第一版比较顺利,所以有点急于求成,第二版直接下单做了SMD(因为SSOP20手工焊接太累),且做了点批量:

       同时加工了相应的结构件。

       先拿到PCB(嘉立创真是快,交上PCB图,4天即提供SMD好的板子),上传修改后的程序,一次通过,电机如愿转动。

       遇到点小情况:MCU首次下载程序(在Arduino  IDE下)后,程序能正常运行,但按键复位后MCU不运行了;下载了两片都是如此。但断电重启,一切恢复正常,之后也再无此现象,不知道是什么原因?还没有仔细阅读 STM32G030的手册。

      结构件到了后,即刻组装:

       装好小车后,通电一试,转不动,当时就懵了

       用手转动很轻松,电机却带不动,看来力矩的“矩”作用很大!

       直接捏转轴,只有不到3mm的阻力臂,而转向轮的平面轴承(实际上是一堆钢珠)产生的阻力臂大约是13mm,等于力矩增加了4倍多。

       拆装了几次,排除了装配问题,纯粹是力矩不够所致。

       首先想到的是:在网上再找找,有无同规格电机力矩大点的。找到一家28BYJ48电机的厂家店,发现他家的28BYJ48电机不只是有5V和12V两种规格,5V的还有21欧和50欧两种线包电阻,以及1/16、1/32、1/64三种减速比可选,比较正规,但价格有点高,要15元/只。

       看介绍似乎 21 欧的力矩大些,咨询店家,回复:力矩是会大一些,但发热也大。

        受此启发:适当增加电机供电电流(提高供电电压),应该可以增加力矩。

        目前所用电机是 50 欧的,额定电压 5V,电流 100mA。如将电压提升到 10V,电流约为 200mA,此时,保持状态仍然持续供电,电机估计承受不了。

       考虑到使用场景,基本无需保持力矩,减速机构所产生的阻力应该就可以对付,故修改程序,在电机停止时关掉所有线包供电。

       按此修改程序,并将电压提升到10V(二版设计支持 5 ~ 12V 供电正好发挥作用),通电测试,转了!很流畅!开心!

       由于关掉的保持电流,电机反而不发热了。作为轮式驱动单元的转向功能,不会连续运转,所以应该可以应用此方式。

       在此基础上,进一步改进,以 PWM方式提供保持电流,根据实测发热情况确定周期和占空比,从而完善保持功能。

       实施后发现,如想要有明显效果,电机发热明显,且电池消耗电流增加,对于小车而言,没有意义,徒增电池消耗,故暂时取消,但逻辑保持,后续根据需求酌情处理。

       考虑到程序支持指定转动速度,如设置速度过低,也许会导致线包供电时间过长,故增加了最低转速限制。

       至此,用28BYJ48步进电机替代标准舵机、实现轮式驱动单元转向算是初步完成,虽不太完美,但基本达到了预期。为方便测试,基于Processing (processing.org)编写了PC上的测试程序:

      实际转向效果如下:

28BYJ48 步进电机转向测试

https://v.youku.com/v_show/id_XNjIxOTM1ODM1Ng==.html

 

四、结语

        有惊无险,但教训还是有的:每次想偷懒,都会出状况,看来工程上真是容不得半点马虎。

        通过上述实施过程,收获两点经验:

        1)要准确定位需求,并清晰知道需求背后所蕴含的道理。此处如不能清晰的知道:轮式驱动单元的转向运动只需克服阻力即可,而阻力是由运动产生的,不运动就无需力!才可以用忽略步进电机保持力的处理方式,达到增加转动力矩的目的。同时,在小车运行中不会不停的转向,才可以用过流驱动方式增加力矩。

        2)不能教条的接受一些默认的规则,要从原理上理解这些规则产生的缘由,从而根据具体需要取舍。如果此处墨守陈规,一定要实现步进电机的保持力,则只能放弃此方案。其实,这种驱动方式是可以用于无需保持力的场景、产生超出电机额定力矩的输出的。

        也算是因祸得福,如果真的在第一版就严格测试,估计我也不会去如此费心,提高电压的想法就不会产生。

       本以为是举手之劳之事,却搞了个“山重水复疑无路,柳暗花明又一村”。好在最后皆大欢喜。

       因为电路支持5 ~12V供电,且驱动用的MOS管最大电流为4A,保守估计1A肯定可以,我查了一下,网上这类四相的步进电机应该都可以驱动,除了28BYJ48外,还有24BYJ、35BYJ等等种类,开始没有仔细搜,这也算是失误,如果开始就看到35BYJ412,估计就不会用28BYJ48了,不过28BYJ的价格确实诱人。

——————————————

注:如果你也有合适的应用场景,想选择 28BYJ48,可以找我,也可以去我的淘宝店 —— 单片机学习之家

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入之梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值