草庐IT

SG90舵机的原理和控制方式

嵌入式之入坑笔记 2024-02-21 原文

前言

做过机器人、智能车或者玩航模的朋友应该对舵机不会陌生,这种舵机也是很常用的。

舵机只是我们通俗的叫法,它的本质是一个伺服电机,也可以叫做位置(角度)伺服驱动器。一般被应用在那些需要控制角度变化的系统中,可以方便的实现转动任意的角度,实现控制角度的变化。

sg90舵机的图示:

1、sg90舵机的应用场景

(1)航模

在很多的航模中,sg90舵机都被用于两翼的位置控制,从而实现航模的转向,倾斜之类的。因为航模本身的要求,需要尽量的控制航模的自重,而sg90舵机的重量本身就很轻,扭矩也大,所以能很好的满足要求。如下:

(2)智能小车的转向桥

因为sg90舵机的精准角度控制,所以在很多的智能小车类中被用作转向控制。如下的一个简易转向桥:

(3)云台控制

将sg90用于云台控制也是很常见,如下:

2、sg90舵机的参数

(1)sg90舵机的一些重要特性参数:

1)工作扭矩:16KG/CM

2)反应速度:0.12 - 0.13秒/60°

3)温度范围:-30° ~ +60°

4)死区设定:5微妙

5)转动角度:常见0°、90°、180°、360°

6)电压范围:3V - 5V

(2)sg90舵机的接线定义

sg90舵机的接线定义如下:

3、sg90舵机的工作原理

sg90舵机模块内是有控制电路的,控制信号通过信号线输入到内部的控制电路中,调制芯片将输入的信号进行调制,获得直流偏置电压。然后再由内部的基准电路产生周期为20ms,宽度为1.5ms的基准信号,将直流偏置电压和电位器电压进行比较,从而获得输出的电压差。由电压差控制舵机的转动,这个电压差的正负控制舵机正反转。大致原理就是这样!

4、sg90舵机的控制原理

至于如何驱动sg90电机也是比较简单的。

驱动原理:产生一个周期为20ms,高电平宽度为0.5ms-2.5ms的方波就能驱动sg90舵机。

换一种说法就是需要一个50Hz的pwm波,然后通过改变占空比来控制sg90舵机的转动角度。

下面以180°舵机为例说明,高电平宽度和sg90舵机的转动角度的关系表如下:

占空比如下:

方波示意如下:

或者看下面的演示图就更加形象:

(素材源自网络,侵删!)

按照理解的话,可以根据角度和高电平的时间推断一个公式:

PWM的高电平时间 = 0.5ms +(转动角度/180°)*2ms
注意:这是根据高电平宽度和角度推算的,不一定准确,使用中还是需要根据实际情况进行参数调整

5、180° 和 360° 的舵机

据我所知道的,sg90舵机是分为两种的,一种是转角范围180°的舵机,另外一种是360°转角的舵机。这两种是存在一定的差别的。

(1)180°舵机

180°舵机是给一个PWM信号就转动到一定的角度,然后保持在这个转动之后的位置,直到有下一个不同的PWM信号,才会转到其他的角度。

转动的角度和PWM高电平的时间关系如下:

0.5ms  ---- 0度;1ms    ---- 45度;1.5ms  ---- 90度;2ms    ---- 135度;2.5ms  ---- 180度;

(2)360°舵机

360°舵机是给一个PWM信号,就会按照一定的速度转动,这是和180°舵机不同的地方。但是按照我自己的测试中发现,其实360°舵机按照180°舵机的控制方式,每次只发一个周期的PWM的话,也是可以控制360°舵机按照一定的角度转动的。

转动的速度和PWM高电平的时间关系如下:​​​​​​​

0.5ms --- 正向最大转速;1.5ms --- 速度为0;2.5ms --- 反向最大转速;注意:其他的转速也是可以调的!

6、控制舵机的PWM的产生方式

(1)用中断的方式

中断的方式的话,大致的步骤如下:(以转动45°为例)

1)使用一个定时器,并开启中断;

2)第一次:先设置定时器的中断时间为1ms,这段时间IO输出高电平;

3)第二次:1ms时间到了,在中断里面让IO输出低电平,并同时设置下一次中断时间为19ms。就可以产生一个周期20ms,高电平时间为1ms的PWM方波控制信号。

4)一直循环上面的 2)3)的操作

(2)用MCU的PWM输出功能

这个方法比用中断的方式就容易多了,毕竟中断过于频繁的话,对于控制程序也不好,特别是有操作系统的时候,可能会影响系统的实时性能。

MCU自动生成PWM的方式就很好了,这个过程不需要MCU的参与,极大的释放了MCU的压力。有很多的MCU本身甚至可以产生很多路的PWM输出,可以用于控制很多路的舵机。

 

有关SG90舵机的原理和控制方式的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  4. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  5. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  6. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  9. ruby-on-rails - 在 Rails 控制台中使用 asset_path - 2

    在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O

  10. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

随机推荐