搜索
bottom↓
回复: 32

51产生pwm的最佳算法

[复制链接]

出0入0汤圆

发表于 2011-11-14 19:39:56 | 显示全部楼层 |阅读模式
用51产生脉冲宽度调节(pwm)有哪些思路和算法,最好有示例,大家一起探讨最好最优的算法!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2011-11-14 20:28:46 | 显示全部楼层
没人愿意来讨论啊

出0入0汤圆

发表于 2011-11-14 20:33:22 | 显示全部楼层
你先说说吧

出0入0汤圆

发表于 2011-11-14 20:43:10 | 显示全部楼层
也不懂

出0入0汤圆

发表于 2011-11-14 20:50:23 | 显示全部楼层
用个定时器就可以了吧!!

出0入0汤圆

发表于 2011-11-14 21:45:52 | 显示全部楼层
频率,分辨率,通道数量三个要素,要看是什么应用

出50入4汤圆

发表于 2011-11-14 22:04:50 | 显示全部楼层
等LZ高见

出0入0汤圆

发表于 2011-11-14 22:36:20 | 显示全部楼层
等楼主开个头!

出0入0汤圆

发表于 2011-11-14 22:58:05 | 显示全部楼层
标记

出140入0汤圆

发表于 2011-11-14 23:04:56 | 显示全部楼层
模拟 还是 原生呢?

出0入0汤圆

发表于 2011-11-15 01:32:23 | 显示全部楼层
用硬件产生,

出0入0汤圆

发表于 2011-11-15 07:12:26 | 显示全部楼层
use two timers: the first timer sets the period of the pwm, and the 2nd timer sets the dc.

出0入0汤圆

发表于 2011-11-15 08:30:59 | 显示全部楼层
一个8位timer 一个8位变量即可 8位变量为占空比,也是timer定时初值,中断中用0-此变量为下一次定时初值,即可。

出0入0汤圆

发表于 2011-11-18 14:11:44 | 显示全部楼层
我这有模拟的,
void timer0() interrupt 1
{

        TH0=(65536-100)/256;
    TL0=(65536-100)%256;

        if(t<zkb1)
             ENA=1;
    else
             ENA=0;
    if(t<zkb2)
              ENB=1;
          else
              ENB=0;
            t++;
          if(t>100)
    {
                t=0;
        }
}

出0入0汤圆

 楼主| 发表于 2012-2-24 21:29:18 | 显示全部楼层
回复【13楼】lllyanllll 方炎
-----------------------------------------------------------------------
你的程序好像不全啊
   zkb1和zkb2是什么变量?也没个注释

出0入0汤圆

 楼主| 发表于 2012-2-24 21:31:09 | 显示全部楼层
回复【10楼】zhikai_wu
-----------------------------------------------------------------------
有些单片机可以用硬件产生,我们这里讨论软件编程的方法

出0入0汤圆

发表于 2012-2-24 22:21:21 | 显示全部楼层
http://blog.sina.com.cn/s/blog_5ed3cb950100z1bh.html
我以前搞的一个,使用PWM的话,需要考虑两点,第一,PWM波的频率,也就是周期,本程序是100个单位时间,所以首先用定时器定时一个基准时间(从210计数到255);第二,占空比,本例的占空比是从0%,1%,…,99%,100%,99%,…,2%,…导致渐亮渐暗,注意理解PWM_T++。

出0入0汤圆

发表于 2012-2-24 22:40:20 | 显示全部楼层
回复【19楼】superAFE
-----------------------------------------------------------------------

是能用。初值是临时计算后再装载的,也会影响最高能产生频率的大小。搞个表把要用值都算好了装起来,用哪个取哪个,能大大提高所能产生的最高频率

出0入0汤圆

发表于 2012-2-24 22:45:43 | 显示全部楼层
为啥一定要用51产生一个PWM,而且就算用它来产生,什么的频率,分辨率也没有指标。没有指标要求就是闲扯淡。

出0入0汤圆

发表于 2012-2-25 09:54:09 | 显示全部楼层
产生低频的还差不多

出0入0汤圆

发表于 2012-2-25 11:00:22 | 显示全部楼层
其实楼主就是让大家给他一个PWM的现成程序而已。

出0入0汤圆

发表于 2012-2-25 13:53:59 | 显示全部楼层
学习了,嘿嘿。

出0入0汤圆

发表于 2012-9-9 23:44:20 | 显示全部楼层

出0入0汤圆

发表于 2012-9-10 10:16:15 | 显示全部楼层
lllyanllll 发表于 2011-11-18 14:11
我这有模拟的,
void timer0() interrupt 1
{

电机驱动..............

出0入0汤圆

发表于 2012-9-10 10:41:57 | 显示全部楼层
superAFE 发表于 2012-2-24 22:24
#include
sbit   Pout   =P1^3;    //PWM波形输出
#define   Max_Init_value    2000

mark一下下   

出0入0汤圆

发表于 2012-9-10 15:03:29 | 显示全部楼层
在那个从初学者到工程师的帖子里面有。用一个定时器就可以了。

不过我觉得用C写的会有一定的误差,因为每次进中断后的比较运算不好控制。

出0入0汤圆

发表于 2012-9-11 02:02:00 | 显示全部楼层
renwocai 发表于 2012-9-10 15:03
在那个从初学者到工程师的帖子里面有。用一个定时器就可以了。

不过我觉得用C写的会有一定的误差,因为每 ...

同解,比如写输出180.8hz的,C的难度就会比较大,汇编就容易多了

出0入0汤圆

发表于 2012-9-11 18:27:18 | 显示全部楼层

出0入0汤圆

发表于 2012-9-11 21:54:23 | 显示全部楼层
  1. /*
  2.         程序说明:
  3.         由P2_0输出PWM,12M时输出100Hz,
  4.         LED接在P2_0上,每0.1秒钟改变一次亮度。
  5.         制作者;bbsniua
  6.         2012/9/1
  7. */
  8. #include<AT89X51.H>        // AT89X51专属库

  9. #define uint8_t unsigned char

  10. #define LED P2_0        // PWM输出

  11. uint8_t P_S,PWM,d_ms;

  12. void mcu_init()                // mcu初始化子函数
  13. {
  14.         TMOD = 0x02;        // T0为8位自动重装定时器
  15.         TH0  = 256-100;        // T0自动重装值,12M晶体时100uS中断一次
  16.         TL0  = 256-100; // T0预装值
  17.         ET0  = 1;                   // 开T0中断
  18.         TR0  = 1;                // 启动T0
  19.         EA   = 1;                // 开总中断
  20.         P_S  = 1;                // PWM计数
  21.         PWM  = 0;                // PWM占空比
  22.         P2   = 0xFF;
  23. }

  24. void int_t0(void) interrupt TF0_VECTOR                // T0中断函数,12M晶体时100uS中断一次
  25. {
  26.         ++P_S;
  27.         if(P_S>100)
  28.         {
  29.                 P2_0 = 1;
  30.                 P_S = 1;
  31.                  if(d_ms)
  32.                 {
  33.                         --d_ms;
  34.                 }
  35.         }
  36.         if(P_S>PWM)
  37.         {
  38.                 P2_0 = 0;
  39.         }
  40. }

  41. void delay_ms(uint8_t xms)
  42. {
  43.         d_ms = xms;
  44.         while(d_ms);       
  45. }

  46. void main()                                                  // 主函数
  47. {
  48.         mcu_init();                                        // mcu寄存器初始化
  49.         while(1)
  50.         {
  51.                 delay_ms(10);                          // 每100mS更改一次PWM占空比
  52.                 ++PWM;
  53.                 if(PWM>100)
  54.                 {
  55.                         PWM = 0;
  56.                 }                                       
  57.         }
  58. }
复制代码

出0入0汤圆

发表于 2012-9-11 22:53:03 | 显示全部楼层
这个要MARK啦

出0入0汤圆

发表于 2012-9-12 13:12:10 | 显示全部楼层
不错啊,正在学习

出0入0汤圆

发表于 2012-9-12 21:24:25 | 显示全部楼层
mark               

出0入0汤圆

发表于 2012-10-15 22:10:15 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 15:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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