对180度360度sg90舵机的使用经验+单片机程序

2020-01-19来源: eefocus关键字:sg90舵机  使用经验  单片机程序

大部资料都是在网上找到网友大神所共享的,我只是在理解他们的资料上加上了自己的一些注解,在网上找了几种舵机的,刚接触有点懵,之后找得多了就理解了,想要控制一个硬件就要先了解这个硬件。这里有介绍180度舵机和360度舵机的具体使用,有网上大神的程序,这个更多的是一个网上对舵机使用的一个整合。如果若有不到之处,希望大家积极指出,

模拟舵机:需要不断的发送目的地PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要不断的发送90度的PWM信号直到到达指定位置才能停止。我们使用的SG90就是一个模拟舵机


数字舵机:只需给一个目的地PWM信号,即可旋转到指定位置。例如:我现在让它旋转90度,我只需要发送一次90度的PWM信号,它就可以旋转到90度。


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


占空比:高电平(或者低电平)占整个周期的时间就叫作占空比。

HC]T`2GVI@AIF5{]5IQ_LP5.png

了解了上面的基本知识我们就可以来认识我们今天的主角:sg90舵机

B32E1FE5C21D13AC897240E4772956E9.jpg
上图就是我们今天的主角,有三条线,接线方法:
         

棕色----------------------GND



          红-------------------------VCC


          橙色----------------------信号线



原理:舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。

那么我们如何获取这个 舵机呢。 
首先我们上某宝能够找到180°、360°SG90舵机。

我们先来讲的是180度的舵机。
我们知道sg90舵机是一个模拟舵机,需要我们一直给指定的脉冲。那么这个指定的脉冲是什么?查资料可以知道180度舵机不同占空比与对应角度
关系:
高电平在一个周期(20ms)的持续时间对应的舵机角度,

  高电平t占整个周期T(20ms)的时间
  
  舵机旋转的角度
  
  0.5ms
  
  0度
  
  1ms
  
  45度
  
  1.5ms
  
  90度
  
  2ms
  
  135度
  
  2.5ms
  
  180度
  
如下图可形象地表示脉冲与角度关系
20140419164038468.gif 


知道了脉冲与角度关系,主要讲解一下如何写这个脉冲,这里所使用的是方法是定时器+中断,定时器每0.1ms中断一次,需要中断200次才能达到20ms。我们此时需要一个全局变量来记录中断的次数,当中断达到200次时,全局变量重新清零。当中断次数小于n时,信号线输出高电平,否则输出低电平。此时n的值对应关系如下。


n=5>>0度   n=10>>45度   n=15>>90度   n=20>>135度   n=25>>180度



voidInitTimer()        //这里设置0.1ms中断一次   使用11.0592Mhz晶振
{
    TMOD = 0x01;
    TH0 = 0xFF;
    TL0 = 0XA4;      
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
voidTimer() interrupt 1 
{
    TH0 = 0xFF;
    TL0 = 0xA4;       //重新赋值
        count++;
        if(count<=200)
        {
           if(count<=n)
           {
                      pwm=1;
           }
           else
           {
                      pwm=0;
           }
        }
        else
        {
           count=0;
           pwm=0;
        }
}

单片机源程序如下:
#include
#defineuchar unsigned char
#defineuint unsigned int

sbitpwm=P1^0;      //信号输出
sbitk1=P3^5;        //按键k1接P3^5,控制顺时针旋转
sbitk2=P3^4;        //按键k2接P3^4,控制逆时针旋转

ucharcount=0;
uchar n=5;       //初始位置-在0°附近  改变n值可以改变舵机的初始位置

//这个n值在不同的舵机可能存在一点误差,可以改变他的值来试试具体位置

voiddelay5ms() 
{
    unsigned char a,b;
    for(b=19;b>0;b--)
        for(a=130;a>0;a--);
}
voidkey()
{
  if(k1==0)
  {
            delay5ms();
          if(k1==0)
          {
             while(k1==0); //判断当键盘松开时
                   if(n<=25) n++;//判断是否旋转到180°
                 else n=26;           
          }
  }
    if(k2==0)
  {
            delay5ms();
          if(k2==0)
          {
             while(k2==0); //判断当键盘松开时
                   if(n>=6) n--; //判断是否旋转到0°
                 else n=5;
          }
  }
}

voidInitTimer()        //  0.1ms   11.0592Mhz
{
    TMOD = 0x01;
    TH0 = 0xFF;
    TL0 = 0XA4;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

voidmain()
{
    InitTimer();
        while(1)
        {
          key();
        }
}

voidTimer() interrupt 1      //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
{
    TH0 = 0xFF;
    TL0 = 0xA4;
        count++;
        if(count<=200)
        {
           if(count<=n)
           {
                      pwm=1;
           }
           else
           {
                      pwm=0;
           }
        }
        else
        {
           count=0;
           pwm=0;
        }
}

Ps:某宝上可能还会有另一种90度sg90舵机,这个是一个另类的180度舵机,可以一样使用上面的程序,他与180度舵机不同的是不同占空比对应的舵机角度如图:
1)5{K@96(1XBWGPY`KU]TTY.png 

360度舵机

顾名思义,360度舵机可以360度旋转,因此与180度舵机有相当大的区别,首先360度舵机不能够控制旋转角度,一般的舵机是给一个特定的PWM,舵机会转到相应的角度,而360度舵机是只能够控制方向和旋转转速,所以360度舵机给定一个PWM,会以特定的速度和方向转动。


PWM信号与360舵机转速的关系:

0.5ms----------------正向最大转速;
1.5ms----------------速度为0;
2.5ms----------------反向最大转速;


总结:无论是180度90度还是360度舵机,只要我们知道了它脉冲与角度的对应关系我们就可以利用定时器加中断的方法来产生这个相应的PWM信号,进而控制舵机旋转指定角度。
}OQ]EY@S~7GHQ~PW7I6MV5R.png 

关键字:sg90舵机  使用经验  单片机程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic486146.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:DS3231温度读取实验 附单片机源程序
下一篇:单片机+MAX1898的智能手机充电器PCB电路Proteus仿真+源程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

浅谈用单片机控制SG90舵机(原理+编程)
SG90舵机(模拟舵机)一、日常吐槽额~~~~~~,在开始今天的主题之前,占用大家一些时间。容我骂街一番,$##%%%$%#$#$$%^艹……………….,哎呀妈呀,骂的有点喘不过来了,额~呸,是言(文明人,文明人)。可能就奇了怪了,你不好好码字,骂什么街呢!说来惭愧,上边被骂的人就是笔者自己。今天在调试程序的时候,对,就这个鬼舵机,怎么都不转!!!检查硬件---检查程序---百度,如此反复N小时。始终找不到问题所在,程序呢,怎么看,怎么美!硬件呢,怎么看,怎么帅!说是急,那是快,电闪雷鸣,刀光剑影,啪,一个数字1摔在脸上,于是乎,快速打开课本,啪~啪~啪,数字0、1,大脑瓜子一拍,哎呀,一定是这错误了!快速拿起闪闪发光的鼠标
发表于 2019-11-25
浅谈用单片机控制SG90舵机(原理+编程)
51单片机控制sg90舵机扇形摇摆程序
这是控制两个sg90的扇形摇摆程序!#include "reg52.h"sbit a=P1^0;sbit b=P1^1;#define uchar unsigned char#define uint unsigned intvoid delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delayus2x(unsigned char t){while(--t);}  void delay750us()        {       
发表于 2019-11-22
浅谈用单片机控制SG90舵机
SG90舵机(模拟舵机)一、日常吐槽额~~~~~~,在开始今天的主题之前,占用大家一些时间。容我骂街一番,$##%%%$%#$#$$%^艹……………….,哎呀妈呀,骂的有点喘不过来了,额~呸,是言(文明人,文明人)。可能就奇了怪了,你不好好码字,骂什么街呢!说来惭愧,上边被骂的人就是笔者自己。今天在调试程序的时候,对,就这个鬼舵机,怎么都不转!!!检查硬件---检查程序---百度,如此反复N小时。始终找不到问题所在,程序呢,怎么看,怎么美!硬件呢,怎么看,怎么帅!说是急,那是快,电闪雷鸣,刀光剑影,啪,一个数字1摔在脸上,于是乎,快速打开课本,啪~啪~啪,数字0、1,大脑瓜子一拍,哎呀,一定是这错误了!快速拿起闪闪发光的鼠标
发表于 2019-10-17
浅谈用单片机控制SG90舵机
STM32控制SG90舵机
简介通过使用STM32控制SG90舵机进行转动PWM输出:PC6定时器:TM3,通道1接线如下:控制原理及PWM配置舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分PWM周期为20ms = (7200*200)/72000000=0.02所以TIM_Period = 199,TIM_Prescaler = 7199占空比 = t / T 相关参数如下:t = 0.5ms——————-舵机会转动 0 °t = 1.0ms——————-舵机会转动 45°t = 1.5ms——————-舵机会转动 90°t = 2.0ms——————-舵机会转动 135°t = 2.5ms
发表于 2019-08-23
STM32控制SG90舵机
关于STM8S的UART2串口的学习记录以及使用经验
前言这是本人第一次接触STM8S单片机,所以记录一下,方便日后查找。正文Uart2串口作为STM8S的标准串口之一,它的作用就是以有线连接的方式为STM8S单片机提供对外通讯的通道。初始化要想使用串口的第一步就是要完成对串口相关引脚的初始化以及串口本身的初始化。具体代码如下:GPIO_DeInit(GPIOD);GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_PU_NO_IT);GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);   UART2_DeInit();UART2_Init(115200
发表于 2020-01-07
AVR单片机经典使用经验
熔丝位的使用:. 系统晶振的选择.BOD的使用.启动延时.Mega8的PC6引脚,RESET与通用I/O的转换.JETAG接口和通用I/O的转换.启动向量的转换,BOOT-LOAT区大小的设置提高硬件可靠性的考虑:.尽量采用片内晶体、采用低频率的系统时钟、振荡电路的输出小幅度。.选择合适的启动延时参数.使用BOD、片内的看门狗.合理休眠方式的使用.不用I/O口设定输出低电平.利用内部的EEProm和寄存器MCUCSR判断复位标志,进行不同的处理提高软件设计的能力和水平:尽量合理采用高级语言设计编写系统程序。有许多人认为使用汇编写程序比较精简,而用高级语言开发会浪费很多程序空间,其实这是一种误解。对一个有经验的,而且非常熟悉某种单片机
发表于 2019-11-09
AVR单片机经典使用经验
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved