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

[复制链接]
7463|26
ljm810010 发表于 2008-11-14 08:55 | 显示全部楼层

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

不需很精准,PWM频率也不必一定要120Hz,随便写一个用定时器T0模拟PWM,程序更简洁。<br /><br />T0_interrupt:<br />&nbsp;&nbsp;&nbsp;&nbsp;cpl&nbsp;P0.0<br />&nbsp;&nbsp;&nbsp;&nbsp;dec&nbsp;PWM<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;TH0,PWM<br />&nbsp;&nbsp;&nbsp;&nbsp;jnb&nbsp;P0.0,Rtn<br />&nbsp;&nbsp;&nbsp;&nbsp;xrl&nbsp;TH0,#255<br />Rtn:reti&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />Main:<br />&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;PWM,#0<br />&nbsp;&nbsp;&nbsp;&nbsp;setb&nbsp;ET0<br />&nbsp;&nbsp;&nbsp;&nbsp;setb&nbsp;EA<br />&nbsp;&nbsp;&nbsp;&nbsp;setb&nbsp;TR0<br />&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;;<br /><br />T0工作于方式0,PWM是记录脉宽的静态变量,脉宽从256/257递减到1/257,不断循环,24MHz&nbsp;CLK时PWM频率约为255Hz左右。由于中断处理只需5条指令,所以MCU有绝大部分时间做其它事。但由于中断响应时间的参差,会导致PWM周期和脉宽有一两个us的误差。
lyjian 发表于 2008-11-14 09:01 | 显示全部楼层

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

不过12楼说的“CPU&nbsp;使用&nbsp;&lt&nbsp;0.5%”不知道是怎么算出来的。<br />************************<br />整明白了。
lyjian 发表于 2008-11-14 11:09 | 显示全部楼层

按21楼的程序

占空比变化为0%~254/256(PWM初始为低时),&nbsp;step=2/256。<br />或占空比变化为1/256%~255/256(PWM初始为高时),&nbsp;step=2/256。
ljm810010 发表于 2008-11-14 11:16 | 显示全部楼层

哦,看到了,你真仔细

改了一下:<br />T0_interrupt:<br />&nbsp;&nbsp;&nbsp;&nbsp;cpl&nbsp;P0.0<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;TH0,PWM<br />&nbsp;&nbsp;&nbsp;&nbsp;jnb&nbsp;P0.0,Rtn<br />&nbsp;&nbsp;&nbsp;&nbsp;dec&nbsp;PWM<br />&nbsp;&nbsp;&nbsp;&nbsp;xrl&nbsp;TH0,#255<br />Rtn:reti&nbsp;&nbsp;&nbsp;&nbsp;
dengm 发表于 2008-11-14 20:53 | 显示全部楼层

RE: 精确

&nbsp;&nbsp;&nbsp;ORG&nbsp;000BH<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A_BAK1,&nbsp;TL0&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JNB&nbsp;A_BAK1.0,&nbsp;L20<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AJMP&nbsp;L21<br />;-----------------------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />;.............<br />;.............<br />;------------------<br />L20:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;A_BAK1.0<br />L21:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XCH&nbsp;A,&nbsp;A_BAK1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XRL&nbsp;A,&nbsp;#00001111B<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RR&nbsp;A&nbsp;&nbsp;;&nbsp;*&nbsp;1/2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JZ&nbsp;L21<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ&nbsp;ACC,&nbsp;$<br />L21:<br />&nbsp;&nbsp;&nbsp;;----------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;TH0,&nbsp;TH0_2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;TL0,&nbsp;TL0_2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A,&nbsp;A_BAK1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;INT_RET<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUSH&nbsp;PSW<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A_BAK2,&nbsp;A<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;.....<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;.....<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;TH0_2,&nbsp;A<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;.....<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;.....&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;TL0_2,&nbsp;A<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A,&nbsp;A_BAK2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POP&nbsp;PSW<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RET<br /><br />INT_RET:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETI<br />
ljm810010 发表于 2008-11-14 22:22 | 显示全部楼层

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

  
5880527 发表于 2008-11-15 20:09 | 显示全部楼层

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

然后根据不同值消耗掉不同的时间,计算有些复杂.我有个很简单的方法,能完全消除中断响应的不一致,过两天贴上来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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