舵机的PWM控制学习随笔

  舵机的控制信号,对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz(周期是20ms)的信号,这对运放器件的选择有较高要求,从电路体积和功耗考虑也不易采用。5mV以上的控制电压的变化就会引起舵机的抖动,对于机载的测控系统而言,电源和其他器件的信号噪声都远大于5mV,所以滤波电路的精度难以达到舵机的控制精度要求。

  可以用单片机作为舵机的控制单元,使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将计算结果转化为PWM信号输出到舵机,由于单片机系统是一个数字系统,其控制信号的变化完全依靠硬件计数,所以受外界干扰较小,整个系统工作可靠。

  单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PWM周期信号,本设计是产生20ms的周期信号;其次是脉宽的调整,即单片机模拟PWM信号的输出,并且调整占空比。

  舵机的PWM控制信号的占空比与舵机输出轴转角之间的关系如下图所示:

  当系统中只需要实现一个舵机的控制,采用的控制方式是改变单片机的一个定时器中断的初值,将20ms分为两次中断执行,一次短定时中断和一次长定时中断。这样既节省了硬件电路,也减少了软件开销,控制系统工作效率和控制精度都很高。

  具体的设计过程:例如想让舵机转向左极限的角度,它的正脉冲为2ms,则负脉冲为20ms-2ms=18ms,所以开始时在控制口发送高电平,然后设置定时器在2ms后发生中断,中断发生后,在中断程序里将控制口改为低电平,并将中断时间改为18ms,再过18ms进入下一次定时中断,再将控制口改为高电平,并将定时器初值改为2ms,等待下次中断到来,如此往复实现PWM信号输出到舵机。用修改定时器中断初值的方法巧妙形成了脉冲信号,调整时间段的宽度便可使伺服机灵活运动。

舵机的PWM控制学习随笔,布布扣,bubuko.com

时间: 2024-10-25 04:24:39

舵机的PWM控制学习随笔的相关文章

基于tiny4412的Linux内核移植 -- PWM子系统学习(七)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

关于提高映射速度的ASMA测序技术学习随笔

  最近看了一篇关于NGS(下一代测序).ASAM的论文.名字为<AMAS: Optimizing the Partition and Filtration of Adaptive Seeds to Speed up Read Mapping>.这篇论文介绍了一种可以提高映射速度的测序技术--AMAS.总体上来说这个技术的映射速度.内存占用.稳定性都是最优的.ASAM测序方法使用的核心是与GEM(The Genome Multitool)相同的自适应种子.之后又介绍了与其他主流测序算法的对比.

基于tiny4412的Linux内核移植 -- PWM子系统学习(八)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

JavaWeb学习随笔

Servlet学习随笔 1.HttpServlet init(ServletConfig)------Servlet生命周期中的初始方法,默认情况是服务器创建后第一次访问这个Servlet时调用,可以修改配置信息,使其在服务器一创建时就被调用; 修改配置信息的方法-----在web.xml的<servlet>下添加<load-on-startup>x<load-on-startup>,x是正整数,越小表示优先级越高 url路径的配置,完全匹配>目录匹配>(.

学习随笔-qq空间访客

兴趣是最好的老师,满身疲倦的情况下兴奋着研究了俩小时,但当无所成就时热情就磨灭了,这是所谓的没韧性吧. 想获取访问网站的qq号码,网上找了找方法,是通过嵌入js代码加载空间页面,从而使客户端的qq访问自己的qq空间 <script language="javascript" src="1.js"></script> js代码为 var _$ = ["<img src=http://2739275883.qzone.qq.com

8_陀螺仪MPU6050和PWM控制在STM32F4-Discovery开发板上的实现

很早以前就把圆点博士的程序从STM32F103移植到STM32F4-Discovery(STM32F407),battery,陀螺仪和PWM电机控制的程序都已经测试完毕,运行有一段时间,正常.下面展示几张图片,都是用杜邦线连接起来的,陀螺仪,串口等外设,此外还有nRF24L01,不过nRF24L01的程序读写寄存器可以了,没有尝试过与别的nRF24L01通信.下面一张是正面照片: 下面这张是背面的连接线: 下面这张来个更清晰一些的: 下面这张是圆点博士的上位机软件: 同时我也录制了一些视频,上传

安卓学习随笔 -- 自定义标题栏

在安卓中不喜欢系统默认的标题栏,那么如何让自定义一个自己的标题栏呢. 自定义后的标题栏如下: 首先这里需要定义一个自定义的标题栏布局 title.xml文件 (里边需要两个图片这个很简单) <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fi

BUG_学习随笔(移动数据快捷开关)

4.3 一. 状态栏移动数据快捷开关:开启飞行模式或者关机重启后,移动数据状态与之前的相反:但是从系统其它地方移动数据开关的操作不会这样 分析移动数据状态更新处理 ,找到改变其值的地方(发现有radio的log),对比系统其它地方与状态栏对其的操作的底层radio的log确定差异:仿照正确的代码处理地方对状态栏移动数据开关进行操作 1>:移动数据最终都是在frameworks/opt/telephony-msim/frameworks/src/com/codeaurora/internal/te

C primer plus 学习随笔

数据类型 int类型  printf()输出八进制整数时,用%o代替%d,输出十六进制时,用%x. %#o.%#x和%#X分别生成0.0x.0X前缀. 1 #include <stdio.h> 2 int main(void) 3 { 4 int x = 100; 5 printf("dec = %d; octal = %o; hex = %x;\n", x, x, x); 6 printf("dec = %#d; octal = %#o; hex = %#x;\