打印

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

[复制链接]
楼主: Cortex-M0
手机看帖
扫描二维码
随时随地手机跟帖
21
Cortex-M0|  楼主 | 2011-8-23 10:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
理论输出的PWM脉宽调制比为 123/1024 = 0.120

实际输出的PWM脉宽调制比为 (256+256+256+256+190)/(256X40)=0.119

PWM脉宽调制比输出误差: (0.119-0.120)/0.120 = -0.0083 = -0.83%

如想得到实际输出与理论输出的PWM误差为0, 只需取相减数为2的n次幂方即成,如取相减数为 16或 32,循环次数为 64或 32,我们可得到: 16X64 = 1024, 32X32 = 1024, 正好整分,没有一丝误差。

本小车中,由于考虑到所用直流电机的伺服驱动,需加入一定的死区时间,上面分析存在的一点偏小误差,会产生一点格外的时间,这点时间正好利用他产生死区,以体现菜农的“非典”应用,老T叔的“野路子”方法,将 8位硬件PWM 改造成 10位硬件PWM 构架上的成功应用。

使用特权

评论回复
22
mowensui| | 2011-8-23 11:19 | 只看该作者
mark, 还得看一遍才行

使用特权

评论回复
23
wzr200408| | 2011-8-23 11:23 | 只看该作者
:dizzy:太强大了,看得我晕忽忽的

使用特权

评论回复
24
kfzy6| | 2011-8-23 11:58 | 只看该作者
大家都这么有才

使用特权

评论回复
25
Cortex-M0|  楼主 | 2011-8-23 12:10 | 只看该作者
:dizzy:太强大了,看得我晕忽忽的
wzr200408 发表于 2011-8-23 11:23



谢谢LS小盆友支持~~~

什么时候看菜农大叔的选美贴子您头不晕忽忽了,看这些贴子也就小菜一碟了~~~ :lol


题外话:
看匠人的贴子是种享受------------但只能学到点皮毛。
看菜农的贴子是种受罪------------但能学到好多东东。
看俺的贴子------------啥都木有,只见一团浆糊,东抄西凑一些高手低手牛人菜鸟的东东,凡是有点用的就引用,混在一起,正宗一盘大杂绘。

使用特权

评论回复
26
uniquehope| | 2011-8-23 12:35 | 只看该作者
欣赏~~:lol

使用特权

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

程序来也~~~  :lol

本10位硬件PWM的驱动DEMO示范程序,移植在《智能小车》上,增加了正反4挡速度调速,性能更超值~~~


/*----------------------------------------------------------*/
/*                                                          */
/*     中颖SH88F2051/SH88F4051无线遥控智能小车DEMO程序      */
/*                                                          */
/*   功能 :使用中断方式动态接收遥控信号,软件模拟解码,     */
/*          10位硬件 PWM 控制小车运行。                         */
/*                                                          */
/*          A键:小车前进时加速,后退时减速,共有正反       */
/*               各4挡速度供调节,4挡快慢正转,4挡快慢      */
/*               反转,1挡停止运转。                        */
/*                                                          */
/*          B键:功能同上,小车前进时减速,后退时加速,     */
/*               共有正反4挡速度供调节,4挡快慢正转,       */
/*               4挡快慢反转,1挡停止运转。                 */
/*                                                          */
/*          C键:在运行时,按下小车左转,松开恢复正常运     */
/*               行,小车停止时无效。                       */
/*                                                          */
/*          D键:在运行时,按下小车右转,松开恢复正常运     */
/*               行,小车停止时无效。                       */
/*                                                          */
/*                                                          */
/*  入口 :指定 P3.0 为无线遥控接收信号输入                */
/*  出口 :键值存 Key 中,A键=1, B键=2, C键=3, D键=4       */
/*                                                          */
/*   资源 :占用 T0 定时中断, 作为20ms定时采样              */
/*          占用 PWM 中断, 刷新 PWM 输出                    */
/*          占用 INT0 中断, 作为电机运转方向动态切换        */
/*                                                          */
/*                                                          */
/*   CPU  : SH88F2051/SH88F4051                             */
/*   晶振 : 片内16.6MHz高精度RC振荡器                       */
/*   作者 : 许意义                                          */  
/*   ID   : LAOXU                                           */  
/*   版本 : V1.0                                            */
/*   日期 : 2011.8.23                                       */
/*                                                          */
/*----------------------------------------------------------*/

// 关于硬件 PWM 驱动直流电机 DEMO 示范程序声明:  
//
// 程序编写的比较烦琐, 可精简很多字节,但没有进行优化,本意是用该程序构架扩充成10位硬件
// PWM 输出,实现高精度的动态 PWM 电机驱动实时控制,接着继续改造,将DIY革命进行到底,

// 现史上最“烂”的山寨伺服电机之功能,以适应21ic《两轮自平衡小车DIY》的实际需求。  
//


...................................

void car_PWM_int(void) interrupt 12  using 1  
{ static unsigned int PWM_10bit_bak;      // 10位 PWM 输出缓冲发送区
  static unsigned char PWM_Counter=0;   // 10位 PWM 输出发送个数计数器
  if(PWM_Counter == 0)
    { PWM_10bit_bak = PWM_10bit & 0x3ff;  // 10位 PWM 发送开始,装入10位 PWM 初值至输出缓冲发送区
}
  if(PWM_10bit_bak >= 26)
    { PWM_10bit_bak -= 26;      // 10位 PWM输出缓冲发送区 发送数据>=26, 数据减26暂存
   PWMD = 0xff;         // 10位 PWM 发送一次数据0xff
}
  else if(PWM_10bit_bak == 0)      // 10位 PWM输出缓冲发送区 发送数据=0
    { PWMD = 0x00;         // 10位 PWM 发送一次数据0x00
}
  else
    { PWM_10bit_bak = 0;      // 10位 PWM输出缓冲发送区 发送数据<26, 数据乘10,发送之
   PWMD = (unsigned char)(PWM_10bit_bak * 10);   
}
  if(++PWM_Counter > 40)
{ PWM_Counter = 0;       // 10位 PWM 输出发送个数计数值大于40, 清0
}
  PWMCON &= Bin(11111101);                   // 清除 PWM 周期计数器溢出标志 PWMIF
}     

...................................

使用特权

评论回复
28
Cortex-M0|  楼主 | 2011-8-23 14:08 | 只看该作者
本DEMO源程序下载:

智能小车10位硬件PWM的驱动DEMO示范程序.rar (10.77 KB)

使用特权

评论回复
29
Cortex-M0|  楼主 | 2011-8-23 14:09 | 只看该作者
在《两轮自平衡车+智能小车DIY》硬件环境下运行,请注意下面硬件匹配条件:
1.  P7中间插个短路插。
2.  P10遥控接收模块插个方向。
3.  P11电源选择+5V。


使用特权

评论回复
30
Cortex-M0|  楼主 | 2011-8-23 14:10 | 只看该作者
---------------------------------------------- 全文完 ----------------------------------------------


谢谢分享~~~

使用特权

评论回复
31
Cortex-M0|  楼主 | 2011-8-23 14:16 | 只看该作者
欢迎各位盆友,继续关注与支持 第一届21ic社区------《两轮自平衡车+智能小车DIY》开源活动。

继续关注与支持本贴的姐妹贴------使用史上最“烂”的2051, 打造史上最“烂”的山寨伺服电机~~~

使用特权

评论回复
32
highgear| | 2011-8-23 23:42 | 只看该作者
好贴一定要顶。

直流电机不仅仅是线圈需要续流,而且主要是存在一个反电动势,即关断驱动电压后,电机处于发电机状态。直流电机的启动,加速,制动等等,教科书上写的非常详细。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Cortex-M0 + 1
33
hotpower| | 2011-8-23 23:49 | 只看该作者
确实不错!!!!!!!!!!!!

使用特权

评论回复
34
程序匠人| | 2011-8-24 00:00 | 只看该作者
支持!

使用特权

评论回复
35
Cortex-M0|  楼主 | 2011-8-24 06:59 | 只看该作者
好贴一定要顶。

直流电机不仅仅是线圈需要续流,而且主要是存在一个反电动势,即关断驱动电压后,电机处于发电机状态。直流电机的启动,加速,制动等等,教科书上写的非常详细。 ...
highgear 发表于 2011-8-23 23:42



highgear老师知识渊博,写的非常仔细,赞一个~~~

只是,俺想学学匠人的三斧子----形象化描写,结果搞成了现在这个样,通电充电(电转磁),断电放电(磁转电)。

对于教科书学好的盆友,完全没必要看这学前班的科普贴子~~~

使用特权

评论回复
36
bily198310| | 2011-8-24 08:21 | 只看该作者
不错,受教了

使用特权

评论回复
37
wang0225| | 2011-8-24 18:55 | 只看该作者
给力!

使用特权

评论回复
38
wang1988| | 2011-8-25 15:30 | 只看该作者
看了一遍又一遍 每次感受不一样

使用特权

评论回复
39
laoxu| | 2011-8-27 08:31 | 只看该作者
顶一把~~~

使用特权

评论回复
40
zoomone| | 2011-8-30 20:21 | 只看该作者
奥 在这里啊

使用特权

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

本版积分规则