找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8630|回复: 3
收起左侧

一个定时器生成多路PWM波形的原理和方法

[复制链接]
ID:63113 发表于 2018-3-30 21:16 | 显示全部楼层 |阅读模式
在很多工程应用中,需要使用到PWM波(脉宽调制),例如电机调速、温度控制调整功率等。本文讲述怎么利用单片机的一个定时器生成多路PWM波形。
一般的,PWM的周期t1是一个固定值,如1ms,10ms,100ms等,在一个周期中包含了高电平t2和低电平t3,它们的关系是t2+t3=t1。改变一个周期中高电平的时间,就能达到速度或者功率调整的目的。PWM适用于高速开关器件的控制,不适合于继电器等低速开关元件的控制,因为继电器等低速元件达不到如此快的开关速度。
PWM控制的关键是控制改变PWM的高电平时间t2,这个时间在其他子程序中由控制算法中进行修改,如PID控制算法。
1.JPG
图 1
在微处理器,如单片机中,实现一个定时器生成多路PWM的方法如下。
首先来看看用一个定时器实现一路PWM输出的方法:
>>定义一个时间基准刻度t,这个也是计时器中断周期,一般在程序中t不改变。PWM的周期、高低电平时间由若干个基准时间t组成;
>>定义一个全局计时变量n,n表示这段时间经过了多少个基准时间t;
>>定义一个全局计时变量n1,n1表示一个PWM的周期包含多少个基准时间t,n1=t1/t。一般在程序中n1,t1不改变。
>>定义一个全局计时变量n2,n2表示一个PWM周期中高电平包含多少个基准时间t,n2=t2/t。由于高电平的时间受其他算法控制改变的,n2也是随时在改变。
程序的流程如下:
①初始化定时器,定时器中断时间设置为t,如设置t为1ms或其他;
②初始化变量:n=0;//计时变量n清零
n1=t1/t;//一个PWM的周期t1包含了多少个基准时间t.
//假如设PWM周期为100ms,则n1=100;
                  n2=t2/t;//计算一个PWM中高电平时间t2由多少个基准时间//t组成。t2由其他控制算法改变。
③        开始计时,打开定时器中断。定时器中断程序中n++;
当n<n2&& n<n1时,IO口输出高电平;
当n>=n2&& n<n1时,IO口输出低电平;
当n>n1时,返回步骤①进行下一个周期的PWM.


程序流程图如下:
2.jpg
图2
如果在同一个定时器中需要多路PWM,再定义多组类似的变量,按照图2 中流程处理即可。


更多精彩内容,尽在微信公众号“永珂在线”
公众号二维码 - 小.jpg


回复

使用道具 举报

ID:296417 发表于 2018-4-13 15:12 | 显示全部楼层
楼主可以分享代码吗?谢谢!
回复

使用道具 举报

ID:639666 发表于 2019-11-12 07:14 | 显示全部楼层
很好的思路,赞一个。
回复

使用道具 举报

ID:609560 发表于 2019-11-12 09:43 | 显示全部楼层
樓主思路同我常用思路應同
如下復一個流星燈程序參考

#include<reg52.h>
unsigned int led=0x0;
unsigned char Duty_ratio[3]={75,90,98};
unsigned char freq,i,j;
void init(void)
{
        TMOD=0x02;     
        TL0=TH0=0xff-200;  
        TR0=1;                               
        ET0=1;                       
        EA=1;               
}

void timer0(void) interrupt 1
{
        freq++;
}

void PWM(void)
{
        led=0x01;
        for(j=0;j<3;j++)
        {
                led=led<<1;
                if(freq>Duty_ratio[j]) led=led+1;
        }
}

void main(void)
{
        init();
        while(1)
        {
                if (freq>=100)  
                {
                        freq=0;
                        i++;
                        if(i>=90) i=0; //移動速度
                }
                PWM();
                P1=~((led<<(i/5))>>4);
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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