打印

第一届21ic社区DIY开源活动----图解 10位硬件PWM模块的软件设计

[复制链接]
10575|54
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、前言:
《第一届21ic社区DIY开源活动----两轮平衡车+智能小车DIY》,在火爆进行着,小盆友们在硬件PWM模块的设计中,普遍卡了壳,曲线求国改用软件模拟法,尽管方法简单,实现容易,但是存在控制精度较差,驱动波型相位不稳定等先天性缺陷,暴殄天物,放着中颖SH88F2051/4051的硬件PWM不用。

应highgear老师之要求,力图将《第一届21ic社区DIY开源活动----两轮平衡车+智能小车DIY》的每个关键细节讲解清楚,作为匠人的粉丝,也理应有义务有责任引导大家一起解决这一不是难题的简单事儿。顺便也想紧跟菜农,学习匠人,争做“文学青年”,呵呵~~~

相关帖子

沙发
Cortex-M0|  楼主 | 2011-8-22 12:04 | 只看该作者
说起PWM, 网上随便抓一把网友,基本上都可以吹的头头是道,确实,PWM实现原理简单,但要要把PWM真正地运用起来,入门的少的可怜,懂行的更少,大多数是乱抄糊乱用,能动就OK!

作为一门学科,PWM不是一个独立的事件,必须和恰当的硬件相匹配,配给合适的控制软件,才能体现出其优良的控制特性,本文因篇幅所限,仅针对《第一届21ic社区DIY开源活动----两轮平衡车+智能小车DIY》内用到的一点常识,加以简单分析,以便引导小盆友们,设计出符合《两轮平衡车+智能小车DIY》要求的PWM驱动器。

使用特权

评论回复
板凳
liang7143| | 2011-8-22 12:14 | 只看该作者
直播吗?
先顶一个

使用特权

评论回复
地板
hotpower| | 2011-8-22 12:29 | 只看该作者
给个 PWM的裸照呀~~~

使用特权

评论回复
5
Cortex-M0|  楼主 | 2011-8-22 19:48 | 只看该作者
匠人言:“一个电机老是带不动,要用手拨动一下才转,换电机也不行。后来用示波器看波形。发现波形很诡异。莫非又是妖怪?呵呵。
针对上述的妖怪。把频率从4K进一步降低到2K。妖怪被秒杀。”

匠人实拍的用L293驱动直流电机的实测电压波型照片,如下图所示:





原因解释:
当驱动频率太高时,在PWM打开时,由于高电平存在时间太短,引起导通时间不够,驱动电流无法一下子给电机内部电感线圈喂饱,此时的电机两端工作电压还没有上升到正常状态,紧接着PWM关闭,还没喂饱的电机内部电感线圈,开始将电感线圈内部的磁场能转化为电能逐步释放出来。此时如从示波器观察直流电机两端电压波型,就会出现匠人所言:“很诡异的妖怪波型”,呵呵。

使用特权

评论回复
6
Cortex-M0|  楼主 | 2011-8-22 20:00 | 只看该作者
匠人言:“一个电机老是带不动,要用手拨动一下才转,换电机也不行。后来用示波器看波形。发现波形很诡异。莫非又是妖怪?呵呵。
针对上述的妖怪。把频率从4K进一步降低到2K。妖怪被秒杀。”

注:妖怪被秒杀后,扭力大增。妖怪没被秒杀前,芯片输出没力...



老X反驳道:“——不对吧?老x早前做过这方面的实验,用的L298,同样老的芯片,用的50kHz没一点问题”


----------------------------------------------------------------------------------


因果原因分析:

匠人的试验结果完全正确,老X的结论也完全正确,L293和L298这两块芯片,除最大驱动电流相差一些,其他功能类同,因此,如驱动同一电机,由于L298驱动电流大一些,可缩短一些充电时间,但不会相差 50kHz/2KHz , 几十倍之差。


原因可能是下面的几个原因之一。

1. 两人描述的概念不同, 如匠人指的 PWM频率 = 512KHz / 256 = 2KHz ,而老X直接指PWM时钟频率50kHz没一点问题,上述匠人的PWM时钟频率为512KHz。

2. 两人所接电机型号不同, 如匠人接的小直流电机电感量较大,属小电流驱动型,老X接的直流电机电感量较小,属大电流驱动型。

3. 两人所接电机类型不同, 如匠人接小直流电机,老X接步进电机。由于这是两种不同性质的电机,步进电机驱动调制频率高到100KHz也能正常工作,不能类比。

4. 两人所接负载不同, 如匠人接的小直流电机负载,老X接的电阻性负载。

使用特权

评论回复
7
Cortex-M0|  楼主 | 2011-8-22 20:58 | 只看该作者
那么PWM最高驱动频率由哪些因素决定呢,最主要由电机的类型(如直流电机的线圈电感量、转速等),其次由驱动芯片的特性(如最高工作频率、输出电流工作电压等),这两者都定型了,最高驱动频率还取决于PWM的精度(位数)。


为什么当电机的型号和驱动芯片都定型了,最高驱动频率还要取决于PWM的精度(位数)呢?
请看:
有玩过智能小车或两轮平衡车的盆友介绍,其驱动电机的PWM频率,不能大于100Hz, 否则驱动功率不足,输出扭力下降。
更有网友介绍,驱动电机的PWM频率,不能大于30Hz, 最多取25Hz, 否则输出扭力极剧下降!

俺认为,上面两位网友表达了相同一个意思,一个结论,外购的电机性能都差不多,电机驱动都用L298,  前面一位盆友估计用10位精度的PWM驱动,后面一位盆友估计用12位精度的PWM驱动。前面一位用10位精度的PWM驱动,最高工作频率100Hz, 折合PWM驱动脉冲频率 = 100Hz X 2^10 = 100Hz X 1024 = 102.4KHz。后面一位用12位精度的PWM驱动,最高工作频率25Hz,  折合PWM驱动脉冲频率 = 25Hz X 2^12 = 25Hz X 4096 = 102.4KHz,两位盆友的实际最高PWM驱动脉冲频率完全相同!

使用特权

评论回复
8
Cortex-M0|  楼主 | 2011-8-22 21:00 | 只看该作者
经过以上分析可以得出结论,网上盆友驱动小车电机的PWM驱动脉冲频率,普遍为100KHz左右, 折合最小驱动脉宽约10us 。

匠人秒杀妖怪的PWM频率为2KHz, SH88F2051/4051为 8位PWM, 折合PWM驱动脉冲频率 = 2KHz X 2^8 = 2KHz X 256 = 512KHz,折合最小驱动脉宽约2us 。

比网上盆友推荐的100KHz高出 5倍,俺估计,在占空比 比较小时,驱动扭力还是不足,最后被匠人放弃使用硬件PWM了,改用100Hz软件模拟PWM了。

使用特权

评论回复
9
Cortex-M0|  楼主 | 2011-8-22 21:08 | 只看该作者
以上只是抄书捡菜的一点心得,很多内容拷贝匠人的大作,在此感谢~~~

灰常羡慕匠人,随便掏鼓一下,一大堆妙笔生辉的**诞生了,俺说了一在堆废话,想说的只有一句话:“由于电机线圈电感的存在,使得PWM实际驱动频率大幅降低,实用的最高PWM驱动脉冲频率在100KHz左右。”

感叹,肚子里墨水太少,想紧跟菜农,学习匠人,争做“文学青年”,实在太难了~~~



下面言归正传,写点程序,就容易多了,正如NE5532老师所言:“学写程序除了背点语句,掌握一些基本技巧外加做好规划之外,真的不需要啥东西,会说话就会写程序。”

先简单介绍一下,如何使用中颖SH88F2051/4051的8位硬件PWM,改造成10位硬件PWM,满足《自平衡车两轮小车DIY》的实际使用要求~~~

使用特权

评论回复
10
linqing171| | 2011-8-22 21:49 | 只看该作者
看看8位硬件怎么抖动成10位的。

使用特权

评论回复
11
linqing171| | 2011-8-22 21:50 | 只看该作者
抖不好就多出一截长高来。

使用特权

评论回复
12
Cortex-M0|  楼主 | 2011-8-22 22:33 | 只看该作者
看看8位硬件怎么抖动成10位的。

抖不好就多出一截长高来。
linqing171 发表于 2011-8-22 21:49



谢谢LS盆友支持~~~

只要活学活用菜农的“非典”方法,老T叔的“野路子”之法宝,就可以很方便的将中颖8位硬件PWM扩展成任意位硬件PWM。

使用特权

评论回复
13
Cortex-M0|  楼主 | 2011-8-22 22:35 | 只看该作者
四、中颖SH88F2051/4051的8位硬件PWM简介

中颖SH88F2051/4051内建一个8位PWM模块。PWM模块可以产生周期和占空比分别可以调整的脉宽调制波形。提供每个PWM周期溢出中断,并且输出极性可选择。在PWM输出时,可任意更改占空比至输出缓存,以便下一PWM输出周期装载,利于中颖SH88F2051/4051的这一特征,可以很方便的采用菜农的“非典”方法,老T叔的“野路子”之法宝,将8位硬件PWM扩展成任意位硬件PWM。


使用特权

评论回复
14
Cortex-M0|  楼主 | 2011-8-22 22:36 | 只看该作者
本帖最后由 Cortex-M0 于 2011-8-23 08:10 编辑

五、中颖SH88F2051/4051的8位硬件PWM扩展成10位硬件PWM实现原理。

根据以上综合分析,可以得出结论,网上盆友驱动小车电机的PWM驱动脉冲频率,普遍为100KHz左右, 折合最小驱动脉宽约10us 。

小车使用中颖SH88F2051/4051片内高精度16.6MHz  RC振荡器,由于考虑到网友们可能要用到比较复杂的数学 运算,占时较多,因此不考虑主频分频便用,而PWM时钟源选择有4挡,依次为 系统频率/2,系统频率/4,系统频率/8,系统频率/16,分频后,PWM时钟源依次为 8.3MHz, 4.15MHz, 2.075MHz, 1.0375MHz, 输出PWM频率依次为 8.3MHz/256 = 32.42KHz, 4.15MHz/256 = 16.21KHz, 2.075MHz/256 = 8.1KHz, 1.0375MHz/256 = 4.05KHz。我们取最低输出PWM频率4.05KHz,假如我们能做到,在40个PWM频率周期中,输出一个完整的10位PWM数据,则相当于实际PWM频率周期为 4.05KHz/40 = 101.25Hz,满足实际小车所需的PWM输出频率, 折合最小驱动脉宽约10us 。

使用特权

评论回复
15
autopccopy| | 2011-8-22 23:03 | 只看该作者
写得好,支持加COOL! :victory:

mark!

使用特权

评论回复
16
5_0_5| | 2011-8-23 08:31 | 只看该作者
mark,学习

使用特权

评论回复
17
hxy6951| | 2011-8-23 08:40 | 只看该作者
学习一下

使用特权

评论回复
18
oyjing2010| | 2011-8-23 10:33 | 只看该作者
ding

使用特权

评论回复
19
Siderlee| | 2011-8-23 10:33 | 只看该作者
。。。。

使用特权

评论回复
20
Cortex-M0|  楼主 | 2011-8-23 10:50 | 只看该作者
思路有了,接下去就可编程了,假如我们将一个10位PWM的两进制数值,均分在这40次PWM输出中,即每一次输出扣除 1024/40 = 25.6 个数,取整后,得到每次扣除 26个数。

即每次PWM输出前,比较10位PWM之数值,大于等于26时,PWM输出一个完整的0xff高电平周期, 其PWM之数值减26,作为下次PWM值之用,依次循环输出PWM,直至PWM值小于26, 将PWM乘10, 输出之,之后的PWM输出以0增充,直到40个PWM输出周期结束,进入新一轮,重新进入循环40个PWM输出周期。

SH88F2051/4051的PWMP设置为0xff, 即256个PWM脉冲频率周期输出一个完整的8位PWM波,依次循环40次,输出一个完整的10位PWM波。

假设要输出的 10位 PWM值  PWM_10bit = 123; 每次当前 PWM值 如大于或等于 26, 则减 26, 如小于26, 则将数值乘10后直接输出, 之后以0输出填充。

相减之后的数据依次为: 123-26=97(输出0xff), 97-26=71(输出0xff), 71-26=45(输出0xff), 45-26=19(输出0xff), 19X10=190(输出190)。



模拟输出图:


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:学习chunyang和maychang两位老师,努力练好基本功。 学习HOT大叔,学好“Cortex-M0”,做“Cortex-M0”之菜鸟。

7

主题

4820

帖子

12

粉丝