3595|22

24

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

设置一个20kHz,占空比50%的PWM波。各位大佬能给看一下,程序哪里不对吗? [复制链接]

 

 #include"reg52.h"
sbit PWM0=P3^0;
void main()
{
    PWM0=1;//初始为高电平
    TMOD=0x22;    //定时器0和定时器1,都为工作方式2
    TH0=(65536-25)/256;//定时器0调节占空比计时高电平时间然后进入中断拉低PWM0
    TL0=(25536-25)%256;
    TH1=(65536-50)/256;  //定时器1产生周期信号,定时周期为50us
    TL1=(65536-50)%256;        
    ET0=1;//打开定时器0中断允许
    ET1=1;//打开定时器1中断允许
    EA=1;//打开总中断 
    TR1=1;//打开定时器1     
  while(1)
  {
  }
}
void Timer0() interrupt 1
{
   TR0=0;//停止定时器T0
   PWM0=0;//拉低IO口 
   TR1=1; 
}
void Timer1() interrupt 3 
{
   TR0=1; //开启定时器T0
   PWM0=1;//拉高IO口
   TR1=0;
}
 

此帖出自51单片机论坛

最新回复

TH0=(65536-25)/256;//定时器0调节占空比计时高电平时间然后进入中断拉低PWM0 TL0=(25536-25)%256; TH1=(65536-50)/256;  //定时器1产生周期信号,定时周期为50us TL1=(65536-50)%256;        ?   详情 回复 发表于 2023-4-7 14:25
点赞 关注
 

回复
举报

3248

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 

用有PWM功能的单片机来做。不要用IO和程序模拟硬件PWM 。

此帖出自51单片机论坛

点评

C52不行吗?做的作业要用52来做。  详情 回复 发表于 2023-4-5 09:16
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
tagetage 发表于 2023-4-4 21:42 用有PWM功能的单片机来做。不要用IO和程序模拟硬件PWM 。

C52不行吗?做的作业要用52来做。

此帖出自51单片机论坛

点评

如果光是这个功能的话C52可以做,用一个定时器一个中断做,中断内部程序做IO翻转。  详情 回复 发表于 2023-4-5 09:51
 
 
 

回复

3248

帖子

0

TA的资源

五彩晶圆(中级)

4
 
晨回星 发表于 2023-4-5 09:16 C52不行吗?做的作业要用52来做。

如果光是这个功能的话C52可以做,用一个定时器一个中断做,中断内部程序做IO翻转。

此帖出自51单片机论坛
 
 
 

回复

3248

帖子

0

TA的资源

五彩晶圆(中级)

5
 

还要考虑晶振频率,12分频的话用6M,12M晶振比较好,1微妙的指令时间是整数,比较好计算时间。

此帖出自51单片机论坛
 
 
 

回复

3248

帖子

0

TA的资源

五彩晶圆(中级)

6
 

12M晶振的话,1微妙的指令时间是整数,比较好计算时间。

此帖出自51单片机论坛

点评

好的  详情 回复 发表于 2023-4-5 10:30
 
 
 

回复

6593

帖子

9

TA的资源

版主

7
 

PWM不应该用定时器直接输出吗?    

此帖出自51单片机论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

8
 
tagetage 发表于 2023-4-5 09:54 12M晶振的话,1微妙的指令时间是整数,比较好计算时间。

好的

此帖出自51单片机论坛
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

9
 

【程序哪里不对吗?】

确实,程序有错误。

错就错在Timer0中断例程中TR1=1这句和Timer1中断例程中TR1=0这句。前句开启了定时器1,而在后句中关掉了定时器0。

此帖出自51单片机论坛
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

10
 

定时器0和定时器1工作方式2,是8位重装模式。该模式下,定时器0或1高字节计数到255,再来一个计数脉冲,定时器高字节将进位,但不是成为00,而是将低字节内容装到高字节,并不停止计数。重装模式下,不必重置高字节初值,只要初始化时装一次即可。

 

此帖出自51单片机论坛
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

11
 

你的程序设计初衷,是让定时器1产生周期为50微秒的定时中断,而定时器0用来产生25微秒的高电平。既然如此,那么就不能停止定时器1,而应该让定时器1连续运行。这样才能够产生50微秒的周期。在PWM0这个引脚为高电平这段时间里面,两个定时器应该都在运行。但你的程序,定时器1中断里把定时器1关掉了,定时器1停止运行(此时应该是运行的)。

此帖出自51单片机论坛
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

12
 

如果是要产生一个占空比50%的方波,那只要使用一个定时器就够了。每次定时器产生中断,将PWM0位取反即可。当然,这样做就不能改变占空比了。

此帖出自51单片机论坛

点评

嗯嗯,谢谢大佬  详情 回复 发表于 2023-4-5 13:04
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

13
 
maychang 发表于 2023-4-5 12:35 如果是要产生一个占空比50%的方波,那只要使用一个定时器就够了。每次定时器产生中断,将PWM0位取反即可。 ...

嗯嗯,谢谢大佬

此帖出自51单片机论坛

点评

如果单片机再添加其他功能,再用C51来产生这个的PWM是不是就很难实现了。  详情 回复 发表于 2023-4-5 13:08
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

14
 

如果单片机再添加其他功能,再用C51来产生这个的PWM是不是就很难实现了。

此帖出自51单片机论坛

点评

要产生比较准确的PWM波形,应该如7楼朋友所说,采用具有PWM功能定时器的单片机。很多型号单片机输出PWM是不需要程序控制,也不需要中断的,而且往往具有多种PWM产生方式。  详情 回复 发表于 2023-4-5 14:59
既然是靠中断定时,那么该中断发生时不能是同级的其它中断正在执行,更不能是高级中断正在执行。否则,该定时中断不会得到执行。 如果你的51单片机还有其它中断,那么其它中断必须设置成低级中断而这个定时中断必  详情 回复 发表于 2023-4-5 14:57
用这种 “定时中断‘ 产生PWM波形,其占空比和周期不可能很准确。中断发生后并不是立即得到执行,要等到现在正执行的这条指令(机器指令)执行完毕,程序才会跳转到中断入口(对51单片机来说在0000开始后的几  详情 回复 发表于 2023-4-5 14:52
51单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。   用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路  详情 回复 发表于 2023-4-5 14:48
 
 
 

回复

7096

帖子

11

TA的资源

版主

15
 
晨回星 发表于 2023-4-5 13:08 如果单片机再添加其他功能,再用C51来产生这个的PWM是不是就很难实现了。

51单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。
  用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。

  下面重点介绍用一个定时器的实现PWM的方法。以周期为1ms(1kHZ)为例,要产生其它频率的PWM波,程序中只需作简单修改即可。用一个定时器时(如定时器T0),首先要确定PWM的周期T和占空比D,确定了这些以后,就可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n。

  因为这里我们是产生周期为1ms(1kHZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:

   1、当time>=100时,time清零(此语句保证频率为1kHZ);

   2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出低电平;

   3、当time<=n时,让单片相应的I/O口输出高电平,此时占空比就为%n。

 下面程序产生30%占空比的pwm:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
 
sbit PWM=P2^0;//  P2.0输出pwm
uchar time;  // 定义占空比的变量
 
void main()
{
    TMOD=0x01;//定时器0工作方式1
    TH0=0xff;//(65536-10)/256;//赋初值定时
    TL0=0xf7;//(65536-10)%256;//0.01ms
    EA=1;//开总中断
    ET0=1;//开定时器0中断
    TR0=1;//启动定时器0 
    while(1)
    {            
    }            
}
 
void tim0() interrupt 1
{
    TR0=0;//赋初值时,关闭定时器
    TH0=0xff;//(65536-10)/256;//赋初值定时
    TL0=0xf7;//(65536-10)%256;//0.01ms
    TR0=1;//打开定时器
 
    time++;
    if(time>=100)  //1khz
      time=0;   
    if(time<=30)   //占空比%30,可改
      PWM=1;  
    else PWM=0;
}

此帖出自51单片机论坛

点评

好的,谢谢  详情 回复 发表于 2023-4-5 15:54
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

16
 
晨回星 发表于 2023-4-5 13:08 如果单片机再添加其他功能,再用C51来产生这个的PWM是不是就很难实现了。

用这种 “定时中断‘ 产生PWM波形,其占空比和周期不可能很准确。中断发生后并不是立即得到执行,要等到现在正执行的这条指令(机器指令)执行完毕,程序才会跳转到中断入口(对51单片机来说在0000开始后的几个地址),再执行中断入口处的一条跳转指令,才开始实际执行中断例程。从中断发生到实际执行,至少要三个机器周期,至多可能八个机器周期。

这是不准确的第一个原因

此帖出自51单片机论坛

点评

明白了,感谢  详情 回复 发表于 2023-4-5 15:57
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

17
 
晨回星 发表于 2023-4-5 13:08 如果单片机再添加其他功能,再用C51来产生这个的PWM是不是就很难实现了。

既然是靠中断定时,那么该中断发生时不能是同级的其它中断正在执行,更不能是高级中断正在执行。否则,该定时中断不会得到执行。

如果你的51单片机还有其它中断,那么其它中断必须设置成低级中断而这个定时中断必须设置成高级中断。即使如此,前一回复中提到的不准确因素仍然存在。

此帖出自51单片机论坛
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

18
 
晨回星 发表于 2023-4-5 13:08 如果单片机再添加其他功能,再用C51来产生这个的PWM是不是就很难实现了。

要产生比较准确的PWM波形,应该如7楼朋友所说,采用具有PWM功能定时器的单片机。很多型号单片机输出PWM是不需要程序控制,也不需要中断的,而且往往具有多种PWM产生方式。

此帖出自51单片机论坛

点评

嗯嗯  详情 回复 发表于 2023-4-5 15:54
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

19
 
lugl4313820 发表于 2023-4-5 14:48 51单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一 ...

好的,谢谢

此帖出自51单片机论坛
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

20
 
maychang 发表于 2023-4-5 14:59 要产生比较准确的PWM波形,应该如7楼朋友所说,采用具有PWM功能定时器的单片机。很多型号单片机输出PWM是 ...

嗯嗯

此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表