5481|1

18

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51单片机模拟PWM [复制链接]

吴水林的学习笔记
怎样用单片机模拟PWM
版本:v2
在讲解PWM 之前,让我们来了解几个和PWM 相关的词汇。
1. 频率:
频率f 是周期T 的倒数,即f =1/T。而像中国使用的电是一种正弦交流电,其频
率是50Hz,也就是它一秒钟内做了50 次周期性变化。
2. 周期(period):
事物在运动、变化的发展过程中,某些特征多次重复出现,其接续两次出现所经过的时
间。通常用T 表示。频率(f)的倒数。即T = 1 / f.物体完成一个完整的振动所需要的
时间,以T0 表示。单位一般是用“秒”来表示,也常用毫秒(ms)或微秒(us)做
单位。1s=1000ms,1s=1000000us。例如一个单摆,它的周期就是重锤从左运动到
右,再从右运动回左边起点所需要的时间。
3. 占空比(Duty Cycle):
在一串理想的脉冲序列中(如方波),正脉冲的持续时间与脉冲总周期的比值。
例如:脉冲宽度1μs,信号周期4μs 的脉冲序列占空比为0.25。
知道了以上的一些基本知识。那我们怎样确定最占空比呢?最小占空比!在此我们为了
叙述的方便,就把最小占空比宽度定为频率周期的1%.
// 如125Hz 方波的周期时间: 1s=1000ms, T = 1000ms/125 = 8ms = 8000us
// 最小占空比宽度就是8000us 乘以1%,就是80us.
首先我们就对相关数据进行定义:
#define PWM_PERIOD 100 // 100%占空比时标数
sbit PwmOut = P1^0; // 占空比输出I\0
unsigned char PwmPeriodCont; // PWM 占空比计数器
struct Pwm
{
// PwmPeriod=PwmH+PwmL
// DutyCycle(100%)=PwmH/PwmPeriod*100%
//unsigned PwmPeriod;
unsigned char PwmH;
unsigned char PwmL; // 此变量无作为,只是为了便于理解
};
struct Pwm A;
吴水林的学习笔记
下面,我们就用单片机的一个定时器,以最小占空比(80uS)作为标准时标进行中断。那
我们就用51 的定时器1 作为1%占空比的时标,计算如下:
在 51 单片机中。我们可以作如下处理:
/*------------------------------------------------------------------------------------------------*-
* 函数名称: Pwm_init ()
* 函数功能: 设定1%占空比时标。
* 说 明:
*
* 当前版本: 1.0 * 取代版本:
* 作 者: 吴水林 * 原作者 :
* 完成日期: 2009-05-31 * 完成日期:
-*------------------------------------------------------------------------------------------------*/
void Pwm_init(void)
{ // 22.1184MHz
TMOD = 0x20; // 定时器1 模式2
TL1 = 0x6c; // 125Hz
TH1 = 0x6c;
ET1 = 1;
TR1 = 1;
//EA = 1;
// 必须清0,不然第一次占空比比例错误
PwmPeriodCont = 0;
}
吴水林的学习笔记
/*------------------------------------------------------------------------------------------------*-
* 函数名称: PwmSr()
* 函数功能: 1%占空比时标
* 说 明: 占空比从0% ~ 100%可调,进步1%
*
* 当前版本: 1.0 * 取代版本:
* 作 者: 吴水林 * 原作者 :
* 完成日期: 2009-05-31 * 完成日期:
-*------------------------------------------------------------------------------------------------*/
void PwmSr(void) interrupt 3
{
PwmPeriodCont++;
if (PwmPeriodCont <= A.PwmH)
{ // 高电平从0 到...A.PwmH,如果A.PwmH=100,则占空比为100%
PwmPin = 1;
}
if ((PwmPeriodCont > A.PwmH)&&(PwmPeriodCont <= PWM_PERIOD))
{ // 当占空比小于100 时,程序才能运行到此, 剩下的为低电平时间
PwmPin = 0;
}
// 限制占空比小于等于100%
if (PWM_PERIOD == PwmPeriodCont)
{ // 当程序运行到此时,一个频率周期完成
PwmPeriodCont=0;
}
}
以上处理我们还不能控制PWM 的占空比,因为正脉冲的宽度(A.PwmH)还是一个未知量。
我们要通过改变A.PwmH 中的值来改变PWM 的占空比。
注意:NewPwmValue 值只能是0 ~ 100 之间的数.
void Set_Pwm(const unsigned char NewPwmValue)
{
if ( NewPwmValue > PWM_PERIOD)
{
//A.PwmH = 0;
return;
}
A.PwmH = NewPwmValue;
A.PwmL = PWM_PERIOD - A.PwmH;
}
吴水林的学习笔记
所以,我们可以通过void Set_Pwm(const unsigned char NewPwmValue)这个函数来设定
PWM 的占空比,如我们在程序中调用:
Set_Pwm(25);
那么就可以将PWM 占空比设定在25%上,下图是软件的仿真结果:
此帖出自51单片机论坛

最新回复

请问一下,可不可以输出50kHz~100kHz的可调占空比PWM波形?  详情 回复 发表于 2011-1-18 19:52
点赞 关注
 

回复
举报

52

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

回复 楼主 STUDYKAKA 的帖子

请问一下,可不可以输出50kHz~100kHz的可调占空比PWM波形?
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表