[经验] 利用51单片机输出PWM波形程序

2018-6-13 16:14:44  682
收藏 1 收藏 推荐 0 推荐
分享
单片机是可以输出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:

  1. #include<reg51.h>  
  2. #define uint unsigned int  
  3. #define uchar unsigned char  
  4.   
  5. sbit PWM=P2^0;//  P2.0输出pwm  
  6. uchar time;  // 定义占空比的变量  
  7.   
  8. void main()  
  9. {  
  10.     TMOD=0x01;//定时器0工作方式1  
  11.     TH0=0xff;//(65536-10)/256;//赋初值定时  
  12.     TL0=0xf7;//(65536-10)%256;//0.01ms  
  13.     EA=1;//开总中断  
  14.     ET0=1;//开定时器0中断  
  15.     TR0=1;//启动定时器0   
  16.     while(1)  
  17.     {            
  18.     }            
  19. }  
  20.   
  21. void tim0() interrupt 1  
  22. {  
  23.     TR0=0;//赋初值时,关闭定时器  
  24.     TH0=0xff;//(65536-10)/256;//赋初值定时  
  25.     TL0=0xf7;//(65536-10)%256;//0.01ms  
  26.     TR0=1;//打开定时器  
  27.   
  28.     time++;  
  29.     if(time>=100)   //1khz
  30.       time=0;     
  31.     if(time<=30)    //占空比%30,可改
  32.       PWM=1;   
  33.     else PWM=0;  
  34. }  
复制代码


最后的到波形,在示波器上显示如下图所示:

0.png


如果想修改占空比,直接在程序里面修改下面这句即可。
if(time<=30)//占空比%30,可改占空比。

本文出处:        https://blog.csdn.net/dmfylb/article/details/72465762


1281788316 2018-6-13 16:28:53
谢谢楼主分享!
回复

举报

小学生炖肉 2018-6-13 19:59:02
版主还是挺6的呀
回复

举报

王栋春 2018-6-13 20:41:01
请教一下楼主  波形图从左到右数第四个为什么有尖峰呀  在一些测量当中也遇到过 还望解释一下
回复

举报

Arive 2018-6-13 22:42:31
谢谢大师的分享。谢谢。
回复

举报

24不可说 2018-6-14 08:28:11
王栋春 发表于 2018-6-13 20:41
请教一下楼主  波形图从左到右数第四个为什么有尖峰呀  在一些测量当中也遇到过 还望解释一下

频率越高,出现毛刺的越多,和设置的定时器计数有关系,
所以驱动电路中对PWM一定要进行滤波
回复

举报

24不可说 2018-6-14 08:29:48
王栋春 发表于 2018-6-13 20:41
请教一下楼主  波形图从左到右数第四个为什么有尖峰呀  在一些测量当中也遇到过 还望解释一下

以前我试过,如果是工频的50HzPWM,毛刺就较少,
如果是几十KHz的 就很多了。
另外还和占空比有关系。
其实无论是DSP还是ARM,输出的PWM波,原理都是计数器生成的高低电平
回复

举报

lzhiaohiua 2018-6-14 08:33:47
谢谢楼主的分享
回复

举报

lee_st 2018-6-14 08:41:30
学习一下
回复

举报

lee_st 2018-6-14 08:41:39
版主大作
回复

举报

24不可说 2018-6-14 11:09:55

不是原创,文末已经标明了转载了
回复

举报

王栋春 2018-6-14 12:52:35
@24不可说   难不成这个同示波器的固有工作原理也有关系
回复

举报

24不可说 2018-6-14 12:58:47
王栋春 发表于 2018-6-14 12:52
@24不可说   难不成这个同示波器的固有工作原理也有关系

和示波器采集的信号深度、带宽、频率可能有一定关系,越好示波器,信号越细腻,示波器里边也是通过模电和数电转换计算再显示出来的,比如用过日本横河的示波器,测同一个板子信号时,比周立功的要细腻很多
回复

举报

王栋春 2018-6-14 13:05:05
分析的不错,改天找个好些的示波器试试看
回复

举报

@曲终人散@ 2018-6-14 18:14:43
波形看着还挺干净,不过有一个毛刺
回复

举报

24不可说 2018-6-15 08:11:50
@曲终人散@ 发表于 2018-6-14 18:14
波形看着还挺干净,不过有一个毛刺

如果是几十到几百KHz的,毛刺会更严重,所以要滤波
回复

举报

lee_st 2018-6-15 08:54:54
哦哦,不是原创啊
回复

举报

lee_st 2018-6-15 08:55:10
我以前也爱转载
回复

举报

lee_st 2018-6-15 08:55:23
最近只发原创和资料了
回复

举报

24不可说 2018-6-15 09:08:49
lee_st 发表于 2018-6-15 08:55
最近只发原创和资料了

可以设置成回复可见内容,也能设置附件下载积分,不过积分少设置点,太多了很多不长逛论坛的坛友积分不够
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

12下一页
发经验
关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表