打印

如何用单片机的p0.0输出一个占空比可变的pwm信号

[复制链接]
6030|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
反孔精英|  楼主 | 2008-11-12 17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ljm810010| | 2008-11-12 20:47 | 只看该作者

用这个就行啦

要5秒由100%变到0%,而PWM频率是120Hz,是不可能平滑过渡(5*120不能被256整除),所以这里不用5秒,用4.266秒(5秒内),就可实现脉宽从100%到0%的平滑递减,每次减1/256。下面是一示范程序,标准8051核,晶体11.0592MHz,两个PWM周期减一次脉宽,刚好4.266秒。

L1: cjne a,7,$+3  ;比较脉宽,a作循环计数,r7为脉宽值
    mov  P0.0,c   ;输出比较结果
    mov  b,#8     ;设定延时值
    djnz b,$      ;延时
    djnz acc,L4   ;完成一次PWM周期
    jbc  f0,L3    ;两个PWM周期改变一次脉宽
    setb f0       ;设立标记
    dec  r7       ;脉宽递减
L2: jmp  L1       ;匹配时序
L3: jmp  L2       ;匹配时序
L4: jmp  L3

使用特权

评论回复
板凳
反孔精英|  楼主 | 2008-11-13 08:31 | 只看该作者

一些不明白的地方

r7应该设初始值ff吧 ,前面应该有个mov r7,#0ffh。cjne a,7,$+3  ;$+3是什么?应该是cjne a,r7,$吧。

使用特权

评论回复
地板
5880527| | 2008-11-13 09:20 | 只看该作者

***

没看太明白这个120HZ如何保证的,好象是在主循环里做的,除非就做这一件事情

使用特权

评论回复
5
lyjian| | 2008-11-13 09:26 | 只看该作者

2楼方法不错

只有256级,最小的占空比只能为1/256,是实现不了0%的。
占空比变化为1/256%~100%

使用特权

评论回复
6
ljm810010| | 2008-11-13 09:53 | 只看该作者

回复3楼反孔精英

一般来说,r7确应赋初值,而且acc,f0也应赋初值,这三个量决定了PWM的初始状态。但因你这里PWM状态是不断循环的,就不用管它初态如何,这三个值为任意,都是循环内的某一状态,不影响工作,只不过是PWM的初态不同。

cjne a,7,$+3 中的 $+3 是指向下一条指令,这里只作比较,无论结果如何,都是执行下一指令,而比较结果反映地进位标志c中。

使用特权

评论回复
7
ljm810010| | 2008-11-13 10:08 | 只看该作者

回复4楼5880527

120Hz是这样算: L1段每隔30周期(由寄存器b的值决定)执行一次,acc作256次循环计数,一次循环就是一个PWM周期,256*30=7680机器周期,11.0592MHz/12/7680 = 120Hz。

本例是MCU处理单一事件的情况,实际应用要有PWM模块的MCU才能实用,没有PWM模块,用定时+中断,很难保证中断响应时间,从而PWM输出不精确,除非对PWM要求不高。

使用特权

评论回复
8
反孔精英|  楼主 | 2008-11-13 10:22 | 只看该作者

还是不太明白2楼的程序

为什么是cjne a,7,$+3是不是等同于cjne a,R7,$+3?前面是不是应该加2句指令。
mov r7,#ffh
dec r7
回下4楼的,其实实现的思路是先显示2次pwm,然后改变一次pwm占空比,再显示2次pwm,改变pwm,如此循环256次,占空比由100%到0% 。pwm的频率是120hz,周期是1/120s,显示2次需要1/60s,共计256个2次显示,耗时1/60*256s约等于4.2666s。这个程序需要一直循环的。就是2楼的程序还不怎么理解。

使用特权

评论回复
9
ljm810010| | 2008-11-13 10:39 | 只看该作者

回LS

cjne a,7,$+3 就是等同 cjne a,r7,$+3,不过写成r7是不能通过编译的,会报错。

r7不用赋初值,我在6楼解释过

至于 dec r7,我放在程序后面,效果一样,不必在前面再加dec r7

使用特权

评论回复
10
5880527| | 2008-11-13 17:53 | 只看该作者

不管任务有多简单

个人还是觉得用定时器做好点,定时器做PWM的精度和单片机自带的PWM一样,而且定时器调节更灵活

使用特权

评论回复
11
ljm810010| | 2008-11-13 18:06 | 只看该作者

不一样D

PWM设一后就自行工作,没PWM用定时中断,中断响应时间就不同,精度跟硬件PWM没法比。

使用特权

评论回复
12
dengm| | 2008-11-13 18:26 | 只看该作者

11.0592MHz 120hz 1/256

11,059,200/12/120/256 = 30 (指令周期)
用定时器能"精确"完成, CPU 使用 < 0.5% .

使用特权

评论回复
13
ljm810010| | 2008-11-13 19:12 | 只看该作者

楼主dengm可能有点误解

用定时器能“精确”完成计时,但不能“精确”输出PWM,“精确”计时完成后,还要通过中断处理才能输出PWM,一旦要中断,就不能“精确”了,因为响应中断的时间是不可预知的。

使用特权

评论回复
14
5880527| | 2008-11-13 19:31 | 只看该作者

其实是能完全能做到精确输出的

虽然每次定时器中断响应速度不一致,但简单修正就可以使得在同一时刻输出了。定时器做PWM只占用单片机很少时间资源,对于没有硬件PWM时完全可以用它做,唯一的缺点是不适合频率过高,象楼主这里的1/256用定时器做起来就很吃力了

使用特权

评论回复
15
反孔精英|  楼主 | 2008-11-13 20:18 | 只看该作者

谢谢ljm810010的指点。

程序非常好用,我的控制板用的是24mhz晶振。就是输出有干扰,波形不是很好看,不过这个也没什么关系了,这个pwm波形是用来控制led亮度的。

使用特权

评论回复
16
反孔精英|  楼主 | 2008-11-13 21:15 | 只看该作者

现在又有问题了

一个zql9712的ic,其实就是一个74hc595的缩小版,需要输入一个3bit的数据,控制时序如图,自己写了个程序,不能正常输入数据,大家帮看看有什么问题
ORG 0030H
    MOV P1,#0F7H    ;初始化p0
    MOV 29H,#01H       ;要输入的数据,00000001,
    ACALL SEND
    SETB P1.3
    NOP
    NOP
    NOP
    NOP
    CLR P1.3
SEND:    MOV R0,#03H    ;发送显示数据
S_LOOP:    MOV C,29H.2
    CLR P1.2
    NOP
    NOP
    NOP
    NOP
    MOV P1.1,C
    NOP
    NOP
    SETB P1.2
    MOV A,29H
    RL A
    MOV 29H,A
    NOP
    NOP
    NOP
    NOP
    NOP
    CLR P1.2
    DJNZ R0,S_LOOP
    CLR P1.1
    RET
    END

使用特权

评论回复
17
反孔精英|  楼主 | 2008-11-13 21:21 | 只看该作者

时序图如下和输出io定义如下

;P1.0 OE
;P1.1 DA
;P1.2 CK
;P1.3 LA

使用特权

评论回复
18
耕在此行| | 2008-11-13 21:35 | 只看该作者

同意10楼观点

首先:楼主的思路有问题,既然是控制LED,那就只要在0-5秒内均匀地从100%降到0就行了.不必管它每次降多少.
所以:120HZ * 5 S = 600次 ,每次降1/ 600就行了.
     定时器每1/(120*600)秒=13.88uS中断一次并计数,并从0计数.
     计数到600,重新开始输出脉宽(IO高),计数到脉宽比较值,结束输出脉冲(IO低),比较值每脉宽输出一次减一.
注意点:单片机机器周期越小越小,如STC的单CLK的片子,或PHILIPS的900 ,
       430的等等.晶振频率在允许情况下越高越好.
       另外,定时器中断定在最高优先级.其它中断定在次优先级.
本人曾经做过七彩背光.呵呵 用430做的 PWM控制效果很不错.

使用特权

评论回复
19
lyjian| | 2008-11-13 23:10 | 只看该作者

控制LED而已,没必要做得那么精确

用定时中断做,误差一个指令周期(1/30=3.3% with XTAL=11.0592)。

使用特权

评论回复
20
反孔精英|  楼主 | 2008-11-14 08:16 | 只看该作者

这个倒不是什么精不精确的问题

led调光都是用多少位调光的,一般都是2的n次方,这里用的是8位调光,所以要分为256级。随便设是不行的。

使用特权

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

本版积分规则

12

主题

74

帖子

0

粉丝