找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13718|回复: 15
收起左侧

初学单片机之PWM控制舵机的原理与C语言源程序

  [复制链接]
ID:375112 发表于 2018-8-22 11:22 | 显示全部楼层 |阅读模式
1、舵机图片如下:
1534907065746.jpg

舵机有三根线、一般按顺序依次来说是: 地(GND),电源(VCC),信号线 ;

2.舵机的工作原理是:
1534907494490.jpg

控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。

3.舵机的控制:
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:
   0.5ms--------------0度;1.0ms------------45度;  1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度

4 总结经验:
舵机 简单来说 就是给它高电平延时xms;然后在低电平延时(20-x)ms,然后while 循环,就可以了  ;具体的程序 在 附件下载(其中包含了 步进电机的程序 可忽略)

提供以下方式的驱动程序:
使用T0、T1两个定时器产生PWM控制
使用T0一个定时器产生PWM控制
使用PCA的16位软件定时器产生PWM控制单片机源程序如下:
  1. /***
  2. **项目名称:舵机使用介绍(测试程序部分)
  3. **实现方法:使用PCA的16位软件定时器产生PWM控制
  4. **编写时间:2017.07.06
  5. **使用芯片:stc12c4052ad
  6. **时钟频率:使用外部晶振频率12MHz
  7. **联系方式:QQ群号-143867886
  8. *****更多内容可在微信公众号(电子创客派 ID:e_diy_c)查看*****
  9. ***/

  10. #include <stc12c2052ad.h>
  11. #include <intrins.h>

  12. typedef unsigned char u8;
  13. typedef unsigned short int u16;

  14. sbit CTRL = P3^7;                                                                //舵机控制端口

  15. void delay_100ms(u16 x);

  16. u16 TIME = 20000;                                                                //PWM周期时间(单位us)
  17. u16 Min = 800;                                                                        //高电平最小持续时间
  18. u16 Max = 2200;                                                                        //高电平最大持续时间
  19. u16 aTime = 800;                                                                //高电平持续时间
  20. u8 Degree = 200;                                                                //单位时间宽度(最小是舵机死区设定大约10us)

  21. void main()
  22. {
  23.         CTRL = 0;
  24.        
  25.         //PCA0配置
  26.         CCAPM0 = 0x48;                                                                //设置PWM0为16位软件定时器
  27.         CCAPM0 |= 0x01;                                                                //PCA0比较中断使能
  28.         CL = 0;                                                                                                //PCA计数器低8位
  29.         CH = 0;                                                                                                //PCA计数器高8位
  30.         CCAP0L = aTime;                                                                //PCA0比较寄存器低8位
  31.         CCAP0H = aTime >> 8;                                        //PCA0比较寄存器高8位
  32.         CR = 1;                                                                                                //使能PCA计数
  33.         EPCA_LVD = 1;                                                                        //使能PCA中断
  34.         EA = 1;                                                                                                //打开中断总开关
  35.        
  36.         while(1)
  37.         {
  38.                 //逆时针旋转
  39.                 while(aTime < Max)
  40.                 {
  41.                         delay_100ms(5);
  42.                         aTime += Degree;
  43.                 }
  44.                
  45.                 //顺时针旋转
  46.                 while(aTime > Min)
  47.                 {
  48.                         delay_100ms(5);
  49.                         aTime -= Degree;               
  50.                 }
  51.         }
  52. }


  53. void Delay100ms()                //@12.000MHz
  54. {
  55.         unsigned char i, j, k;

  56.         _nop_();
  57.         _nop_();
  58.         i = 5;
  59.         j = 144;
  60.         k = 71;
  61.         do
  62.         {
  63.                 do
  64.                 {
  65.                         while (--k);
  66.                 } while (--j);
  67.         } while (--i);
  68. }

  69. void delay_100ms(u16 x)
  70. {
  71.         while(x--)  Delay100ms();
  72. }


  73. //PCA中断
  74. void _PCA_() interrupt 6 using 1
  75. {
  76.         static u8 flag = 1;
  77.        
  78.         //PWM0比较中断
  79.         if(CCF0)
  80.         {
  81.                 CCF0 = 0;                                                                                //中断标志位要软件清零

  82.                 if(flag)                                                                                //如果之前PWM0_CTRL是高电平,则接下来产生时间宽度为TIME-aTime的低电平
  83.                 {
  84.                         CTRL = 0;
  85.                         CCAP0L = TIME;
  86.                         CCAP0H = TIME >> 8;
  87.                 }
  88.                 else                                                                                                //如果之前PWM0_CTRL是低电平,则接下来产生时间宽度为aTime的高电平
  89.                 {
  90.                         CTRL = 1;
  91.                         CL = 0;
  92.                         CH = 0;
  93.                         CCAP0L = aTime;
  94.                         CCAP0H = aTime >> 8;
  95.                 }
  96.                
  97.                 flag = 1 - flag;
  98.         }
  99. }
  100. ……………………

  101. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
制作步进电机控制模块_C51程序.zip (5.28 KB, 下载次数: 67)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:375112 发表于 2018-8-22 11:23 | 显示全部楼层
如果使用 51 单片机控制多个的话 考虑到 功率问题 可以加个 三极管;(放大信号
回复

使用道具 举报

ID:1 发表于 2018-8-22 17:22 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:389000 发表于 2018-8-22 18:40 | 显示全部楼层
学到了,学到了
回复

使用道具 举报

ID:316572 发表于 2018-8-24 10:27 | 显示全部楼层

如果使用 51 单片机控制多个的话 考虑到 功率问题 可以加个 三极管;(放大信号
回复

使用道具 举报

ID:461204 发表于 2019-1-3 18:21 | 显示全部楼层
厉害了
回复

使用道具 举报

ID:482847 发表于 2019-3-1 17:07 | 显示全部楼层
可以的,非常详细的资料
回复

使用道具 举报

ID:385135 发表于 2019-3-8 23:14 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:543113 发表于 2019-5-20 19:14 | 显示全部楼层
感谢分享,谢谢
回复

使用道具 举报

ID:594378 发表于 2019-8-2 23:12 | 显示全部楼层
学到了,点赞
回复

使用道具 举报

ID:592852 发表于 2019-8-3 15:53 | 显示全部楼层
谢谢分享,点赞
回复

使用道具 举报

ID:375382 发表于 2019-8-5 18:33 | 显示全部楼层
51黑上面的好资料
回复

使用道具 举报

ID:639952 发表于 2019-11-12 11:17 | 显示全部楼层
Mr.wang7 发表于 2018-8-22 11:23
如果使用 51 单片机控制多个的话 考虑到 功率问题 可以加个 三极管;(放大信号

三极管是加在哪里的呢,因为是初学者不是特别明白
回复

使用道具 举报

ID:110278 发表于 2020-3-17 15:02 | 显示全部楼层
不错。
回复

使用道具 举报

ID:729395 发表于 2020-4-14 23:44 | 显示全部楼层
大神好厉害
回复

使用道具 举报

ID:725873 发表于 2020-5-7 09:19 | 显示全部楼层
很好感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表