使用51单片机驱动舵机程序分析

出处:eefocus 发布于:2023-07-17 17:42:48

  舵机,又称伺服马达,是一种具有闭环控制系统的机电结构。舵机主要是由外 壳、电路板、无马达、齿轮与位置检测器所构成。其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向, 再驱动无马达转动,透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达设定位置,一般舵机只能旋转180度。舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同,需要注意。

  舵机的转动位置是靠控制PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms,占空比0.5~2.5ms 的正脉冲宽度和舵机的转角-90°~90°(即0~180度)相对应。注意,由于舵机牌子不同,其控制器解析出的脉冲宽度也不同,所以对于同一信号,不同牌子的舵机旋转的角度也不同。其原理是:它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号, 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。将获得的直流偏置电压与电位器的电压比较,获得电压差输出。,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。

  0.5ms------------0度;

  1.0ms------------45度;

  1.5ms------------90度;

  2.0ms-----------135度;

  2.5ms-----------180度;

  采用11.0592MHZ的51单片机驱动舵机转动程序如下:

  //上电自动转动

  #include

  unsigned char count;      //0.5ms次数标识

  sbit pwm =P1^0 ;          //PWM信号输出

  sbit jia =P2^4;           //角度增加按键检测IO口

  sbit jian =P2^5;           //角度减少按键检测IO口

  unsigned char jd;         //角度标识

  sbit pwm1 =P0^0 ;          //PWM信号输出给示波器,检测PWM波用

  void delay(unsigned char i)//延时

  {

  unsigned char j,k;

  for(j=i;j>0;j--)

  for(k=125;k>0;k--);

  }

  void Time0_Init()          //定时器0初始化

  {

  //定时器0装初值 用示波器检测后,11.0592MHZ晶振 定时0.5ms进入中断 装初值如下

  TH0  = (65536-445)/256;

  TL0  = (65536-445)%256;

  TMOD = 0x01;    //定时器0工作在方式1

  IE = 0x82;  //IE=0x82=1000 0010 等价于 EA=1 开总中断  ET0=1 开定时器0中断

  TR0=1;          //开定时器0

  }

  void Time0_Int() interrupt 1 //中断程序

  {

  //重装初值

  TH0  = (65536-445)/256;

  TL0  = (65536-445)%256;

  if(count< jd)

  {

  pwm=1;                  //确实小于,PWM输出高电平

  pwm1=pwm;              //接示波器用的io口,观测PWM波形用        }   //判断0.5ms次数是否小于角度标识

  //pwm=1;                  //确实小于,PWM输出高电平

  else

  {

  pwm=0;                  //确实小于,PWM输出高电平

  pwm1=pwm;             //接示波器用的io口,观测PWM波形用 }

  //  pwm=0;                  //大于则输出低电平

  count=(count+1);          //0.5ms次数加1

  count=count%40;     //次数始终保持为40 即保持周期为20ms

  }

  //此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,

  //通过jian按键控制反转

  /*void keyscan()              //按键扫描

  {

  if(jia==0)               //角度增加按键是否按下

  {

  delay(10);              //按下延时,消抖

  if(jia==0)              //确实按下

  {

  jd++;                 //角度标识加1

  count=0;              //按键按下 则20ms周期从新开始

  if(jd==6)

  jd=5;               //已经是180度,则保持

  while(jia==0);        //等待按键放开

  }

  }

  if(jian==0)                //角度减小按键是否按下

  {

  delay(10);

  if(jian==0)

  {

  jd--;                 //角度标识减1

  count=0;

  if(jd==0)

  jd=1;               //已经是0度,则保持

  while(jan==0);

  }

  }

  }*/

  void main()

  {

  //上电,舵机自动正反转

  //应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想

  while(1)

  {

  for(jd=1;jd<6;jd++)

  {

  count=0;

  Time0_Init();

  delay(50000000);

  }

  delay(50000000);

  for(jd=6;jd>0;jd--)

  {

  count=0;

  Time0_Init();

  delay(50000000);

  }

  }


版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

相关技术资料
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!