0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

软件延时和定时器产生产生PWM方法详解

h1654155971.7688 2017-12-11 14:22 次阅读

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倍的占空比来计算。同时,要注意数据类型,避免超出范围,影响计算结果。

修改后的公式如下:

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%

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    5997

    文章

    43947

    浏览量

    620528
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4885

    浏览量

    209807

原文标题:51单片机产生PWM方法

文章出处:【微信号:weixin21ic,微信公众号:21ic电子网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    两种方法教你如何有效地利用51单片机产生PWM

    89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法
    的头像 发表于 12-24 09:58 9.1w次阅读
    两种<b class='flag-5'>方法</b>教你如何有效地利用51单片机<b class='flag-5'>产生</b><b class='flag-5'>PWM</b>波

    定时器产生PWM

    我用定时器产生20ms为周期的PWM波,可以实现,但是我的步进有0.08ms,我现在想实现步进0.02ms,怎么办。
    发表于 08-09 15:33

    串口控制PWM占空比但串口的定时器产生PWM定时器总是冲突

    我想用51单片机写一个串口控制PWM占空比的程序,可是串口的定时器产生PWM定时器总是冲突,不知道怎么解决,特来请教各位老师,希望给予解
    发表于 03-07 22:21

    利用定时器产生PWM

    摘要利用定时器产生PWM波。然后利用32的外部中断和定时器来测量32输出的波形 硬件:STM32F103C8T6核心板、示波器、串口调试助手 所用到的的引脚为PA8和PA0。测量方案在
    发表于 08-16 08:37

    STM32定时器详解

    结合起来使用的话可以实现非常丰富的功能,可以测量输入信号的脉冲宽度,可以生产输出波形。定时器生产 PWM 控制电机状态是工业控制普遍方法
    发表于 08-18 06:17

    STM32产生PWM的配置方法有哪些

    STM32定时器的原理是什么?PWM波形产生的原理是什么?STM32产生PWM的配置方法有哪些?
    发表于 09-24 08:06

    stm32f407的定时器是如何产生PWM

    stm32f407有多少定时器呢?stm32f407的定时器是如何产生PWM的?
    发表于 10-20 06:09

    STM32产生PWM的配置方法

    目录:一、引脚映像与寄存1、定时器引脚复用功能映像2、定时器二、定时器PWM产生原理三、STM
    发表于 12-06 06:25

    如何使用标准51定时器0产生pwm波?

    如何使用标准51定时器产生pwm
    发表于 10-30 07:03

    MCP定时器产生边沿PWM输出

    MCP定时器产生边沿PWM输出:PWM波是一种脉宽可调的脉冲波,用于交、直流电机的电压控制。PWM一共有两种调整
    发表于 09-19 11:17 26次下载

    MCP定时器产生中心对称PWM输出

    MCP定时器产生中心对称PWM输出:PWM波是一种脉宽可调的脉冲波,用于交、直流电机的电压控制。PWM一共有两种调整
    发表于 09-19 11:18 38次下载

    555定时器产生方波原理(四款555定时器产生方波的电路详解

    本文主要介绍了555定时器产生方波原理(五款555定时器产生方波的电路详解)。555定时器的功能
    发表于 01-22 09:07 35.1w次阅读
    555<b class='flag-5'>定时器</b><b class='flag-5'>产生</b>方波原理(四款555<b class='flag-5'>定时器</b><b class='flag-5'>产生</b>方波的电路<b class='flag-5'>详解</b>)

    如何利用stm32的高级定时器产生PWM

    用stm32的高级定时器TIM1和TIM8产生PWM,需要注意: 1.都有TIM1,但只有flash容量大于256K的大容量单片机才有TIM8 2.高级定时器相对于通用
    发表于 10-24 15:48 6230次阅读
    如何利用stm32的高级<b class='flag-5'>定时器</b><b class='flag-5'>产生</b><b class='flag-5'>PWM</b>

    使用51单片机产生PWM方法和程序详细说明

    89C51 芯片没有自带 PWM 发生器,如果要用 51 来产生 PWM 波就必须要用软件编程的方法来模拟。
    发表于 12-08 23:22 25次下载
    使用51单片机<b class='flag-5'>产生</b><b class='flag-5'>PWM</b>的<b class='flag-5'>方法</b>和程序详细说明

    如何使用555定时器产生PWM

    生成PWM ,那么我们更喜欢一些通用IC,如运算放大器,定时器,脉冲发生器等。这里我们使用 555定时器IC来产生PWM 。 555
    的头像 发表于 01-25 15:09 4975次阅读
    如何使用555<b class='flag-5'>定时器</b>来<b class='flag-5'>产生</b><b class='flag-5'>PWM</b>