打印

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

[复制链接]
12297|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hxq1028|  楼主 | 2009-7-22 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
戒指320| | 2009-7-22 19:13 | 只看该作者

我想哪位高手都能提供,但应该没有人会提供。
这个问题你可以自己思考,不难啊。
另外,我也是菜鸟。

使用特权

评论回复
板凳
Airwill| | 2009-7-22 21:17 | 只看该作者

标准 51 没有 PWM 模块

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

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

不过, 楼主的命题过于简单, 没有提到要求. 请自行考虑

使用特权

评论回复
地板
郑成功了| | 2009-7-22 22:37 | 只看该作者

俺刚做完这个

用在俺给儿子做的DIY中,对电机调速,爽呆。
很简单,就是定时,计数比较,输出,就这几个动作。

使用特权

评论回复
5
新好男孩| | 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%上,下图是软件的仿真结果: 


使用特权

评论回复
6
yimiyangguang66| | 2013-9-6 15:17 | 只看该作者
新好男孩 发表于 2009-7-23 11:22
怎样用单片机模拟PWM&nbsp;版本v2&nbsp;怎样用单片机模拟PWM&nbsp;版本:v2&nbsp;在讲解PWM&nbsp;之前,让 ...

不错 很好 很强大

使用特权

评论回复
7
褚帆子哥| | 2015-7-26 10:33 | 只看该作者
新好男孩 发表于 2009-7-23 11:22
怎样用单片机模拟PWM&nbsp;版本v2&nbsp;怎样用单片机模拟PWM&nbsp;版本:v2&nbsp;在讲解PWM&nbsp;之前,让 ...

受益无穷

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝