当前位置:   article > 正文

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

51单片机舵机的程序

舵机,又称伺服马达,是一种具有闭环控制系统的机电结构。舵机主要是由外 壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由控制器发出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.0592MHZ51单片机驱动舵机转动程序如下:

  1. //上电自动转动
  2. #include <reg52.h>
  3. unsigned char count; //0.5ms次数标识
  4. sbit pwm =P1^0 ; //PWM信号输出
  5. sbit jia =P2^4; //角度增加按键检测IO口
  6. sbit jian =P2^5; //角度减少按键检测IO口
  7. unsigned char jd; //角度标识
  8. sbit pwm1 =P0^0 ; //PWM信号输出给示波器,检测PWM波用
  9. void delay(unsigned char i)//延时
  10. {
  11. unsigned char j,k;
  12. for(j=i;j>0;j--)
  13. for(k=125;k>0;k--);
  14. }
  15. void Time0_Init() //定时器0初始化
  16. {
  17. //定时器0装初值 用示波器检测后,11.0592MHZ晶振 定时0.5ms进入中断 装初值如下
  18. TH0 = (65536-445)/256;
  19. TL0 = (65536-445)%256;
  20. TMOD = 0x01; //定时器0工作在方式1
  21. IE = 0x82; //IE=0x82=1000 0010 等价于 EA=1 开总中断 ET0=1 开定时器0中断
  22. TR0=1; //开定时器0
  23. }
  24. void Time0_Int() interrupt 1 //中断程序
  25. {
  26. //重装初值
  27. TH0 = (65536-445)/256;
  28. TL0 = (65536-445)%256;
  29. if(count< jd)
  30. {
  31. pwm=1; //确实小于,PWM输出高电平
  32. pwm1=pwm; //接示波器用的io口,观测PWM波形用 } //判断0.5ms次数是否小于角度标识
  33. //pwm=1; //确实小于,PWM输出高电平
  34. else
  35. {
  36. pwm=0; //确实小于,PWM输出高电平
  37. pwm1=pwm; //接示波器用的io口,观测PWM波形用 }
  38. // pwm=0; //大于则输出低电平
  39. count=(count+1); //0.5ms次数加1
  40. count=count%40; //次数始终保持为40 即保持周期为20ms
  41. }
  42. //此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,
  43. //通过jian按键控制反转
  44. /*void keyscan() //按键扫描
  45. {
  46. if(jia==0) //角度增加按键是否按下
  47. {
  48. delay(10); //按下延时,消抖
  49. if(jia==0) //确实按下
  50. {
  51. jd++; //角度标识加1
  52. count=0; //按键按下 则20ms周期从新开始
  53. if(jd==6)
  54. jd=5; //已经是180度,则保持
  55. while(jia==0); //等待按键放开
  56. }
  57. }
  58. if(jian==0) //角度减小按键是否按下
  59. {
  60. delay(10);
  61. if(jian==0)
  62. {
  63. jd--; //角度标识减1
  64. count=0;
  65. if(jd==0)
  66. jd=1; //已经是0度,则保持
  67. while(jan==0);
  68. }
  69. }
  70. }*/
  71. void main()
  72. {
  73. //上电,舵机自动正反转
  74. //应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想
  75. while(1)
  76. {
  77. for(jd=1;jd<6;jd++)
  78. {
  79. count=0;
  80. Time0_Init();
  81. delay(50000000);
  82. }
  83. delay(50000000);
  84. for(jd=6;jd>0;jd--)
  85. {
  86. count=0;
  87. Time0_Init();
  88. delay(50000000);
  89. }
  90. }
  91. }


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/456573
推荐阅读
相关标签
  

闽ICP备14008679号