首页 > 编程知识 正文

舵机堵转怎么解决,超声波控制舵机抖动

时间:2023-05-04 01:15:08 阅读:132603 作者:4269

现象与原因最近使用arduino单片机,机械臂不断抖动。

硬件解决原文链接: https://blog.csdn.net/Zeng huanyu _ big/article/details/78515309

首先,你需要知道如何使用舵机。 简而言之,给定一定时间的高电平,使舵功能旋转一定角度。 其实,只是让舵机一次旋转一定角度的高低水平,然后保持开机状态,理论上舵功能不动。 但是,这样容易引起波动干扰,所以这种情况下需要74HC595芯片。

74HC595具有8位移位寄存器和一个存储器、三态输出功能。 移位寄存器和存储器有相互独立的时钟。 简而言之,可以保存来自单片机的周期信号,使舵机不易受到干扰。

之所以出现这个问题,是因为它是一个写有arduino语言的库函数,不了解底层的APP应用程序,所以出现了IO端口被共享,机械臂抖动的问题。 所以,大家今后也会尽量了解基础的东西,减少错误。

用软件解决原文链接: https://blog.csdn.net/wzx xtt 62267018/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 )和pin 10 (oc1b ),因此会导致冲突。 怎样才能解决呢? 能否在硬件上修复针脚? 省事的方法是通过修改代码来解决冲突。 可以改变实现舵机控制的方法。

所以,它重写了:

int servopin=7; //舵机接口数字接口7,即定义舵机橙色信号线。 定义语音服务(intangle )//脉冲函数)//发送50脉冲for (inti=0; i 50; I ) intpulsewidth=(Angle*11 ) 500; 将//角度转换为500-2480脉冲宽度值数字写入(servo pin,HIGH )//舵机接口水平达到最高延迟微信号(pulse width ); //延迟脉冲宽度值的微秒数数字写入(servo pin,LOW ); //降低舵机接口水平(20000-pulse width ); //Delay(20 ); }void setup () pinmode ) servopin,OUTPUT ); //将舵机接口设置为输出接口(}void loop () ) /将值范围映射为0到165左右的for (intangle=0; angle 180 angle=10({servopulse ) ) angle; //参考脉冲函数delay(1000 ); }用延迟函数直接向舵机发送脉冲,获得控制的效果。 在Arduino中,延迟函数delay ()使用的是计时器0,因此不会发生冲突。

舵机的扭矩和角度周期示意图如下。

74HC595芯片原理和Arduino使用案例原文地址: http://arduino.nxez.com/2016/12/20/74hc 595-chip-principle-and-arduino-use-use

74HC595简单地说就是具有8位移位寄存器、一个存储器和三态输出功能。 这里用这个控制8个LED灯。 为什么我们要用74HC595来控制小灯呢? 一定有很多朋友会问这个问题。 我想问的是,如果我们简单地用Arduino控制8个灯,会占用多少I/O呢? 答案是8个,我们的Arduino 168有多少个I/O端口? 即使打开模拟接口也是20个吧。 这8盏灯消耗了太多的资源。 使用74HC595的目的是减少I/O端口的使用数量。 使用7

4HC595以后我们可以用3个数字I/O口控制8个LED小灯岂不美哉。

原理说明

先转一段百度百科上74HC595芯片的简介。

74HC595具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器有相互独立的时钟。数据在SH_cp(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在ST_cp(存储器时钟输入)的上升沿输入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。

看不懂吧,没关系,我们先看一下芯片的引脚图:


分别解释一下:

GND接地,VCC接5V电源,这个就不用说了。Q0-Q7这8根引脚是芯片的输出引脚,直接跟数码管的8段引脚相连。对应关系要看你怎么接线和写代码时传送数据的顺序了。DS是串行输入引脚,所谓串行就是使数据在一根信号线上按顺序一位一位地传输,就像一串糖葫芦。这个引脚我们接到树莓派任意一个GPIO口上(输出模式)。SHCP是移位寄存器的时钟引脚。听上去有点复杂,其实很简单。74HC595内部有一个8位的移位寄存器用来保存从DS引脚输入的数据。那么74HC595怎么知道什么时候该从DS引脚上取数据了呢?正是通过SHCP这个时钟引脚来实现的。只有在SHCP发生一次上升沿的时候,74HC595才会从DS引脚上取得当前的数据(高/低电平)并把取到的这一位数据保存到移位寄存器里。同样的,这个引脚也接到树莓派任意一个GPIO口上。当我们向芯片发送数据时,要先在DS引脚上准备好要传送的数据,然后制造一次SHCP引脚的上升沿(先拉低电平再拉高电平),74HC595会在这个上升沿将DS引脚上的数据存入移位寄存器D0,同时D0原来的数据会顺移到D1,D1的数据位移到D2。。。D6的数据位移到D7。而原先D7的数据已经没有地方储存了,这一位数据会被输出到引脚Q7S上。这个引脚的作用我们下一篇再说,本文暂时用不到这个引脚。(注意这里说的不是输出引脚Q0-Q7,而是指内部的8位移位寄存器里每一个“小房间”,芯片手册上并没有给这些小房间编号,这里为了说明方便进行了编号)STCP是芯片内部另外一个8位锁存寄存器的时钟引脚。当移位寄存器的8位数据全部传输完毕后,制造一次锁存器时钟引脚的上升沿(先拉低电平再拉高电平)。74HC595会在这个上升沿将移位寄存器里的8位数据复制到锁存器中(锁存器里原来的数据将被替换)。注意,到这里为止,这8位数据还只是被保存在锁存器里,并没有输出到数码管上。这个引脚同样连接到树莓派任意一个GPIO口上即可。OE是输出使能引脚,在其他芯片里也很常见。作用是控制锁存器里的数据是否最终输出到Q0-Q7输出引脚上。低电平时输出,高电平时不输出(既不是高电平,也不是低电平而是高阻态,不通电)。本例为了方便直接接在GND上使其一直保持低电平输出数据。MR是用来重置内部寄存器的引脚。低电平时重置内部寄存器(MemoryReset?)。本例为了方便直接连接在Vcc上一直保持高电平。Q7S引脚,串行输出引脚,本文不使用,下一篇再解释它的作用。 锁存器

关于锁存器。动听的乌冬面就是将数据保存并锁定。一旦进入了锁存器,除非断电或重置数据(MR口设置为低电平),锁存器的数据不会再改变。好处是,wwdwl需要更新数据时,将数据串行输入移位寄存器的过程中,锁存器里的数据不会有任何影响,也就不会有闪烁了。一直到移位寄存器8位数据准备完毕,再制造一次STCP的上升沿一次性更新锁存器的数据,更新输出。

另外,我做了一个动画帮助你理解整个过程。

arduino示例

下面是我们要准备的元器件。
74HC595 直插芯片1、红色M5 直插LED4、绿色M5 直插LED4、220Ω直插电阻8、面包板1、面包板跳线1 扎。

准备好元件我们就按下面的原理图连接电路。


此电路图看似复杂,我们仔细分析以后再结合参考实物就会发现很简单。
下面是参考源程序:

int latchPin = 5;int clockPin = 4;int dataPin = 2; //这里定义了那三个脚void setup (){ pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); //让三个脚都是输出状态}void loop(){ for (int a = 0; a < 256; a++) //这个循环的意思是让a这个变量+1一直加到到256,每次循环都进行下面的活动 { digitalWrite(latchPin, LOW); //将ST_CP口上面加低电平让芯片准备好接收数据 shiftOut(dataPin, clockPin, MSBFIRST, a); //这个就是用MSBFIRST参数让0-7个针脚以高电平输出(LSBFIRST 低电平)是dataPin的参数, //clockPin的参数是变量a,前面我们说了这个变量会一次从1+1+到256,是个十进制数, // 输入到芯片后会产生8个二进制数,达到开关的作用 digitalWrite(latchPin, HIGH); //将ST_CP这个针脚恢复到高电平 delay(1000); //暂停1秒钟让你看到效果 }}

下载完程序大家就可以看到8 个小灯闪烁的美妙场景了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。