amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 21282|回复: 50

菜鸟对于单片机输出PWM信号控制商品电调/舵机的理解,和两个简单的多路PWM信号输出的

[复制链接]
发表于 2011-8-3 01:21:03 | 显示全部楼层 |阅读模式
写这篇帖子,其一是最近看到几个关于如何驱动商品电调的帖子,看了LZ的提问和回帖,发现有些地方还是有点误解(或者是我误解...),于是就想来总结一下。
其二是把自己的理解和方法说出来,希望能和各位高手多交流。“别人总能看到自己看不到的错误和缺点”,也是为了自己能做得更好。

我虽然过几天才奔2,但是玩航空模型已经10年,最近也在自己做二轴飞控,涉及到舵机和电调的控制,这方面我也接触了不少的。把自己懂的,或者半懂不懂的,或者YY的,写出来希望对需要的人有点点帮助或者把他拉入歧途~


关于模型的PWM
模型的PWM不是各位电子高手所习惯的几KHZ的PWM信号,模型用的频率要慢很多,但是原理上是一致的。模型的PWM频率很低,几乎都是用软件+定时器做的。在说之前,首先要提到一个东西,模型的标准接收机。这个是用于接收遥控信号,并且 “直接” 给多个通道的舵机/电调输出PWM信号的。它的输出标准,是我们用单片机输出PWM信号控制商品舵机/电调的参考。
我来说说它每个通道的输出标准
输出频率    50HZ
高电平时间  0.5~1.5ms (或0.5~2.5ms 取决于操控者手上的发射机)
高电平电压  5V   

先说输出频率,这个频率50HZ最为标准,但是也有些商品接收机超过50HZ的,有的可以达到70HZ,所以说这个多一点,少一点,对于标准的舵机/标准电调没有影响。

再说高电平时间,电调/舵机都是以高电平时间长度判断量的大小的。高电平0.5ms在电调上,代表油门为0%,相应的1.5ms或者2.5ms对应油门为100%。但是要注意,这个也不是绝对的,电调为了保证PWM的值在油门行程以内,可能大约小于20%的都认为是油门0,从20%开始, 大于80%的时候认为是达到100%了。实际给操作者的感觉就是,操作杆上的20~80%的行程就对应油门0~100%了。其实这个没什么影响,对于电调,就按0.5~1.5ms做就好,对于舵机就按0.5~1.5ms(对应0~90度)或者0.5~2.5ms(对应0~180度)做就好。

然后说说高电平的电压,这个我没有实际测量过,5V肯定可以,3.3V就不行了,至少我手上的XXD电调就不认了。商品电调很多都是用AVR M8做控制的,我虽然不懂AVR,但是混了那么久,也知道AVR M8是5V的单片机了。至于得不得,那你可以自己去试了,我建议,务必要用各种方法把它弄到标准的5V。方法很多,上拉电阻可以,三极管可以,电平转换芯片可以,百度一下“单向电平转换”很多方法,怎么做由你的。不做的话,假设你碰运气驱动了这个牌子的舵机,插上另一个牌子的就没反应..这也是有可能的。

说完标准,再说不标准,现在的商品电调,大多可以用超过50HZ的PWM去输出,比如300HZ,400HZ,如果初始化的时候行程设置在0.5~2.5ms 400HZ理论上到顶了...至于为什么,你算算2.5ms * 400 等于多少就懂了。再往上就要各位自己测试过了。好赢可以,中威特可以,XXD也可以。

还有一个不标准,大约5、6年前出的一种舵机,叫“数字舵机”或者“数位舵机”或者“数码舵机”都是一个意思,它的特性同上,也可以工作在几百HZ的PWM,买的时候要注意,不是数字舵机的话,你接上超过100HZ的PWM,肯定乱串(100HZ只是个大概值,普通舵机的还是以50HZ为准)。数字舵机精度相对较高,因为它的工作周期快,精度设置得比较高也不容易产生抖舵的情况。弄电子的DX都懂...这个不会增加什么成本,所以数字舵机也不贵。刚出来的时候,它是给模型直升机的高端陀螺仪(都是用ADI的芯片啊>_<!!)用的,可以更好地“锁尾”,这种舵机因为没什么技术含量,现在都白菜价了。
推荐买“数字”+“金属齿”+“空心杯”的舵机,这个就比较贵了,如果减去空心杯,就便宜很多。

关于商品电调的初始化和启动
要注意,电调的调试需要遥控器,或者自制一个已经能输出0.5~1.5msPWM的“东西”
这个初始化过程,xxd好像没要我初始化,但是好赢和中威特好像是要的,至于怎么初始化,注意看说明书,或者卖家宝贝下面的几行字.很容易的.看过就懂了。
初始化,要设置的好像是行程,电池保护,刹车之类的,需要的话,我再讲。但是手上只有XXD的电调,所以要讲也只能结合网上的说明书讲了。

商品电调为了安全,上电的时候必须保证油门为最小值 0%,等到电机唱完歌后才能开始控制PWM输出油门。另外,如果在上电的时候,油门推到最大值,将进入设置状态。这点是编程的时候需要注意的

商品电调都带有5V的输出,一般都是两个叠在一起的小7805降压降出来的,这个是给舵机和接收机供电用的,大概可以提供1A左右的电流。我们用单片机控制的话,不需要供电的时候,一定要记得把电调输出的电源正极咔嚓掉,不然你的电路可能会有危险!这个必须记得!

题外话,对于四轴类飞行器,我推荐的设置:锂电保护 刹车开 直升机启动模式关,对于固定翼类的,刹车可以关掉,直升机关掉(其实拿来就用就好,不用设置)

相比之下,舵机就不需要注意那么多,随心所欲用就好

说了那么多废话,总结一下,要注意的就是
1.高电平电压 5V
2.数字舵机+普通电调 PWM频率400以下都OK
3.高电平时间 0.5~1.5ms 或0.5~2.5ms (模型里一般都用前者,后者机器人用得比较多)
4.电调启动要注意等那么几秒
5.电调有供电的功能,要小心

反正保持标准,就能通吃所有的商品电调/舵机

头有点痛了...有些地方可能说得不对,希望各位拍砖..

如果按这样一小段程序的样子写,应该可以实现对单通道电调/舵机的控制了。我大概按思路现场写的,只说明原理,因为delay_us这样的函数,在标准51上,应该做不到,速度太慢。
void main()
{
     int i = 1000;
     while(1)
     {
         P1_0 = 1;
         delay_us(500);                //即最前面的0.5ms高电平,这段是固定的
         delay_us(i);                  //通过调节i的范围 0~1000可以对应0.5~1.5ms的PWM,
         P1_0 = 0;
         delay_us(20000 - 500 - i);   //这是低电平时间,要把整个周期控制在50HZ
     }
}

按以上程序的样子写,虽然可以做到调节PWM控制舵机/电调了,但是现实中明显不可能这样做,因为单片机还要做别的事,而且只输出一个通道PWM根本做不出四轴。

我就把我做过或者思考过的两种做多通道商品舵机/电调用的PWM的方法给大家说说,然后对比一下各自的优缺点,我也很期待各位能分享一下其他的方法~

第一种,是我正在用的,用单片机的定时器,输入每个高电平的时间然后拉高引脚开始计时,到时间后拉低引脚,然后在中断里切换到下一个通道,继续拉高引脚重复上一步,纯中断操作。
第二种,是我打算要做的,用单片机定时器做大概10us的中断,一开始直接拉高每个通道的电平,然后每10us把所有通道的值减一,然后判断哪一个通道的值为0了,就拉低电平。

两种方法都能实现多通道PWM信号输出,但是各自的优点缺点都很明显。

第一种
优点:精度高,因为是用定时器计时可以做到远高于8位的精度(我这里10~12位)。每个通道逐个扫描(这也算优点?)。耗费单片机时间少,对系统负荷很轻,在我的飞控里,这片单片机同时负责姿态计算,浮点和三角函数都用了..

缺点:输出的通道少,50HZ的频率时只能输出 13个(0.5~1.5ms)或者8个(0.5~2.5ms)通道,具体为什么,你算算13*1.5 还有8*2.5等于多少就知道了。50HZ,就是要在20ms内把所有通道都扫描一次。同时,也使得PWM频率提不上去,反应迟钝对于飞控来说,的确很棘手。

第二种
优点:支持通道可以达到数十个(假如每2.5ms输出8个通道,20ms内就可以扫描8组通道,一共就可以输出64个通道!!)。输出PWM的频率可以很高(可以做到理论最大值)。

缺点:占用单片机时间很集中(集中在输出高电平的时候)。10us(按0.5~1.5ms对应只能做到7位不到的精度)的定时器中断,不是一般的51能办到的,我用的C8051F 50MIPS都很吃力。

总结以上,第一种方式,适合给同时做连续采集传感器信息,需要连续计算的单片机用,而第二种因为占用时间太集中,更适合单独做成舵机驱动模块,机器人方面应用应该会多一些...

新手习惯用while循环来定时,这样非常容易抖舵,只要有中断,就会开始抖,不用说也知道原因了吧?要解决其实很简单的,只要用硬件定时器就可以了。

另外,控制商品电调/舵机,八位精度足以。我试过一个“标准舵机”,我的八位精度PWM从100慢慢跳到107之后,他才给我羞涩地动了一格...

OK,结

如果需要的话,我可以把第一种方式的代码整理出来贴上来,只怕让大家笑话了就不好了..

有什么问题,或者我说得不对的地方,一定要回复告诉我..要不然我害了别人也不好>_<!!
最近论坛审核好严格...庆幸自己早早就注_册了号,但是新到的同学,有问题未能回复提问的..可以发邮件给我 majianjia*live.com(你知道的)
终于打完..关机睡觉..
发表于 2011-8-3 02:01:33 | 显示全部楼层
mark
发表于 2011-8-3 02:02:55 | 显示全部楼层
过几天才奔2,玩模型10年!真的假的
 楼主| 发表于 2011-8-3 02:11:44 | 显示全部楼层
第一张模型的奖状是四年级的时候,飞向北京杯……橡筋动力的市里第三…之后就玩电动的了。大概有十年了吧
那些都是小玩意,不值得提
发表于 2011-8-3 02:26:13 | 显示全部楼层
仔细读了一遍,写得很好,我用的飞思卡尔s12,可以输出4路16位PWM,这样不用定时器有什么缺点么?
发表于 2011-8-3 02:27:18 | 显示全部楼层
lz好厉害啊,我刚接触模型
 楼主| 发表于 2011-8-3 02:43:15 | 显示全部楼层
回复【4楼】wsn05  
仔细读了一遍,写得很好,我用的飞思卡尔s12,可以输出4路16位pwm,这样不用定时器有什么缺点么?
-----------------------------------------------------------------------

我没用过飞斯卡尔,不过你确定他能输出 50hz那么低频率的pwm?

编辑原因
我查了一下,用飞思卡尔做pwm控制舵机很方便 真好
发表于 2011-8-3 08:34:37 | 显示全部楼层
改用STM32吧,每个定时器可以输出4路PWM,16位的,芯片还便宜^_^
发表于 2011-8-3 11:13:43 | 显示全部楼层
对于多路舵机控制最佳的方式应该是你描述的第一种方法——定时器的pwm输出。比如ATMEGA48的3个定时器可以输出6路PWM,只要设置pwm周期为20ms,ocrxa、ocrxb寄存器从0——255/4=63(我记得的标准舵机是以20ms的PWM工作,前0-5ms高电平对应舵机的角度,通常是0——180°故ocr寄存器的设置不要大于63高电平就不会超过5ms)。这种方式准确,编程容易。要是使用stm32f103系列定时器就更多,而且16位的定时器会获得更好调节细分。

通常商品多路舵机控制器并不会使用强大的单片机,通常m8就ok了。24路乃至更多的路数是靠与门电路来扩展的。比如一个定时器的pwm输出通道同时接一个74hc08(2输入——4与门)的4组之一的输入端,再用单片机的4个普通io分别接与门的另一个输入端,4个普通io依次轮流置高电平,编程时分别改变ocr寄存器的值就可以将一个定时器pwm输出通道扩展为4路舵机控制了。
发表于 2011-8-3 18:07:08 | 显示全部楼层
LZ用示波器度过电调的PWM信号吗?不可能这么慢吧
发表于 2011-8-4 00:34:39 | 显示全部楼层
回复【5楼】wsn05  
-----------------------------------------------------------------------

lz,我刚刚让飞思卡尔pwm驱动新西达30a电调让电机转起来啦,哈哈
发表于 2011-8-4 01:16:40 | 显示全部楼层
回复【6楼】majianjia  阿嘉^_^
-----------------------------------------------------------------------

浆夹用手拧没夹住,浆飞掉了,换了浆保护器,橡皮筋断了,郁闷啊,还没到全速呢啊
发表于 2011-9-28 11:28:20 | 显示全部楼层
MARK
发表于 2011-10-4 12:47:42 | 显示全部楼层
楼主挺厉害的呀,哈哈,好好跟楼主学习
发表于 2011-10-6 13:45:57 | 显示全部楼层
回复【10楼】wsn05  
-----------------------------------------------------------------------

我刚好也用S12的处理器,手上有个XXD 30A电调,我比较想知道脉宽应该设定到多少ms,网上众说纷纭,不晓得哪个是对的

有说跟舵机一样,1.5ms为中间位置,是么,你的实验结果如何?

如果跟舵机一样,是不是只有0.5ms,1ms,1.5ms,2ms,2.5ms这几个值可以选择,或者说,电调的pwm高电平可以在0.5ms-2.5ms内连续变化?

从网上看无刷电机转的太猛,怕受伤,呵呵       
发表于 2011-10-6 16:15:33 | 显示全部楼层
本人菜鸟,最近开始玩飞行器,对遥控这方面不解(见笑了!),就是单片机如何接收遥控器信号这块不懂!由于关键词把握不好,上网收不到想要的资料!!手上没实物!接收机会产生什么样的信号,单片机要如何接收啊?请问各位大侠不吝赐教!
发表于 2011-10-6 16:35:11 | 显示全部楼层
lz很强大,很无私
发表于 2011-10-9 22:43:59 | 显示全部楼层
很好的一篇技术文章,帮我理解了一些关于电调的疑惑,谢谢楼主哈。
发表于 2011-11-28 09:39:48 | 显示全部楼层
学习了
发表于 2011-11-28 14:32:03 | 显示全部楼层
标记
发表于 2011-11-28 17:46:48 | 显示全部楼层
优酷视频地址:http://v.youku.com/v_show/id_XMzI0OTU2Njk2.html

我对单片机的认识

     从接触单片机到现在也有6年了,记得大一刚进学校时候,就听学长们讲单片机有多重要,多难学。不服输的性格,使我开始自学单片机。那时候,还没有发单片机教材,就跑图书馆借了好几本单片机书,下完课后就开始研究。每次,看的都想睡觉,这种状态一直维持了半年。大家应该知道,技术类的书籍,很枯燥的。里面全是变量,寄存器,概念性的东西。完全不知道到底干嘛用,所以很难坚持。我开始考虑是不是我的学习方法有问题,书本上的概念讲的很清楚但是我得不到验证不知道自己的理解是不是正确的,我必须要去做实验。

    弄明白这一点过后,我决定买一块实验板。花了我260块钱,带1602液晶的,下载还只能用串口线。比起现在来说已经很贵了,而且功能还很少。最要命的是,里面的资料一团糟。不知道从哪里下手。偶然机会在网上找到了视频教程(当然是不配套的),然后就跟着视频学习。一个月时间我就把单片机的所有资源系统的学习了一遍,也可以自己独立写程序了。这次很顺利,单片机总算是入门了。我可以负责任的告诉你,入门单片机十天是完全可以的,不过关键是方法。

    入门过后,我在想我应该要做点什么。决定做我的第一个单片机作品:1602液晶时钟。时钟芯片用的是DS12C887(以前电脑主板上用这个芯片),有按键设置时间,闹钟,蜂鸣器做闹钟发声器。这个小作品,可是花了我整整两个星期时间。做完后,很有成就感,完全自己独立完成。这个时钟程序,它应用到很多单片机知识,如IO口的控制,外部中断的使用,等等。如果你可以独立完成这个程序,不用我去宣布你已经学会单片机,你自己可以很深刻的体会到这一点。这也是我为什把这个芯片加到我的开发板上的原因,淘宝没有哪个卖家会使用这个时钟芯片,因为它的价格很贵。

在这之后,我做了:数控稳压电源,电子称,密码锁,红外遥控,频率计,温度计等,我就

不一一说明了。

     学完单片机之后,大家要知道,单片机确实很简单,难的是操作各种电路,芯片。我们要去做更多得项目,积累更多的电路,学会更多的芯片,去适应这个社会,让自己能找到更好的工,过上更好的生活。

       学完单片机过后我们还要学习什么?

   这个问题可以说纠结到了很多初学者,以下个人愚见,如果相信我你就接着往下看。

我按重要性先后,依次往后排:

1.多做单片机小项目保证最少10个(巩固对单片机的认识)

2.学习PCB设计软件 Protel 99se(要能做到生成PCB文件可以送工厂加工,软件光盘里已提供)

3.学习PCB设计软件Altium Designer Summer 09(这个版本很好用,软件光盘里已提供)他是

   Protel 99se的升级版功能更全面,使用更舒服。熟悉它也就更费时间一点,他对Protel

  所有快捷键,操作方式完全支持。这也是我为什么让你先熟悉Protel 99se的原因。

以上几点你都可以做到,那恭喜你,已经符合做一名硬件工厂师的基本条件了!

5.你要买一把吉他了。因为选择了这个行业就是选择了安静,我们会经常对这电脑,我们需

   要懂一门乐器,来调整我们的心情好继续学习。

6.MSP430单片机:如果有很多多余的时间,又还要学习一种单片机的话,那你就考虑学TI的

  MSP430,因他最有特点,低功耗,一片柠檬片,就可以工作。什么AVR,PIC,之类就别迷恋

  了,价格贵用的人少,你会51后,稍微看下资料,AVR ,MSP430 完全搞定。记得,千万别再

  去买开发板,有了我这一块51板子,你可以自己再画一块 AVR转接板或者MSP430转接板,扣在我

  的开发板上就可以学习了。如果,考虑成本不想做转接板,我们也有这方面的产品提供。

7.嵌入式:嵌入式现在最流行,很有必要学习这个,不过这个会比较复杂。

8.FPGA,CPLD,DSP,工作当中根据自己的需要,选择学习。
发表于 2011-12-1 16:17:39 | 显示全部楼层
。。。。。。我感觉延时函数绝对不能用 用定时器做延时才是王道
发表于 2011-12-1 17:05:45 | 显示全部楼层
mark
发表于 2011-12-1 22:05:27 | 显示全部楼层
先收集
发表于 2011-12-2 21:27:18 | 显示全部楼层
好文 感谢楼主 无私的奉献精神
发表于 2011-12-11 21:44:20 | 显示全部楼层
回复【楼主位】majianjia 阿嘉^_^
-----------------------------------------------------------------------

学习中
发表于 2011-12-12 14:02:59 | 显示全部楼层
回复【楼主位】majianjia 阿嘉^_^
-----------------------------------------------------------------------

学习中,楼主是用51单片机做的吗?
发表于 2012-2-1 13:03:01 | 显示全部楼层
楼主,一定要5V吗?我的好盈貌似可以接受3.3V啊
发表于 2012-2-8 23:14:47 | 显示全部楼层
回复【楼主位】majianjia 阿嘉^_^
-----------------------------------------------------------------------

你好楼主,想请问您一个问题,我买的电调有三根是和接收机相连的,有一正一负,为什么另一根信号线输出也是正5V呀?
发表于 2012-2-9 23:31:56 | 显示全部楼层
mark
发表于 2012-2-13 01:02:18 | 显示全部楼层
mark
发表于 2012-2-23 10:53:58 | 显示全部楼层
讲得很通俗易懂,有一点小悟
发表于 2012-2-23 10:58:08 | 显示全部楼层
mark
发表于 2012-3-5 21:32:00 | 显示全部楼层
讲的很好,谢谢楼主!
发表于 2012-3-30 00:57:21 | 显示全部楼层
学习学习
发表于 2012-5-21 16:48:28 | 显示全部楼层
学习了,正在用STM32驱动好赢的电调,郁闷一天,貌似要抬高到5V电压
发表于 2012-5-21 19:19:36 | 显示全部楼层
抬高了电压,还是不行。电机一直在小幅度振动并发出尖锐声,我用STM32控好盈的电调。
发表于 2012-5-31 23:20:30 | 显示全部楼层
买了电调,正发愁怎么控制,谢谢楼主!
发表于 2012-6-1 09:54:07 | 显示全部楼层
顶一下!
发表于 2012-6-3 19:16:20 | 显示全部楼层
顶楼主~~~~~~~!!!!!!!!!!!!!!
发表于 2013-5-8 02:18:08 | 显示全部楼层
楼主好文章,学到了很多,谢谢

但是有个问题没明白,楼主说精度是用8位,7位
这里8位 是什么意思?
发表于 2014-3-25 12:24:38 | 显示全部楼层
21楼说PIC价格高用量小,不知道根据是什么。 楼主写得不错,赞一个!
发表于 2014-7-2 22:55:53 | 显示全部楼层
很好,谢了
发表于 2014-8-20 20:39:14 | 显示全部楼层
学习了  mark
发表于 2014-12-9 00:23:42 | 显示全部楼层
谢谢楼主
发表于 2014-12-14 15:52:03 | 显示全部楼层
学习中 感谢楼主
发表于 2014-12-14 15:52:18 | 显示全部楼层
学习中 感谢楼主~~~~~~~
发表于 2016-4-5 18:03:24 | 显示全部楼层
电调好像大部分都是C8051F做MCU,它比ST等其他有什么优势吗,还是仅仅因为国外开发的电调MCU是此MCU,方便bin下载?
发表于 2019-2-16 11:29:46 | 显示全部楼层
1~2ms的方波脉宽渐变过程对应油门的从小到大,从负到正的渐变。 脉宽的幅度2.5V~6V;所以3~5V工作电压的单片机都适用。
发表于 2019-3-7 14:44:02 | 显示全部楼层
nwm 发表于 2013-5-8 02:18
楼主好文章,学到了很多,谢谢

但是有个问题没明白,楼主说精度是用8位,7位

这里8bit,楼主说的应该是二进制0000_0000~1111_1111,十进制就是0~255(2^8-1)
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-8-23 14:07

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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