舵机抖动的解决方法

舵机抖动的解决方法现象与原因原文链接:https://blog.csdn.net/zenghuanyu_big/article/details/78515309最近用arduino单片机,机械臂一直在不停的抖动。首先,需要知道舵机的使用方法,简单来说,就是给一定时间的高电平,舵机能转动在一定的角度。其实,你只需给舵机一次能转动在一定角度的高低电平,之后只需保持上电状态,理论上舵机能保持不动。但这样极易出现波动…

大家好,又见面了,我是你们的朋友全栈君。

现象与原因

最近用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),所以会导致冲突,如何解决呢,可以在硬件上修改引脚。不费事的办法就是通过修改代码来解决冲突。我们可以换一种方法来实现舵机的控制:
既然这样,那就重写一段好了:

int servopin = 7;    //定义舵机接口数字接口7 也就是舵机的橙色信号线。
void servopulse(int angle)//定义一个脉冲函数
{ 
   
  //发送50个脉冲
  for (int i = 0; i < 50; i++) { 
   
    int pulsewidth = (angle * 11) + 500; //将角度转化为500-2480的脉宽值
    digitalWrite(servoPin, HIGH);   //将舵机接口电平至高
    delayMicroseconds(pulsewidth);  //延时脉宽值的微秒数
    digitalWrite(servoPin, LOW);    //将舵机接口电平至低
    delayMicroseconds(20000 - pulsewidth);
  }
  // delay(20);
}

void setup()
{ 
   
  pinMode(servopin, OUTPUT); //设定舵机接口为输出接口
}

void loop()
{ 
   
  //把值的范围映射到0到165左右

  for ( int angle = 0; angle < 180; angle += 10) { 
   
    servopulse(angle);   //引用脉冲函数
    delay(1000);
  }
}

直接通过延时函数来给舵机脉冲,达到控制的效果,因为Arduino里延时函数delay()用的是定时器0,所以就不会冲突了。
关于舵机的扭矩和角度周期示意图如下:

在这里插入图片描述

74HC595 芯片原理和 Arduino 使用实例

原文地址:http://arduino.nxez.com/2016/12/20/74hc595-chip-principle-and-arduino-use-example.html

74HC595 简单说来就是具有8位移位寄存器和一个存储器,以及三态输出功能。 这里我们用它来控制8个LED小灯。我们为什么要用74HC595来控制小灯呢?一定会有很多朋友会问这个问题,我想问的是我们要是单纯的用Arduino控制8个小灯的话要占用多少个I/O呢?答案是8个,但是我们的Arduino 168有几个I/O口呢?加上模拟接口也就20个吧,这8个小灯占用了太多的资源了,我们用74HC595的目的就是减少I/O口的使用数量。用74HC595以后我们可以用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口设置为低电平),锁存器的数据不会再改变。好处是,当你需要更新数据时,将数据串行输入移位寄存器的过程中,锁存器里的数据不会有任何影响,也就不会有闪烁了。一直到移位寄存器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 个小灯闪烁的美妙场景了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132154.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • chrome加载慢_多线程有什么用

    chrome加载慢_多线程有什么用谷歌浏览器采用的是单线程下载,想要提高下载速度,就得采用多线程的下载方式,Chrome默认还是单线程下载,如果想要谷歌多线程下载,就要手动开启,下面听MacW小编娓娓道来,介绍如何开启Chrome多线程下载!先来看看开启前的下载速度,(同一个文件)看到了吧!默认情况下,只有左右,远没有到达带宽的上限,接下来跟着小编一起开启这个隐藏的功能,国产Chrome内核的浏览器通通适用,包括前段时间推送的新版Edge也可以。chrome://flags/#enable-parallel-downloading

  • wifi 频段表_史上最全无线通信频率分配表,转走收藏!

    wifi 频段表_史上最全无线通信频率分配表,转走收藏!5GNR3GPP已指定5GNR支持的频段列表(可查看TS381045.2章节),5GNR频谱范围可达100GHz,指定了两大频率范围:①Frequencyrange1(FR1):就是我们通常讲的6GHz以下频段•频率范围:450MHz-6.0GHz•最大信道带宽100MHz②Frequencyrange2(FR2):就是毫米波频段•频率范围:24.25GHz-52.6…

    2022年10月20日
  • pycharm中plt.plot没有把图画出来_pycharm运行不出来图片

    pycharm中plt.plot没有把图画出来_pycharm运行不出来图片一、问题描述pycharm开发工具使用plt.show()不显示图像,代码运行也不报错,如下图:二、问题原因pycharm开发工具中窗口显示的问题三、解决方式1、依次点击【File】——>【Setting】——>【Tools】——>【PythonScientific】–【取消勾选】-——>【Apply】-——>【ok】,如下图:2、再次运行程序即可显示图形,如下图:…

  • idea2021激活码 mac(JetBrains全家桶)「建议收藏」

    (idea2021激活码 mac)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html1STL5S9V8F-eyJsaWNlbnNlSW…

  • 一次完整的渗透测试流程

    一次完整的渗透测试流程目录渗透测试信息收集漏洞探测漏洞利用内网转发内网渗透痕迹清除撰写渗透测试保告渗透测试渗透测试就是利用我们所掌握的渗透知识,对网站进行一步一步的渗透,发现其中存在的漏洞和隐藏的风险,然后撰写一篇测试报告,提供给我们的客户。客户根据我们撰写的测试报告,对网站进行漏洞修补,以防止黑客的入侵!渗透测试的前提是我们得经过用户的授权,才可以对网站进行渗透。如果我…

  • 面向对象的学生信息管理系统_java面向对象学生管理系统

    面向对象的学生信息管理系统_java面向对象学生管理系统面向对象版-学员管理系统目标一.系统需求二.准备程序文件2.1分析2.2创建程序文件三.书写程序3.1student.py3.1.2程序代码3.2managerSystem.py3.2.1定义类3.2.2管理系统框架3.3main.py3.4定义系统功能函数3.4.1添加功能3.4.2删除学员3.4.3修改学员信息3.4.5查询学员信息3.4.6显示所有学员信息3.4.7保存学员信息3.4.8加载学员信息四.总结目标了解面向对象开发过程中类内部功能的分析方法了

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号