历史上的今天
返回首页

历史上的今天

今天是:2025年02月02日(星期日)

2020年02月02日 | 如何用51单片机来产生PWM波

2020-02-02 来源:eefocus

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输出低电平

完整的代码请到我的网盘下载(已失效)

http://yunpan.cn/QzKaWM8VesFyc


2.5 软件仿真结果

2.5.1 频率为100Hz

a.占空比约15%

b.占空比95%

2.5.2 频率为10KHz

a.占空比15%

b.占空比90%

推荐阅读

史海拾趣

Heyco公司的发展小趣事

Heyco非常重视与合作伙伴的关系建设。2021年,Heyco将年度全球最佳分销商称号授予了电子元器件分销商贸泽电子,以表彰其在过去一年中不懈的努力和出色的销售业绩。这一奖项的颁发不仅体现了Heyco对贸泽电子的高度认可,也展示了双方之间深入、愉快的合作关系。通过与贸泽电子等优秀分销商的紧密合作,Heyco能够更好地服务全球客户,满足其多样化的需求。

Gigabit Logic Inc公司的发展小趣事
通过控制脉冲信号的频率或占空比,可以实现更精细的调速范围。
Global Mixed-Mode Technology Inc公司的发展小趣事
如果报警灯频繁误报或漏报,可能是由于电路中的元器件损坏、接触不良或设置不当等原因造成的。此时需要检查电路中的元器件是否完好、连接是否牢固以及设置参数是否正确等。如果发现问题需要及时修复或更换损坏的元器件并重新调整设置参数以确保电路的正常工作。同时还需要注意定期对电路进行维护和保养以延长其使用寿命并提高其可靠性。
Goldentech Discrete Semiconductor Inc公司的发展小趣事

为了进一步提升国际竞争力,Goldentech制定了明确的国际化战略。公司通过设立海外研发中心、销售网络和服务中心,加强与国际市场的联系和沟通。同时,Goldentech还积极参与国际标准的制定和推广工作,提升其在全球半导体行业的话语权和影响力。经过多年的努力,Goldentech已经成功在多个国家和地区建立了完善的业务体系和服务网络,为全球客户提供更加便捷、高效的服务和支持。

Hexawave公司的发展小趣事

在快速发展的同时,Goldentech始终关注环境保护和社会责任。公司积极推行绿色制造理念,采用环保材料和节能技术,减少生产过程中的碳排放和资源消耗。此外,Goldentech还投入大量资金研发可回收和可降解的半导体产品,旨在为全球电子行业的可持续发展贡献力量。这一环保理念不仅提升了公司的社会形象,还吸引了更多注重可持续发展的客户和合作伙伴。

Catalyst / ON Semiconductor公司的发展小趣事

在电子行业的早期,Catalyst / ON Semiconductor公司由一群富有远见和热情的工程师创立。他们看到了半导体技术在电子领域的巨大潜力,并决定投身于这一新兴的产业。初创时期,公司面临着资金短缺、技术难题和市场接受度低等多重挑战。然而,凭借团队成员的坚持不懈和勇于创新的精神,他们成功开发出了几款具有竞争力的半导体产品,并逐渐在市场上获得了一席之地。

问答坊 | AI 解惑

汽车导航系统电源设计

现代汽车不断增加越来越复杂的电子系统。市场调研公司 Allied Business Intelligence 预测,到 2007 年,汽车半导体市场将增长到一年超过 170 亿美元,而去年这一市场为 123 亿美元。另一家市场调研公司 Strategy Analytics 也持有同样乐观的看法: ...…

查看全部问答>

有谁用过用单片机控制SHT15温湿度传感器啊?

有谁用过用单片机控制SHT15温湿度传感器啊? 求助通信时序问题?…

查看全部问答>

菜鸟请教D12驱动应用程序问题

菜鸟请教D12驱动应用程序问题 小弟使用D12和51做一个大量数据传输的东西。 固件使用ZLG的,驱动是用DriverStudio3.1直接生成的。 使用DS里面的函数OpenByInterf()打开USB设备,用ReadFile()阻塞模式来读取USB数据 因为在51那里是连续发的,所 ...…

查看全部问答>

有需要IC芯片的可以找我啊,呵呵

各位朋友好,本人现在在北京一家公司做IC销售,我们家一般都是从国外订货,质量有保证,如果没有库存,订货一般7-10天,我们家常做的厂家有altera, intel,on,maxim,atmel,st,ad,ti等等的。欢迎各位朋友给小女子我捧场啊,在这里我先谢谢各位朋友啦 ...…

查看全部问答>

THS3201放大后整体偏置呢?

本帖最后由 dontium 于 2015-1-23 13:23 编辑 我做了关于THS3201的放大电路,反向放大时整体偏置,同相放大时会自激振荡也会整体偏置。请问有人使用过吗?有高见么? …

查看全部问答>

LM3S2B93的内部LDO问题

做了两块LM3S2B93的板子,结果全部因为2B93的内部LDO问题失效,第一块板运行成功一段时间后,突然失效,最后检测结果2B93中LDO短路,第二块板运行成功一段时间后,同样失效,检测2B93中LDO电压降为0.8V,3.3V电路正常。 1.2V电路仅接了去耦电容X5R ...…

查看全部问答>

求科普

有一段用keil运行的代码怎么移植到cc2530上?…

查看全部问答>

正反随便插!USB 3.1接口长这样

本帖最后由 jameswangsynnex 于 2015-3-3 19:50 编辑 USB3.1采用全新的接口设计,传输带宽从USB 3.0 5Gbps翻番到了10Gbps,供电电流从1.5A大幅增加到了3-5A。其中USB 3.1 Type-C是全新设计的接口样式,上下两端是完全一样的,类似苹果的Lightning ...…

查看全部问答>

ADXL345快速指南数据是否有误?

ADXL345快速指南第四页表2,为什么输出0FFF时加速度值是1599,而不是4095*3.9=15970?是我理解错还是指南有问题? 我认为设置在16G模式下,应该是15970mg,15970mg/1000≈16G。不知这样理解有误?如果真是1599,那么ADXL345输出不是线性的,应如何 ...…

查看全部问答>