打印

还是**那句话:实事求是

[复制链接]
楼主: icmap
手机看帖
扫描二维码
随时随地手机跟帖
41
5880527| | 2008-11-19 12:22 | 只看该作者 回帖奖励 |倒序浏览

40楼

呵呵,以前我也这样认为,刚才又研究了一下这个消除响应的程序,其实是有办法的。
PWM的频率不会很高,就算8位的也有256个机器周期,也就是高电平和低电平加起来是256个周期。比如你要用13楼那程序发出一个1机器周期高电平255周期低电平的PWM,那你只需要做一个256周期就中断的定时器,在中断修正过后你先SETB P0.0,然后再CLR P0.0,这样该可以了吧,这里究竟是一个机器周期还是两周期我都糊涂了,反正实现了最小宽度脉冲。所以那程序可以做到比硬件PWM更灵活,而精度与其完全一样
其实这个方法我都觉得有点太钻牛角尖了,很多时候没必要精度这么高的

使用特权

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

楼上,我说的脉宽不是固定的,是可变的。

使用特权

评论回复
43
5880527| | 2008-11-19 12:34 | 只看该作者

呵呵,也可以啊

你在执行完输出后定时器中断里还有很多时间可以用来计算下一次PWM的定时器值,计算好以后你放到那程序里的T0H,T0L里,下次一进来就可以直接赋给TH0,TL0了

使用特权

评论回复
44
5880527| | 2008-11-19 12:35 | 只看该作者

你甚至可以输出每一周期都可以精确控制的脉冲

当然这个感觉就象绣花一样的精细了

使用特权

评论回复
45
mcu5i51| | 2008-11-19 12:41 | 只看该作者

13楼的代码不可能保证精确,只要是中断中直接赋值Txx的都不

使用特权

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

5880527不妨试试

编一个 PWM周期为1000,脉宽从1递增到1000的程序,就能说明问题所在。

使用特权

评论回复
47
5880527| | 2008-11-19 12:46 | 只看该作者

46楼

看来这个程序还真不是一下子就能理解的哈,你再仔细研究一下试试,我说其精度高于自动重装你信不信

使用特权

评论回复
48
5880527| | 2008-11-19 12:53 | 只看该作者

47楼的意思我理解了

这中间有个量变到质变的过程,在几十个机器周期的时候需要改变输出方式了,即每一次中断只能切换一次电平,再也不能发出一完整脉冲,所以需要很仔细或说小心的再修改程序,但我觉得只要有耐心去钻研,方法是肯定有的。
那普通硬件PWM还不能进行很低频率的PWM呢,大于65535就没辙了,而我那个可以无穷大,呵呵,有点蛮不讲理了哈。其实我觉得普通PWM无法对脉冲个数进行计数,而上面那程序可以做到

使用特权

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

5880527兄可能误解了

现在和你讨论的不是精准问题,你的程序精准是毋用置疑,现在是说处理速度问题,我说说你中断程序没法处理十个周期以下的PWM窄脉冲,就是说THx,TLx重后,还没来得及退出中断,定时器又溢出了。

使用特权

评论回复
50
5880527| | 2008-11-19 12:59 | 只看该作者

呵呵,说实在的,我平时也没太用过PWM

即使用到都没这么苛刻。那程序唯一的缺陷是浪费了二十来个机器周期,ljm810010说的会还没来得及处理下一次中断又来了就是这个意思

使用特权

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

呵呵,正是此意

这个问题是不能消除,只能尽量做到最好,也就是尽量减少中断处理时间。其实36楼呆板书生的方法也不错,只是没有考虑周全,稍为改动下即可,且不需占用DPTR。

另:楼主icmap似乎有妙计,期待中。。。

使用特权

评论回复
52
dengm| | 2008-11-19 19:05 | 只看该作者

RE: 精确

      ORG 000BH
        MOV TLB, TL0
        JB TLB.1, SUB_T0
           SJMP SUB_T0
;-------------------------------
;-----------------------
SUB_TO:
      JB TLB.0, L_10
        NOP
L_10:
      JB TLB.3, L_20
        NOP
        NOP
        JB TLB.2, L_20
          NOP
          NOP
          NOP
          NOP
L_20:
;--------------------------------
        MOV TH0, TH0_B
        MOV TL0, TL0_B
        CPL P1.1

;---------------------------


;---------------------------
        RETI
   

使用特权

评论回复
53
ayb_ice| | 2008-11-19 20:34 | 只看该作者

关中断

在重新装载初值前关中断,再考虑指令时间,调整重装载值,可以做到理论上没有误差。。。

使用特权

评论回复
54
icmap|  楼主 | 2008-11-19 21:56 | 只看该作者

都是 51 单片机定时器惹的祸

51 单片机的软件重装让人不得不考虑指令的执行时间,结果是代码的通用性不好。如果 51 定时器有 PCA 那样的比较功能,就不用这么麻烦了。

使用特权

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

好象真正看明白那程序的人不多

53楼的程序功能一样,占的资源更少,更加实用了

使用特权

评论回复
56
ljm810010| | 2008-11-20 10:14 | 只看该作者

你们程序的共同缺点就是中断处理时间太长

唯独36楼呆板书生的方法可能处理速度会快点,中断处理速度是一个重要的性能指标,速度快,在PWM中输出的脉宽就可以更小。

使用特权

评论回复
57
dengm| | 2008-11-24 12:24 | 只看该作者

re: ljm810010

在PWM中输出的脉宽, 不仅要精确定时还要精确输出, 只有 5880527 & 53楼的
asm 才能精确输出

使用特权

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

re:dengm 你53楼程序确实能精准输出

对于精准定时,各有各的方法,除你说的“只有 5880527 & 53楼的
asm 才能精确输出”外,我觉得 呆板书生 的方法也不错,而且很简洁。

使用特权

评论回复
59
mikejx| | 2008-11-27 10:47 | 只看该作者

51的T2 16位自动重装模式有累积误差吗?

没有吧? 那楼上各位究竟在想什么呢? 为什么要执着于软件重装呢?

使用特权

评论回复
60
ljm810010| | 2008-11-27 11:55 | 只看该作者

re:mikejx 并不是每个51MCU都有T2

PS:如果12MHz 晶体,要求在口线输出一个1Hz的方波,就算用T2,也避免不了要重装.

使用特权

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

本版积分规则