产品概述

51单片机pwm波 51单片机产生PWM方法

小编 2025-09-07 产品概述 23 0

51单片机产生PWM方法

89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面将逐一介绍。

1 软件延时法

利用软件延时函数,控制电平持续的时间,达到模拟pwm的效果。

程序如下:

#include<reg52.h>sbit pwm=P1^0;main(){while(1){ pwm=1;delayus(60);//置高电平后延时60us,占空比60%pwm=0;delayus(40);}}void delayus(uint x){while(x--);}

proteus软件仿真结果如下:

可见,用这种延时函数的方法就能简单地模拟出pwm输出。但是这种方法的缺点也相当明显。当程序除了要输出pwm波还要执行其他操作比如键盘扫描、显示等操作时,需要占用CPU一定的机器周期,这样就会影响pwm的准确度。现在很少会用到这种方法,接下来要介绍的是比较常用的方法。

2 定时器产生pwm

这种方法利用了定时器溢出中断,在中断服务程序改变电平的高低,在程序较复杂、多操作时仍能输出较准确的pwm波形。

2.1 注意事项

2.2.1中断服务程序的内容。

一般来说中断服务程序只完成改变标志位、转换高低电平的功能,如果中断服务程序中有太多的操作会影响pwm波的输出,尤其是除法、取余、浮点数运算会占用大量的机器周期,应在中断外完成运算。2.2.2定时器装入初值的问题。

装入初值不能太接近于定时器的溢出值。如我们使用定时器方式1,最多能计65536个数,假设我们转入的初值为65534,那么定时器计两个数就会进入中断,这样会使程序紊乱而其他功能无法正常地执行,所以一般要留50-100个数的裕量。

2.2 定时器工作方式

在定时器工作方式的选择上,可以选择定时器的工作方式0、1、2都可以,本文采用的是工作方式1,即16位定时器,这样可以获得较宽的调频范围。

2.3 定时器初值的计算

设占空比为α,频率为f

产生高电平时装入定时器高8位的值应为

产生高电平时装入定时器低8位的值应为

显然,产生低电平时的公式只要把α换成(1-α)就行了。

然而在51单片机中,浮点数运算需要消耗cpu很长的时间,为了提高程序效率,通常用100倍的占空比来计算。同时,要注意数据类型,避免超出范围,影响计算结果。关于C51的乘除法问题,可以看以下这篇文章:http://blog.163.com/ssou_1985/blog/static/295320362010311102232210/

修改后的公式如下:a为100倍占空比,fr为0.01倍频率TH0 = (65535-a*100/fr)/256; //高位初值TL0 = (65535-a*100/fr)%256;同样,低电平的公式只需把a换成(100-a)即可。

2.4 例程

本例程采用定时器T0在工作方式1下产生一路PWM,用独立键盘控制频率、占空比的加减,频率可调范围100Hz-10kHz,占空比0-100%(均为理论值,实际值略低)部分代码如下:

注:T0_H , T0_L , T1_H , T1_L 均用于暂时存储初值,进入中断服务程序后直接给寄存器TH0、TL0赋值,避免了在中断中计算。

注:flag为pwm输出标志,flag=1输出高电平,flag=0输出低电平

2.5 软件仿真结果

2.5.1 频率为100Hz

a.占空比约15%

b.占空比95%

2.5.2 频率为10KHz

a.占空比15%

b.占空比90%

End

51系列单片机PWM输出功能

51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出。对精度要求不高的场合,非常实用。电路图见图一,采用了高速光隔(6N137)输出,并将PWM的信号倒相。

一、原理图

图一

二、固定脉宽PWM输出

用T0定时器完成PWM输出,脉宽固定:65536微妙。T0定时器设置成:16位定时器

PWM:

程序清单:(12MHz)

PwmData0 ;T0定时t1所需的定时初值(字)

PwmData1 ;T0定时t2所需的定时初值(字)

PwmF ;PWM输出标志

;*********************************************************

setb tro ;启动T0

。。。。。。

T0Int:;T0中断服务程序

JB PwmF ,PwmOutH ;PWM输出未完成返回

Mov TH0,High(PwmData0)

Mov TL0,Low(PwmData0)

Setb tr0

Setb PwmF

Clr p1.0 ;PWM输出脚

reti

PwmOutH:

Setb p1.0

Clr tr0

Mov TH0,High(PwmData1)

Mov TL0,Low(PwmData1)

Setb tr0

Clr PwmF

reti

说明:在主程序中计算PwmData0、PwmData1的值。

三、可变脉宽PWM输出

用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大:65536微妙)。

T0、T1定时器设置成:16位定时器。

程序清单:(12MHz)

PwmData0 ;T0定时t1所需的定时初值(字)

PwmData1 ;T1定时T所需的定时初值(字)

;*********************************************************

setb tro ;启动T0

setb tr1

。。。。。。

T0Int:;T0中断服务程序

Clr tr0

setb p1.0 ;PWM输出脚

reti

T1Int:;T1中断服务程序

Clr p1.0

Clr tr0

Clr tr1

Mov TH0,High(PwmData0)

Mov TL0,Low(PwmData0)

Mov TH1,High(PwmData1)

Mov TL1,Low(PwmData1)

Setb tr1

Setb tr0

reti

说明:在主程序中计算PwmData0、PwmData1的值。

相关问答

51单片机 产生 pwm波 的c程序是什么?

用定时器产生程序如下:unsignedinta=0,b=10;voidmain(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000...

pwm 输出在 51单片机 哪个位置?

1.PWM输出在51单片机的P1口。2.这是因为51单片机的P1口具有PWM输出功能,可以通过设置相关寄存器来实现PWM输出。3.PWM输出是通过调整占空比来控制输出信号...

单片机 如何产生 pwm 。控制开关电源,驱动如何?

51单片机的拉电流能力100uA左右,MOS管是电压控制型,栅极电流很小,近乎于断路,所以IO口是可以直接驱动的;如果只是控制MOS管,隔离就没必要了;只要确保IO...5...

谁给一个 51单片机 用一个定时器可以输出频率一定,占空比可调的 PWM 脉冲例子给我参考一下啊?

一.51没有这样的功能,STC12单片机才有这样的功能,不过你可以用延时函数来产生PWM波形,但比较浪费CPU时间。二.还有一种方法可以用51来实现,但要消耗两个定时...

stc15 单片机pwm 工作原理?

STC15W内部集成了一个15位的PWM模块,可以6路独立输出.此外PWM模块每一路都有两个用于控制波形翻转的计数器T1和T2,可以灵活地控制每路PWM的高低电平宽度,...

51单片机 电机调速的方法?

单片机电机调速可以通过PWM(脉宽调制)实现,通过控制PWM的占空比可以调节电机的转速。具体实现方法是先采集电机转速,然后根据设定的目标转速计算对应的占空比...

单片机PWM 程序是肿么编写的啊,能给一个简单的例子吗?-ZOL问答

有PWM功能的单片机入STC12系列单片机,直接给专用寄存器赋值开启相应定时器就可以了。普通单单片机,PWM需要用自己来调配。比如:#includeunsigne...

51单片机 怎么连接多个可调的 pwm ?

在51单片机上连接多个可调的PWM输出通道,您可以使用定时器和计数器来实现。以下是一种常见的方法:1.选择合适的定时器和计数器:51单片机通常具有多个定时器...

怎么测量 pwm 信号?

要测量PWM信号,可以使用示波器或者逻辑分析仪。示波器可以显示信号的波形和频率,可以测量占空比和周期。逻辑分析仪可以捕捉和分析数字信号,可以测量PWM信号的...

单片机 输出 pwm 默认频率?

单片机输出PWM默认频率取决于具体的单片机型号和配置。大多数单片机默认的PWM频率在几十kHz到几百kHz之间。这个频率是由单片机的时钟源和预分频器决定的。在...

猜你喜欢