51单片机输出占空比可调波形

[复制链接]
13138|6
 楼主| hxq1028 发表于 2009-7-22 15:19 | 显示全部楼层 |阅读模式
那位高手能提供51单片机输出可调占空比的波形的详细设计思想和C程序?
戒指320 发表于 2009-7-22 19:13 | 显示全部楼层

我想哪位高手都能提供,但应该没有人会提供。
这个问题你可以自己思考,不难啊。
另外,我也是菜鸟。
Airwill 发表于 2009-7-22 21:17 | 显示全部楼层

标准 51 没有 PWM 模块

但是还是可以用软件来实现 PWM. 
如果要较高的精度, 可以使用一个定时器资源.
在定时中断改变输出电平.
通过改变定时时间, 可以实现 pwm 的频率和占空比调节.

当然, 中断响应是有个时间差的, 如果要精确设计的话, 还得考虑这个时间. 这个时间也会让 占空比极小和极大时的设计出现问题, 当然这个时候, 可以考虑在定时中断里完成一个脉冲的两次电平变换来实现.

不过, 楼主的命题过于简单, 没有提到要求. 请自行考虑
郑成功了 发表于 2009-7-22 22:37 | 显示全部楼层

俺刚做完这个

用在俺给儿子做的DIY中,对电机调速,爽呆。
很简单,就是定时,计数比较,输出,就这几个动作。
新好男孩 发表于 2009-7-23 11:22 | 显示全部楼层

楼主可以参考一下,看看是否可用???

怎样用单片机模拟PWM 版本v2 

怎样用单片机模拟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 
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%上,下图是软件的仿真结果: 


yimiyangguang66 发表于 2013-9-6 15:17 | 显示全部楼层
新好男孩 发表于 2009-7-23 11:22
怎样用单片机模拟PWM&nbsp;版本v2&nbsp;怎样用单片机模拟PWM&nbsp;版本:v2&nbsp;在讲解PWM&nbsp;之前,让 ...

不错 很好 很强大
褚帆子哥 发表于 2015-7-26 10:33 | 显示全部楼层
新好男孩 发表于 2009-7-23 11:22
怎样用单片机模拟PWM&nbsp;版本v2&nbsp;怎样用单片机模拟PWM&nbsp;版本:v2&nbsp;在讲解PWM&nbsp;之前,让 ...

受益无穷
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部