51单片机模拟PWM

51单片机模拟PWM

吴水林的学习笔记
怎样用单片机模拟PWM
版本:v2
在讲解PWM 之前,让我们来了解几个和PWM 相关的词汇。
1. 频率:
频率是周期的倒数,即f =1T。而像中国使用的电是一种正弦交流电,其频
率是50Hz,也就是它一秒钟内做了50 次周期性变化。
2. 周期(period)
事物在运动、变化的发展过程中,某些特征多次重复出现,其接续两次出现所经过的时
间。通常用表示。频率(f)的倒数。即T = 1 / f.物体完成一个完整的振动所需要的
时间,以T0 表示。单位一般是用来表示,也常用毫秒(ms)或微秒(us)做
单位。1s=1000ms1s=1000000us。例如一个单摆,它的周期就是重锤从左运动到
右,再从右运动回左边起点所需要的时间。
3. 占空比(Duty Cycle):
在一串理想的脉冲序列中(如方波),正脉冲的持续时间与脉冲总周期的比值。
例如:脉冲宽度1μs,信号周期4μ的脉冲序列占空比为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%占空比的时标,计算如下:
在 51 单片机中。我们可以作如下处理:
/*------------------------------------------------------------------------------------------------*-
函数名称: Pwm_init ()
函数功能设定1%占空比时标。
说 明:
*
当前版本: 1.0 * 取代版本:
作 者吴水林 原作者 :
完成日期: 2009-05-31 * 完成日期:
-*------------------------------------------------------------------------------------------------*/
void Pwm_init(void)
{ // 22.1184MHz
TMOD = 0x20; // 定时器模式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)
{ // 高电平从...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%上,下图是软件的仿真结果:

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值