什么是舵机?

这是来自百度的解释:舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。

百度上还有很大一部分解释,但我觉得那都是放屁,看再多解释不如一张实物图来的实在。

怎么驱动这个东西?

PWM信号

什么是PWM信号?

PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进
行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通
过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的
时间占据整个信号周期的百分比,例如方波的占空比就是50%.
使用PWM来控制舵机,理解占空比是关键。

如何实现PWM信号输出?

有一些芯片上是集成了PWM的,这可以在芯片手册和原理图上看出来。在这里,因为我使用的51芯片并没有PWM的管脚,所以我是用的软件来实现信号输出。当然,这种输出方式肯定是没有硬件PWM那么好,软件会存在一定的误差。

怎么控制舵机?

向黄色信号线“灌入”PWM信号

怎么让舵机转动多少度这个问题,其实很简单。我的解决方法是,直接用现成的数据不就好了吗。

0.5ms-------------0度; 2.5% 对应函数中占空比为250

1.0ms------------45度; 5.0% 对应函数中占空比为500

1.5ms------------90度; 7.5% 对应函数中占空比为750
2.0ms-----------135度; 10.0% 对应函数中占空比为1000
2.5ms-----------180度; 12.5% 对应函数中占空比为1250

编程实现

用51单片机使舵机运动起来,其实也挺简单的。用一个小实验来看看怎么让舵机动起来。这个小实验要让舵机每隔两秒转动一次。除了要用到PWM,还要用到定时器和中断。

先来配置定时器

void Time0Init()
{//定时器模式选择TMOD = 0X01;//给定初始值  我们先定一个0.5msTL0 = 0X33;TH0 = 0XFE;//开启定时器TF0 = 0;TR0 = 1;
}

定时器开启了,但这还没完。我们还需要用到中断,因为定时器每到0.5ms的时候就会溢出,需要CPU响应中断才可以将溢出标志位清0。刚好定时器0就有中断寄存器,可以实现中断响应。

所以完整的定时器配置应该是这样的:

void Time0Init()
{TMOD = 0X01;TL0 = 0X33;TH0 = 0XFE;TR0 = 1;TF0 = 0;//开启定时器0中断ET0 = 1;//开启总中断EA = 1;
}

有中断了,那自然就要有中断处理函数吧。定时器爆表的时间是0.5ms,上面说的占空比和让舵机转动角度的数据就派上用场了:

占空比:

就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比

0.5ms-------------0度; 2.5% 对应函数中占空比为250

1.0ms------------45度; 5.0% 对应函数中占空比为500

1.5ms------------90度; 7.5% 对应函数中占空比为750
2.0ms-----------135度; 10.0% 对应函数中占空比为1000
2.5ms-----------180度; 12.5% 对应函数中占空比为1250
中断处理函数
void Time0Handler() interrupt 1
{cnt++;  //统计爆表次数//重新给初值:因为CPU响应中断之后,中断处理函数才会被执行,这个时候TL0和TH0都需要重新赋值TL0 = 0X33;TH0 = 0XFE;if(cnt < jd)   //jd  角度{sg90_con = 1;  //给舵机高电平}else{sg90_con = 0;  //给舵机低电平}if(cnt == 40)   //一个周期20ms   0.5*40{cnt = 0;}
}

主函数

void main()
{jd = 1;Time0Init();  //定时器初始化sg90_con = 1; //舵机初始状态是高电平while(1){ jd = 3;    //转动90度cnt = 0;Delay2000ms();jd = 1;cnt = 0;Delay2000ms();}}

全部代码:

#include "reg52.h"sbit sg90_con = P1^1;int jd;
int cnt = 0;void Delay2000ms()     //@11.0592MHz
{unsigned char i, j, k;i = 15;j = 2;k = 235;do{do{while (--k);} while (--j);} while (--i);
}void Delay300ms()      //@11.0592MHz
{unsigned char i, j, k;i = 3;j = 26;k = 223;do{do{while (--k);} while (--j);} while (--i);
}void Time0Init()
{TMOD = 0X01;TH0 = 0XFE;TL0 = 0X33;TR0 = 1;TF0 = 0;ET0 = 1;EA = 1;}
void main()
{1jd = 1;  Time0Init();  sg90_con = 1;  while(1){jd = 3; cnt = 0;Delay2000ms();jd = 1; cnt = 0;Delay2000ms();}
}void Time0Handler() interrupt 1
{cnt++;  TH0 = 0XFE;TL0 = 0X33;if(cnt < jd)   {sg90_con = 1; }else{sg90_con = 0;       }if(cnt == 40)   {cnt = 0;sg90_con = 1;}
}

用51单片机怎么玩SG90舵机?相关推荐

  1. 教你几招51单片机新玩法

    经典更要有新思路,51单片机花式玩法,把经典玩出新高度 51单片机作为基础入门的一个单片机,还是应用最广泛的一种.因此有基于51单片机设计的经典之作,经典固然是经典,怎么在经典的基础上设计出更经典的作 ...

  2. 51单片机智能小车(舵机云台超声波避障+循迹+蓝牙+红外跟随)

    **51单片机智能小车(舵机云台超声波避障+循迹+蓝牙+红外跟随+遥控+TFT液晶显示屏) 本人由于使用的液晶显示屏,程序大于8K,所以更换为STC12C5A60S2芯片,与51芯片兼容. 功能比较多 ...

  3. STC 51单片机42——汇编 定时器 舵机

    ORG 0000H        HighH EQU 30H; 定义变量,高电平高八位         TimerH EQU 31H; 定义变量,高电平高八位定时值        TimerL EQU ...

  4. 51单片机趣玩制作—智能避障小车_V1.0

    文章目录 一.智能避障小车(V1.0) (一)准备阶段 1.制作思路 2.制作原则 3.硬件系统 (1)动力模块 (2)避障模块 (3)其它 4.软件系统 (1)动力模块 (2)避障模块 (3)模块合 ...

  5. 【Proteus仿真】51单片机+PCA9685 16路舵机控制

  6. 最简单DIY基于C#和51单片机上下位机一体化的PCA9685舵机控制程序

    51单片机物联网智能小车系列文章目录 第一篇:最简单DIY的51蓝牙遥控小车设计方案 第二篇:最简单DIY串口蓝牙硬件实现方案 第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车 第四篇:最简单DI ...

  7. 最简单DIY基于51单片机、PCA9685、IIC、云台的舵机集群控制程序

    51单片机物联网智能小车系列文章目录 第一篇:最简单DIY的51蓝牙遥控小车设计方案 第二篇:最简单DIY串口蓝牙硬件实现方案 第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车 第四篇:最简单DI ...

  8. 基于51单片机密码锁-舵机开锁-CXM

    这个项目的起因还是因为每次进出寝室十分的麻烦才有了这个项目 所以我和我的铁子就决定搞个密码锁 我负责软件我的铁子负责硬件 目录 原理图 主要功能函数讲解 硬件 先简单介绍一下整个架构 原理图 主要功能 ...

  9. 学习笔记3 Linux定时器和sg90舵机的综合应用

    今天学习了Linux的定时器功能,并复刻了学习51单片机时玩的智能感应垃圾桶项目.总体感觉难度不大. 先捏软柿子,sg90舵机,应该是市面上能能买到的最便宜的舵机了吧(我瞎说的,如果不是可以发链接给我 ...

  10. 两位动态数码管电子秒表c语言,清翔电子51单片机6课动态显示数码管作业秒表...

    单片机数码管电子钟单片机数码管电子钟单片机数码管电子钟单片机数码管电子钟单片机数码管电子钟单片机数码管电子钟单片机数码管电子钟单片机数码管电子钟单片机数码管电子钟 相关下载链接://download. ...

最新文章

  1. UE4创建第一人称射击游戏学习教程
  2. 实锤!沙特新规,出货箱单必须显示条形码,发票必须盖章!
  3. 编程之美 set 12 快速找出故障机器
  4. 亲测_精简版Fiddler抓包手机端GET请求过程.
  5. 电脑开机后,就会自动运行chkdsk,我想取消chkdsk,怎么取消
  6. junit jndi_使用Spring创建用于JUnit测试的JNDI资源
  7. 51nod1270(dp)
  8. B. Mashmokh and ACM
  9. 在Ubuntu下运行 apt-get update命令后出现错误:
  10. Lost Array(CF-1043B)
  11. activity和fragment生命周期
  12. 深度学习(二):传统神经网络
  13. win8.1能安装matlab,解决win8.1安装matlab出现无法访问您试图使用的功能...vcredist.msc...等等...
  14. matlab鲍威尔方法求函数,基于MATLAB的鲍威尔法求极值问题.doc
  15. SLAM学习笔记(Code3)----Eigen库中的Geometry
  16. 使用电脑过程中突然无法复制粘贴了
  17. 【老九学堂】【Java】详解常见的53个关键字
  18. 论文阅读《Characterizing BDS signal-in-space performance from integrity perspective》3
  19. 流程图flow-chart 教程
  20. EtherCAT理论学习笔记【二】——寻址服务与FMMU

热门文章

  1. 电工结业试卷_电工结业总结
  2. android源码分析辅助工具
  3. Windows必备程序 | CleanMyPC安装教程
  4. 微信小程序安装Vant组件库
  5. DevExpress控件导出Excel
  6. python求绝对值_python求绝对值
  7. 渗透测试-内网横向MS-17010利用方法总结
  8. Java题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
  9. 京瓷打印机m5521cdn_京瓷ECOSYS M5521cdn驱动
  10. C++批量创建文件夹