现象与原因
最近用arduino单片机,机械臂一直在不停的抖动。
通过硬件解决
原文链接:https://blog.csdn.net/zenghuanyu_big/article/details/78515309
首先,需要知道舵机的使用方法,简单来说,就是给一定时间的高电平,舵机能转动在一定的角度。其实,你只需给舵机一次能转动在一定角度的高低电平,之后只需保持上电状态,理论上舵机能保持不动。但这样极易出现波动干扰,所以此时需要一个74HC595芯片。
74HC595具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器有相互独立的时钟。简单来说,它可以保存单片机给的周期信 ,使舵机不易受到干扰。
之所以出现了这个问题,就是因为arduino语言都是写好的库函数,没有了解底层的应用,导致IO口共用,出现机械臂抖动的问题。所以大家以后还是尽量了解底层的一些东西,可以减少犯错。
通过软件解决
原文链接:https://blog.csdn.net/wzxxtt62267018/article/details/79785690
此方法毕竟有延时,还是建议通过硬件解决。
这几天练习用Arduino通过Servo库控制舵机转动,在中loop中先有几秒让舵机停在0度,然后转到另外一个角度,就在这等待的几秒钟内,舵机不淡定了,不规则地抖动,等到让它转到指定角度时,它也能转过去。我推测这一定是控制程序的问题。在 上查找资料,发现下面的一段话说的靠谱:
在Arduino中,servo是一个库,可以简单的操作舵机。但从servo库的底层代码上来看,它使用了定时器中断,如果你调用了servo库,同时还使用串口通信的功能,那么,恭喜你,对于部分Arduino的板卡来说,一定会抖动。原因很简单,因为串口通信和servo都要使用定时器,所以就不正常了。
就像我一直在教学Arduino的过程中所强调的那样,库是别人写好你来用的,核心的东西你不知道,没准什么时候就有问题就冲突了,要想学好学精,还是要自己通过代码来实现各种功能,不仅性能好,而且还锻炼了你自己的综合能力。
提示你一点关于舵机的知识。驱动舵机,需要产生PWM信 ,普通模拟舵机能识别50HZ的PWM信 ,其中每个信 周期内,高电平的持续时间代表舵机的驱动角度。500uS为最小舵量,1500为中立舵量,2500为最大舵量,你可以使用micros()这个函数来精确控制高电平的持续时间。
使用Servo.h库方便,但是为什么会跟pwm冲突呢,因为在Arduino里的库封装里,它们都是用了同一个定时器1,T/C1: Pin9(OC1A)和Pin10(OC1B),所以会导致冲突,如何解决呢,可以在硬件上修改引脚。不费事的办法就是通过修改代码来解决冲突。我们可以换一种方法来实现舵机的控制:
既然这样,那就重写一段好了:
直接通过延时函数来给舵机脉冲,达到控制的效果,因为Arduino里延时函数delay()用的是定时器0,所以就不会冲突了。
关于舵机的扭矩和角度周期示意图如下:
- GND接地,VCC接5V电源,这个就不用说了。
- Q0-Q7这8根引脚是芯片的输出引脚,直接跟数码管的8段引脚相连。对应关系要看你怎么接线和写代码时传送数据的顺序了。
- DS是串行输入引脚,所谓串行就是使数据在一根信 线上按顺序一位一位地传输,就像一串糖葫芦。这个引脚我们接到树莓派任意一个GPIO口上(输出模式)。
- STCP是芯片内部另外一个8位锁存寄存器的时钟引脚。当移位寄存器的8位数据全部传输完毕后,制造一次锁存器时钟引脚的上升沿(先拉低电平再拉高电平)。74HC595会在这个上升沿将移位寄存器里的8位数据复制到锁存器中(锁存器里原来的数据将被替换)。注意,到这里为止,这8位数据还只是被保存在锁存器里,并没有输出到数码管上。这个引脚同样连接到树莓派任意一个GPIO口上即可。
- OE是输出使能引脚,在其他芯片里也很常见。作用是控制锁存器里的数据是否最终输出到Q0-Q7输出引脚上。低电平时输出,高电平时不输出(既不是高电平,也不是低电平而是高阻态,不通电)。本例为了方便直接接在GND上使其一直保持低电平输出数据。
- MR是用来重置内部寄存器的引脚。低电平时重置内部寄存器(MemoryReset。本例为了方便直接连接在Vcc上一直保持高电平。
锁存器
关于锁存器。顾名思义就是将数据保存并锁定。一旦进入了锁存器,除非断电或重置数据(MR口设置为低电平),锁存器的数据不会再改变。好处是,当你需要更新数据时,将数据串行输入移位寄存器的过程中,锁存器里的数据不会有任何影响,也就不会有闪烁了。一直到移位寄存器8位数据准备完毕,再制造一次STCP的上升沿一次性更新锁存器的数据,更新输出。
另外,我做了一个动画帮助你理解整个过程。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!