原创 PWM的单片机产生

2011-4-14 16:44 5932 9 10 分类: MCU/ 嵌入式

      在上次说的直流电机调速的项目中,用了S52单片机的T2定时器产生PWM波信号,用于控制直流电机的转速,虽然电机的平均速度与占空比不是严格的线性关系,但是在调节占空比可以明显的看出电机转速发生了改变,也算是满足了课题的要求。下面复习一下PWM的知识吧。


        PWM—脉冲宽度调制(Pulse Width Modulation),是一种周期一定而高低电平可调的方波信号。当输出脉冲的频率一定时,输出脉冲的占空比越大,相对应的输出有效电压越大。PWM可以应用在许多方面,如电机调速、温度控制、压力控制等。


0e643052-101a-4004-bba7-e05784c9e076.jpg


图1 PWM波示意图


 


        如上图所示T1为脉冲宽度(就是导通时间),周期为T,则输出电压的平均值为U=VCC*T1/T=a*VCC,a是占空比,变化范围为0≤a≤1。VCC为电源电压。


        所以当电源电压不变的情况下,输出电压的平均值U取决于占空比a的大小,改变a的大小就可以改变输出电压的平均值,这就是PWM的工作原理。采用T2定时器产生PWM脉冲极其精确,误差只在几个us。


 


上PWM程序


// 文件名: T2PWM.c
// 功能:  用T2定时器产生PWM波,频率实调1khz


// 说明:  单片机AT89S52,晶振12MHZ;
// 日期:   2011年4月6日



#include "reg52.h"


#define uint unsigned int


#define uchar unsigned char



sbit PWM = P1^1;


uchar pluse;  //占空比寄存器



void Timer2() interrupt 5


{


        static uchar time;


        TF2=0;


        if(++time==pluse) PWM=0; //达到脉宽设定值时,输出PWM低电平


        else if(time==40) //PWM的频率为1khz左右


{


         time=0;


         PWM=1;


}



}



 void InitTimer2(void) //初始化函数


{


        RCAP2H = 0xff ;//定时25us初值


        RCAP2L = 0x0e7;// 


         ET2=1;


         EA=1;


         TR2=1;


}


void main(void)


{  


        InitTimer2();


        while(1)


{


        pluse=20;


}


}



        我把PWM波的周期定为1ms,占空比分40级可调(即每级差2.5%),这样定时器T2每25us产生一个定时中断,每40次中断后进入下一个PWM波的周期。在程序中,pluse=20,即占空比为50%,输出的平均电压为12*50%=6V。


        PWM产生的过程是这样的,开始时PWM为1,当计时到达pluse时(即到达了设定的脉宽宽度时间)PWM=0,随后到达PWM周期时间后PWM=1,此时下一个PWM周期重新开始。为了便于理解,波形在定时中断的产生时序示意图如下所示。


e538acb0-0e56-4f3f-8c39-adab022b01eb.jpg


 图2 PWM产生时序图


这是用示波器截下的PWM波形图,波形还不错。


 4ecefc3c-47f0-4c3c-9bff-8ce53380382a.jpg 


 5480ed88-5f51-4ba6-a48a-077f0cefb35e.jpg


766146ac-d719-40e8-876d-93afd50eac6a.jpg

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2012-7-13 17:09

恩啊 写的很好 有没有用430写过的呢 可不可以发到我邮箱 545244661@

用户1188474 2010-2-26 14:14

cool!!!!!
相关推荐阅读
用户283608 2011-04-15 13:21
C51文件包含两种形式的差异
        在看别人的程序时,一直有这么个疑问,就是#include<>和#include""的两种文件包含的差异,为什么有的地方用尖括号<>,有的地方可以用双撇号""呢,...
用户283608 2011-04-13 19:09
S52单片机T2定时器的应用
     在S51单片机中,有两个16位的定时器,一般的程序用用也差不多,但是有些情况下两个定时器还真不够用,比如在直流电机调速的项目中,一个用于测电机旋转时切割光耦通路产生的脉冲;另一个用于定时精确...
用户283608 2011-04-08 11:06
STC单片机下载器的制作
        STC单片机因其抗干扰能力强,使用串口下载方便,因而得到广泛了的应用。现在大家一般用USB串口芯来给STC单片机下载程序,这类芯片有PL2303、CH341T、CP2101等。这给笔记...
用户283608 2011-04-06 17:59
S52单片机T2定时器的可编程时钟发生器
        52单片机里面有一个T2定时器,它比普通的16为定时器功能要强大多了,今天研究了T2定时器的一个应用——可编程时钟输出功能。配置成500KHZ的时钟信号输出后,用示波器测量了时钟输出脚...
用户283608 2011-04-05 10:23
移位实现乘、除和求模
        在C51中,乘、除、求模运算都是通过调用库函数来实现的,调用库函数的优点在于简化了编程,缺点是代码长度长、调用时间长。适当的使用移位操作来代替乘、除、求模运算可以大大的节省时间和代码...
EE直播间
更多
我要评论
1
9
关闭 站长推荐上一条 /3 下一条