|
发表于 2014-4-25 09:32:34
|
显示全部楼层
本帖最后由 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的初始值
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- view plaincopy to clipboardprint?
- #include <reg52.h>
- int time_count =0;//时间标志
- sbit pwmout =P0^0;//pwm输出IO
- int pwm_count = 0;
- int pwmout_count = 0;
- int direction = 0;
-
- void ss() interrupt 1 //0.1ms定时器
- {
- TH0 = 0xff;
- TL0 = 0xa4;
- time_count ++;
- if (time_count == 100) //10毫秒,调整pwm_count
- {
- if (direction ==0)//方向(增加)
- {
- pwm_count ++;
- if (pwm_count > 100 )//到达周期,调整增长方向
- {
- direction = 1;
- }
- }
-
- if (direction == 1)//方向(减小)
- {
- pwm_count --;
- if (pwm_count == 0)
- {
- direction = 0;
- }
- }
- time_count = 0;
- pwmout_count = pwm_count;
-
- }
-
- if (pwmout_count > 0)//0.1ms执行一次
- {
- pwmout = 1;
- pwmout_count --;
- }
- else
- {
- pwmout = 0;
- }
- }
-
- void main()
- {
- pwmout = 0;
- TMOD = 0x01;
- TH0 = 0xff;
- TL0 = 0xa4;
- ET0 = 1;//允许T0中断
- EA = 1; //开启总中断
- TR0 = 1;
- while(1);
- }
复制代码
效果截图:
|
|