51产生pwm的最佳算法

2020-02-03 10:10发布

用51产生脉冲宽度调节(pwm)有哪些思路和算法,最好有示例,大家一起探讨最好最优的算法!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
35条回答
wctmdgcd
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;
}

一周热门 更多>