历史上的今天
返回首页

历史上的今天

今天是:2026年03月21日(星期六)

正在发生

2023年03月21日 | 两种方法教你如何有效地利用51单片机产生PWM波

2023-03-21 来源:elecfans

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


1 软件延时法

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


程序如下:

#include 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%


推荐阅读

史海拾趣

GETEDZ ( HVGT)公司的发展小趣事
根据电路的需要选择合适的接触器、继电器等电器元件,确保元件的性能和质量满足要求。
德国ACAM公司的发展小趣事

2014年,ACAM公司迎来了一个重要的里程碑事件——被奥地利微电子股份有限公司收购。这次收购极大地增强了ACAM公司在时间数字转换器(TDC)技术领域的实力。奥地利微电子在半导体行业有着深厚的积累和丰富的经验,与ACAM公司的技术优势相结合,进一步提升了ACAM公司在市场上的竞争力。

EMMICRO公司的发展小趣事

作为一家具有社会责任感的企业,EMMICRO公司始终关注环保和社会公益事业。公司积极参与环保活动和公益捐赠,推动企业的可持续发展和社会进步。同时,公司还积极承担对员工的培训和发展责任,为员工提供良好的职业发展平台和福利待遇。这种对社会责任的担当也赢得了社会的广泛赞誉和尊重。

智烽维(CDA)公司的发展小趣事

经过几年的技术积累和市场探索,智烽维在2013年成功完成了叠片型超级电容器的研发。这一产品的推出,不仅极大地丰富了公司的产品线,也进一步提升了智烽维在超级电容器领域的技术实力。叠片型超级电容器以其高性能、高可靠性和长寿命等特点,受到了市场的广泛关注和好评。

Curtis Industries公司的发展小趣事

Curtis Industries公司在发展的同时,也积极承担社会责任。公司关注环保问题,采用环保材料和节能技术生产产品,减少对环境的影响。此外,公司还积极参与公益活动,支持教育事业和社会福利事业的发展。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了新的动力。

Essentra Components公司的发展小趣事

面对日益激烈的市场竞争,Essentra Components公司决定实施全球化战略,以拓展更广阔的市场。公司先后在亚洲、欧洲、美洲等多个地区设立了生产基地和销售服务点,实现了产品的全球覆盖。同时,公司还积极与当地企业合作,共同开发适合当地市场需求的产品,进一步巩固了其在全球市场的地位。

问答坊 | AI 解惑

wince连接固定的ip发送数据总是超时

  private void ReceMsg()         {             while (check)             {         ...…

查看全部问答>

stm8用户手册中17.5.9

                                 etr 怎们设置 才有效  写得 不明不白的…

查看全部问答>

如何判断定时器是向上溢出还是向下溢出

                                 STM32用在正交编码器上,为了得到一个很大的累计值(超过360度,与CNT寄存器一起组成32位的寄存器),所以需要进行 ...…

查看全部问答>

有熟悉这款方案的吗?出来给点意见

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 最近有方案商向我们推一款机顶盒方案(富士通MB86H60),据说这是一款非常成熟、性价比特别高的方案,但是网上居然很少相关资料。Why?说明下,我们的产品主要是针对ISDB-T、DVB-T及卫星机顶盒 ...…

查看全部问答>

关于MSP430FR5739实验板开发工具的说明

大家陆续拿到了MSP430FR5739实验板,很多坛友都反映所用的IDE没有支持到MSP430FR5739这款芯片。特别是使用IAR的坛友们,发现自己所用的IAR没有这款芯片。查阅了IAR for MSP430的发布记录,IAR For MSP430从Version 5.20.4版本开始支持MSP430FR5739 ...…

查看全部问答>

大家来看看STM32的串口程序,不知道哪里错了,望高手指点一二、、、

#include\"stm32f10x.h\" #include\"delay.h\" void RCC_config(void); void USART_Config(void); void USART_GPIOInit(void); void Put_String(u8 *p); int main() { RCC_config(); USART_GPIOInit(); USART_Config(); Put_Stri ...…

查看全部问答>

单片机等精度测量频率怎么实现的?

本帖最后由 paulhyde 于 2014-9-15 03:49 编辑 最近在写测频的程序,之前用双定时器,周期法测频的方法都有很大的误差。由于还没有学过这个方法,不知道是什么原理,求各位能讲解一下,举个程序例子最好了。。。谢谢了~~~  …

查看全部问答>

请问大家,现在哪个品牌的支持zigbee ha profile的网关比较好?

我想弄一个zigbee主机,能够通过wifi或者rj45链到iphone、ipad上,进行控制的。不知道那个牌子的好。…

查看全部问答>

51单片机pwm波求助

#include #define uint unsigned int #define uchar unsigned char //参数定义 sbit pwm=P1^0; sbit key_plus=P3^6; sbit key_reduce=P3^7; sbit duan=P2^6; sbit wei=P2^7; uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, ...…

查看全部问答>

【新神器来啦】STM32F746已到货,开启玩耍之旅

今天刚到,下了一下午资料。顺带贴几张图: …

查看全部问答>