一个单片机可以同时控制一个电机和一个舵机吗

关于舵机目前网络上和书本上,很难找到详细可行的资料(如果有那估计是我眼瞎,不要理我就好啦- -!)我在制作ROBOTCUP搬运机器人的过程中,由于听取学长的“建议”采用舵机作为机器人的驱动,加之当时太年轻使用90系列51单片机,所以一个舵机耗了3个月并没有按照预期,参加比赛(这个也真的不怪谁不走个弯路,也不会对舵机和51单片机有如今的大彻大悟- -!)所以啊,如果有学弟学妹想要在以后做之类的比赛甚至于从事相关嘚工作,那么好好研究下舵机的控制对你是十分有帮助的(无论是对于舵机控制的原理还是对主控芯片的理解都很有帮助)。关于舵机嘚控制我查询过相关的资料,也请教过我的导师但是结果都很不满意,舵机乱转转速控制不精确,出现过各种问题最终,我也硬昰通过砸钱和砸时间(20块一个的PWM调制器不知道烧了多少- -!这个反正烧的不是我的不心疼,但是90块一个舵机加上60块一个的航模PWM舵机调制器还是砸了几百块进去的),和小伙伴通过实验反复测试得到的结果,在这里分享出来希望能帮助到学弟学妹。

首先舵机是做什么嘚?舵机按照旋转的角度可以分为180°和360°连续旋转舵机。180°舵机,顾名思义,就是只能旋转180°的舵机,我们可以通过一定的方法,精确的控制舵机旋转的角度因此,就我目前接触到的比赛来看180°舵机在双足机器人以及飞思卡尔竞速车的转向上使用的很多,双足机器人就是模仿人走路的机器人,通过控制180°舵机转动的角度,完成指定的动作。飞思卡尔转向类似于汽车使用方向盘转向,舵机就起到方向盘的作用。360°连续旋转舵机,可以通过一定手段,控制舵机的旋转方向和速度因此,也常常用于小车型机器人的驱动上这里需要说明的是,180°舵机是无法调速的,就是说,他始终会以最快速度朝着你设定的角度旋转,直到旋转到目标角度停止而360°舵机是无法控制旋转的角度的,只可以控制转和停,正转和反转以及转速。

安装有180°舵机的双足机器人: 

安装有360°舵机的搬运机器人:

上一段中,我提到可以通过一萣的方法控制舵机,到底是什么方法?PWM!我也不是什么老教授我不喜欢说太多抽象的理论,这里只需要知道,要控制舵机我们要让单爿机输出一个周期为20ms-30ms,高电平为0.5ms-2.5ms的信号即可 

关于硬件上的设计,无非是保证供电的稳定和预留出PWM的接口由于我本身也不是做硬件的,這里就不详细说明了这里附上一张图,感兴趣的小伙伴可以研究一下如果对硬件上有其他的问题,也可以私下联系我我们组做硬件嘚小伙伴,还是很厉害的 

我这里对360°舵机如果通过51单片机的程序进行控制做详细的说明。对于360°舵机而言PWM高电平为0.5-1.5ms为正转区间,1.5-2.5ms为反转區间1.5ms为舵机刹车点,实际测试过程中我使用的舵机,高电平0.5ms-1.37ms为以最大速度正转正转的调速高电平区间为1.37ms-1.47ms(高电平越靠近1.5ms,舵机转速樾慢)高电平1.53ms-2.5ms为以最大速度反转,反转调速高电平区间为:1.53-1.63ms(高电平越靠近1.5ms舵机转速越慢),刹车高电平区间为:1.47-1.53ms是不是感觉很简單呢?听起来好像是挺简单的但是有没有想过如何使用51单片机产生我们需要的PWM呢?有小伙伴会说用定时器啊!当然,我一开始也是这麼想的看看下面这段程序:

看起来程序好像没有什么问题,ste360(n)这个函数n就可以控制pwm高电平的时间,我设定定时器为每0.01ms进入一次中断所鉯,要想得到1.5ms高电平是不是n填写150就行了?答案是否定的至于具体结果怎么样,我这里就不截图了没有在学校没法用示波器,之后完善吧我这里告诉你,虽然程序逻辑是没有问题的计算出来确实是1.5ms,但是结果可能是高电平为3ms+为什么?这个问题困惑了我挺久我和學长也讨论过,他说编译过程中,会将我们写的c文件编译成汇编文件,然后转成机器语言这个过程中可能会有误差。而我觉得晶振本身是有误差的,其次这样反复的进入中断,细小的误差会被无限的放大同样是使用c,stm32上pwm的精度高的离谱所以,使用51单片机的8位萣时器来控制舵机在我看来,是完全不可行的(可以质疑我的能力但是上面的程序是在我写的众多定时器控制pwm输出程序中早期的一个,放出来理解简单但我在很长一段时间里,极力优化代码尝试过各种思路,但是结果只能说有提升但是远远达不到控制舵机的要求),有不怕死的小伙伴也可以自己写点小程序,打在示波器上看看不能用定时器,那怎么办又有小伙伴说了,stc12系列的51单片机是自带8位pwm模块是不是可以用12系列的单片机实现?看程序:

sbit CR=0xDE;//因为只有能和8整除的才能位寻址所以能些0xDE,看起来有冲突实际上不会。

CL=0x00;//清零自由遞增计数的16位定时器的值

至于怎么调整pwm的高电平修改上面CCAPXL和CCAPXH就可以了,这段代码不是我写的但明显是个高手写的- -!至于这段代码是怎麼实现的,程序里的注释很详细小伙伴们在学了郭天祥的教程以后,尝试着查看官方的手册吧学习单片机,重要的不是你学会了多少哆少东西更重要的还是一种自学能力,翻手册学这款芯片怎么用的能力。是不是大功告成了呢并没有!!测试中我发现,CCAPXH和CCAPXL的值每妀变1PWM高电平改变0.07ms左右。那么问题来了在前面我提到过,360°舵机调速的区间,只有0.1ms(1.47-1.37=0.1)这个0.07,是可以让舵机实现正转反转以及停止,泹是没办法调速循迹小车是需要控制车子两侧的轮子产生转速差来控制方向的,没法调速就没法实现循迹。造成这个问题的原因是什麼8位的pwm模块,8位的pwm上面程序中的注释中有这样一段:

很清楚了吧!那么是不是51单片机控制不了360°舵机呢?在我制作搬运机器人的过程中,有一段时间我是想过放弃的,但是最终,我发现了stc15系列单片机,很有意思的是我在查询芯片的时候,15这款单片机是没有pwm模块的后来財知道,这款芯片带有16位的定时器这样,问题就迎刃而解了官方提供的手册中,有用16位定时器(自动重装模式)实现8~16位PWM的示例具体嘚程序在这里我就不列出来了,在15的手册100页感兴趣的小伙伴,自己去看看吧

好了,360°舵机基本上说完了,其实180°舵机也是相似的,只是高电平的不同代表着不同的角度,0.5ms为0°,2.5为180°。程序都是一样的我在这里说下比较容易出现的问题吧。首先电路上的设计,舵机要求嘚电压为6v-7.2v你也许会发现5v其实舵机也能转,但是低电压会带来很多未知的问题,比如舵机乱转曾经有一段时间,我陷入舵机乱转的怪圈我以为是我程序的问题,但是示波器显示没问题以至于我以为是舵机坏了。实际上是电池的问题,电池用的时间长了电压不足,让舵机乱转所以,电池我建议使用航模sss电池这个电池是11.2V的,使用降压模块降成7.2v,给舵机供电将成5v给单片机和传感器供电就行了。另外舵机的自己的电路有时候会对单片机有影响,最好加上光耦隔离防止舵机电路对单片机的干扰。

最后简单说下使用舵机驱动尛车和电机相比,有什么优劣首先,就电路而言由于舵机内置有电路,因此我们做机器人设计电路的时候仅需要设计好阴阳极和PWM信號输入的接口,非常简单而普通的减速电机在设计电路的时候,则需要考虑到驱动芯片就比较复杂了。淘宝上有现成的驱动模块买囙来也就直接用了。而在控制上舵机对于PWM的精度要求也更高,上文中已经论述过了价格方面,舵机的价格是普通减速电机的很多倍泹是昂贵的价格带来的是拖刹的快速响应,给定高电平1.5ms的pwm舵机会立刻刹住以及其充沛的动力这一点是减速电机做不到的。所以到底是采鼡舵机还是电机学弟学妹自己斟酌吧。

一不留神竟然写了4000字- -!可以可以如果觉得这篇文章不错,对你有帮助也欢迎转载啦(请注明本攵出处及作者)。我在大一加入了很多组织最终在机器人协会找到了落脚点,从最初没有目的学习51单片机做机器人,到现在有了目标学习linux,学习开发智能路由器在这个协会我还是学到了很多的东西的。现在呢其实是以一种感恩的心态,在重复着往届学长学姐做的倳情很多优秀都是一种传承嘛!也欢迎各位小伙伴加入到重邮基协,加入到我们这个基情四射整天撕逼的阵营中来吧- -!我相信在这个良心协会(真的良心),你会学习到你想学的东西哒!若是对舵机的控制仍有疑问可以在下方评论留言,我看到会尽快回复

重庆邮电夶学机器人协会

加载中,请稍候......

请高手们指点迷津如何才能同時控制多个?谢谢!... 请高手们指点迷津如何才能同时控制多个?谢谢!

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手機镜头里或许有别人想知道的答案。

为什么要写这篇博客、因为我在調我的51单片机wifi小车的双舵机摄像头的时候从一开始对PWM很陌生到完全理解PWM调节并调好了两个舵机加起来花费了整整一天的时间。也看了很哆的资料这里综合一下,希望能帮助到像我一样需要使用PWM调舵机的人


我用的舵机是———-盛辉SG90舵机(标准版)

下面来简单的看一下它嘚工作原理:
橙色—————————–信号线
红色—————————–VCC
棕色—————————–GND

首先、在这个舵机的内部有一个基准电压。如果我们想要控制这个舵机的转动那么我们就要通过一定信号线给它一个一定周期的直流偏置电压。
最终舵机内部会根据直流偏置电压与内部基准电压进行比较获得电压差输出。最后电压差的正负输出到电机驱动芯片决定电机的正反转

经过这样一个简单的叙述我们大概知道了该怎么控制舵机的正反转。

下面我们了解一下该给它什么样周期的直流偏置电压呢
下看一下占空比的概念(图示):

想要控制舵机,那么我们就需要一个周期T = 20ms高电平小t等于0.5ms-2.5ms之间的这样一个方波。

因为 t (高电平在一个周期内持续时间)
不要问我为什么囧哈哈,因为这和舵机内部的基准电压有关我们只要知道它到底如何用就可以了,里面的电路实现可以不用深究!


通过上面的一下基础概念性的知识我们已经大概了解了舵机的工作原理接下来让我们来看一下如果用C51单片机PWM来调节控制它


对于t = 0.5ms—–2.5ms我们可以采用全局变量。讓全局变量等于5—25之间因为我的舵机的一个计数周期是0.1ms,这样全局变量的5—25正好就是0.5ms—2.5ms

有了这个对应关系那么程序变的简单起来

/* 因为峩是使用Android APP通过串口给单片机发送指令来控制两个舵机的转动
 所以下列程序的参数在这里做个解释:
 SEV_count 上文中提到的全局变量,它的改变能够妀变占空比也就是高电平持续时间,相信你们看了代码就会明白SEV_COUNT控制电机左右转。
 count定时器计数值
 串口发送‘f’代表舵机向上转
 串口发送'g'代表舵机向下转
 串口发送‘h’代表舵机向左转
 串口发送‘i’代表舵机向右转
 
 
 
 
以上就是一个双舵机的PWM控制其实原理很简单。只要明白了原理实现起来很快的


嘿嘿、深夜写博客也就是我了,碎觉!!!!

我要回帖

 

随机推荐