51pwm程序

2020-01-12 17:17发布

源程序ourdev_657932IIR7IF.zip(文件大小:9K) (原文件名:stc_pwm_exa.zip)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
往者归来01
1楼-- · 2020-01-14 11:29
学习中,必须参考
ypengfei
2楼-- · 2020-01-14 15:53
本帖最后由 ypengfei 于 2014-4-25 09:34 编辑

呼吸灯吧,一点说明和注释没有?我也发我的,还有演示视频,应该大家都可以看懂。

详细可以访问www.yanpengfei.cn查看。

1、假设我们电机运行频率在100Hz,也就是1秒变化100次,那么一次变化需要1/100S = 10ms,也就是一个单独的PWM周期时间应该是10ms(即一个PWM周期由正脉冲

和负脉冲构成,正负脉冲之和为10ms),也就是需要10毫秒变化一次占空比。

2、因为PWM真空比可调区间设置为1-100,也就是需要把10ms分成100份,每份的值就是最小高电平时间,即最低的占空比。

3、10ms/100=0.1ms=100us,也就是需要单片机设置为100us中断一次,100次中断调整一个占空比。

4、我用的11.0592MHz的晶振,根据《说说51单片机设置定时器初始值的事》所说,计算0.1ms的中断初始值是11059200/12/10000=92;65536-x=92,x=65544,即0xFFA4,所以寄存器应该是ffa4的初始值
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



  1. view plaincopy to clipboardprint?
  2. #include <reg52.h>   
  3. int time_count =0;//时间标志  
  4. sbit pwmout =P0^0;//pwm输出IO  
  5. int  pwm_count = 0;  
  6. int  pwmout_count = 0;           
  7. int direction = 0;   
  8.   
  9. void ss() interrupt 1 //0.1ms定时器  
  10. {  
  11.     TH0 = 0xff;  
  12.     TL0 = 0xa4;  
  13.     time_count ++;  
  14.     if (time_count == 100) //10毫秒,调整pwm_count  
  15.     {  
  16.         if (direction ==0)//方向(增加)  
  17.         {         
  18.             pwm_count ++;                  
  19.             if (pwm_count > 100 )//到达周期,调整增长方向  
  20.             {  
  21.                 direction = 1;  
  22.             }                                             
  23.         }                  
  24.   
  25.         if (direction == 1)//方向(减小)  
  26.         {  
  27.             pwm_count --;  
  28.             if (pwm_count == 0)  
  29.             {  
  30.                 direction = 0;  
  31.             }  
  32.         }  
  33.         time_count = 0;  
  34.         pwmout_count = pwm_count;  
  35.   
  36.     }         
  37.   
  38.     if (pwmout_count > 0)//0.1ms执行一次  
  39.     {                                    
  40.         pwmout = 1;  
  41.         pwmout_count --;  
  42.     }  
  43.     else  
  44.     {  
  45.         pwmout = 0;  
  46.     }        
  47. }  
  48.   
  49. void main()  
  50. {  
  51.     pwmout = 0;  
  52.     TMOD = 0x01;   
  53.     TH0 = 0xff;  
  54.     TL0 = 0xa4;  
  55.     ET0 = 1;//允许T0中断  
  56.     EA = 1;      //开启总中断  
  57.     TR0 = 1;   
  58.     while(1);  
  59. }
复制代码

效果截图:
lcmdw
3楼-- · 2020-01-14 16:40
mark
tangly2017
4楼-- · 2020-01-14 20:34
收藏了,学习学习

一周热门 更多>