专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
51pwm程序
2020-01-12 17:17
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
2616
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的初始值
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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);
}
复制代码
效果截图:
加载中...
lcmdw
3楼-- · 2020-01-14 16:40
mark
加载中...
tangly2017
4楼-- · 2020-01-14 20:34
收藏了,学习学习
加载中...
上一页
1
2
3
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
呼吸灯吧,一点说明和注释没有?我也发我的,还有演示视频,应该大家都可以看懂。
详细可以访问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);
- }
复制代码效果截图:
一周热门 更多>