51产生pwm的最佳算法

2020-02-03 10:10发布

用51产生脉冲宽度调节(pwm)有哪些思路和算法,最好有示例,大家一起探讨最好最优的算法!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
34条回答
lllyanllll
1楼-- · 2020-02-05 00:42
 精彩回答 2  元偷偷看……
me18923
2楼-- · 2020-02-05 05:55
回复【13楼】lllyanllll 方炎
-----------------------------------------------------------------------
你的程序好像不全啊
   zkb1和zkb2是什么变量?也没个注释
me18923
3楼-- · 2020-02-05 06:26
回复【10楼】zhikai_wu
-----------------------------------------------------------------------
有些单片机可以用硬件产生,我们这里讨论软件编程的方法
dahefeiyu
4楼-- · 2020-02-05 06:37
http://blog.sina.com.cn/s/blog_5ed3cb950100z1bh.html
我以前搞的一个,使用PWM的话,需要考虑两点,第一,PWM波的频率,也就是周期,本程序是100个单位时间,所以首先用定时器定时一个基准时间(从210计数到255);第二,占空比,本例的占空比是从0%,1%,…,99%,100%,99%,…,2%,…导致渐亮渐暗,注意理解PWM_T++。
wctmdgcd
5楼-- · 2020-02-05 06:48
#include<reg51.h>
sbit   Pout   =P1^3;    //PWM波形输出
#define   Max_Init_value    2000
///******************************
///Max_Init_value的大小将影响到PWM
///的频率,其与频率的关系如下:
/// Max_Init_value=1/Freq*1000*1000
///在标准51中,Max_Init_value的值不能
///过高,因为定时器0的中断服务执行本身
///就要消耗一定的时间,频率过高将影响
//主函数的执行,并且有可能出现很意外的
//情况,具体情况要具体分析
///******************************
  

unsigned int PWM_Value;  
//*******************************      
//PWM_Value的理论取值范围:  
//0<PWM_Value<Max_Init_value
//
//
//
//*******************************      

unsigned char H_Byte_1 _at_ 0x21;
unsigned char L_Byte_1 _at_ 0x22;

unsigned char H_Byte_2 _at_ 0x23;
unsigned char L_Byte_2 _at_ 0x24;
void InitSystem(void)
{     
    TMOD=0x01;
    TH0=(65536-PWM_Value+12)/256;          //加12是为了补偿中断服务函数的执行时间,下同
    TL0=(65536-PWM_Value+12)%256;
    Pout=1;
    ET0=1;
    TR0=1;                        
    EA=1;
}
void DelayMs(unsigned int ms)
{
     unsigned int i;
     unsigned int j;
     for(j=0;j<ms;j++)
      for(i=0;i<110;i++);
}
void ComputePWM(void)
{
     H_Byte_1=(65536-PWM_Value+12)/256;           //加12是为了补偿中断服务函数的执行时间,下同
     L_Byte_1=(65536-PWM_Value+12)%256;

    H_Byte_2=(65536-(Max_Init_value-PWM_Value)+12)/256;
    L_Byte_2=(65536-(Max_Init_value-PWM_Value)+12)%256;

}
void main(void)
{
    PWM_Value=200;
    ComputePWM();
    InitSystem();           
while(1)
{
      DelayMs(10000);  
      TR0=0;
      PWM_Value+=250;                           //改变占空比
      if(PWM_Value > 1800) PWM_Value=50;
      ComputePWM();
      P3 ^= 0x08;
      DelayMs(500);
      P3 ^= 0x08;
      DelayMs(500);
      TR0=1;
}
}
void IsrTimer0(void) interrupt 1
{          
     EA=0;
     P3 ^= 0x08;
     if(Pout)    //如果之前输出为高
      {
         Pout=0;
         TH0=H_Byte_2;
         TL0=L_Byte_2;
       }
else        //如果之前输出为低
      {
         Pout=1;
         TH0=H_Byte_1;
         TL0=L_Byte_1;

       }
     EA=1;
}
wctmdgcd
6楼-- · 2020-02-05 11:02
 精彩回答 2  元偷偷看……

一周热门 更多>