发新帖我要提问
12
返回列表
打印

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

[复制链接]
楼主: 反孔精英
手机看帖
扫描二维码
随时随地手机跟帖
21
ljm810010| | 2008-11-14 08:55 | 只看该作者 回帖奖励 |倒序浏览

楼主你早说是用于LED调光,我就不需执着于"精准"啦!

不需很精准,PWM频率也不必一定要120Hz,随便写一个用定时器T0模拟PWM,程序更简洁。

T0_interrupt:
    cpl P0.0
    dec PWM
    mov TH0,PWM
    jnb P0.0,Rtn
    xrl TH0,#255
Rtn:reti    


Main:
    ;
    ;
    ;
    mov  PWM,#0
    setb ET0
    setb EA
    setb TR0
    ;
    ;
    ;

T0工作于方式0,PWM是记录脉宽的静态变量,脉宽从256/257递减到1/257,不断循环,24MHz CLK时PWM频率约为255Hz左右。由于中断处理只需5条指令,所以MCU有绝大部分时间做其它事。但由于中断响应时间的参差,会导致PWM周期和脉宽有一两个us的误差。

使用特权

评论回复
22
lyjian| | 2008-11-14 09:01 | 只看该作者

定时中断又不是做不到256级

不过12楼说的“CPU 使用 < 0.5%”不知道是怎么算出来的。
************************
整明白了。

使用特权

评论回复
23
lyjian| | 2008-11-14 11:09 | 只看该作者

按21楼的程序

占空比变化为0%~254/256(PWM初始为低时), step=2/256。
或占空比变化为1/256%~255/256(PWM初始为高时), step=2/256。

使用特权

评论回复
24
ljm810010| | 2008-11-14 11:16 | 只看该作者

哦,看到了,你真仔细

改了一下:
T0_interrupt:
    cpl P0.0
    mov TH0,PWM
    jnb P0.0,Rtn
    dec PWM
    xrl TH0,#255
Rtn:reti    

使用特权

评论回复
25
dengm| | 2008-11-14 20:53 | 只看该作者

RE: 精确

   ORG 000BH
     MOV A_BAK1, TL0  
     JNB A_BAK1.0, L20
       AJMP L21
;-----------------------------       
;.............
;.............
;------------------
L20:
     SETB A_BAK1.0
L21: 
     XCH A, A_BAK1
     XRL A, #00001111B
     RR A  ; * 1/2
     JZ L21
       DJNZ ACC, $
L21:
   ;----------------------
      MOV TH0, TH0_2
      MOV TL0, TL0_2
      MOV A, A_BAK1
      ACALL INT_RET
      
      PUSH PSW
      MOV A_BAK2, A
       ;.....
       ;.....
      MOV TH0_2, A
       ;.....
       ;..... 
      MOV TL0_2, A
      MOV A, A_BAK2        
      POP PSW
      RET

INT_RET:
       RETI

使用特权

评论回复
26
ljm810010| | 2008-11-14 22:22 | 只看该作者

楼上兄弟的应该是一种修正方法,可否简单叙述一下原理?

使用特权

评论回复
27
5880527| | 2008-11-15 20:09 | 只看该作者

好象是读出中断时的TL0当前值

然后根据不同值消耗掉不同的时间,计算有些复杂.我有个很简单的方法,能完全消除中断响应的不一致,过两天贴上来

使用特权

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

本版积分规则