你好,我想知道msp430f149的TimerA 用来产生PWM,CCR0定周期,CCR1和CCR2定D,如果在PWM的产生过程中,CCR1和CCR2是时刻根据AD才到的值变化的,PWM会不会出现问题? 我在另一个地方有个帖子www.ourdev.cn/…/bbs_content.jsp
这个问题困扰我很久了, 求助~
Fuchong Wang:
我使用过富士通的MB95200/300系列的8位单片机,这个系列的单片机的定时器里的比较器含临时存储锁存器,好像在比较器有比较结果的时候比较器才调入数据寄存器的数据,这样应该不存在楼主的问题了
我也关心这类类似的问题,只是现在没时间没情绪专注还有点急躁,脑袋可能也不是那么灵光吧,总是疑问多
不知道msp430的比较器是不是也是这样的
秋之初:
Hi Lawson:
你可以将问题一分为二,先确定PWM占空比按一定规律调节的程序正常工作,再将ADC的值送到调节占空比的变量中。来确定问题根源~
Fuchong Wang:
回复 Charles Wu:
请问Charles Wu:用计数器的中断还是用CCR的中断好呢?差一个计数时钟
这种设置在脉宽为零或者为1的时候要不要考虑呢?如果新附给的CCRX值为零,会有什么情况么?
Charles Wu:
回复 Fuchong Wang:
我个人会选择CCR0的中断,原因倒不是差一个时钟周期,而是CCR0的中断处理不需要通过TAIV判断中断向量,执行时间更短。而CCRx为0的情况当然还是要考虑,具体怎么写这段冗余代码,还是要根据实际应用的情况,比如MCLK的频率,Timer Clock频率以及PWM输出的占空比范围等。
Lawson lan1:
回复 Charles Wu:
你好,Charles 程序我是改过来了,将原来的中断处理放在了主函数中, 问题也暂时解决了。但我不知道 你说的时间冲突是什么概念。 是系统在处理AD中断的时候来了 TimerA的中断?
后来,我在这次修改的基础上,在主函数中增加了些代码, 发现,同样的问题又出现了。 你能否具体讲下你所说的时间冲突是什么意思。
谢谢!
Charles Wu:
回复 Lawson lan1:
个人语言组织能力不太好,之前的解释的不是很清楚。
其实说到底,冲突是程序对CCRx数值的修改和TAR计数之间产生的冲突。举一个例子,假设CCR0为1000,CCRx为500,PWM为set/reset模式,则在TAR计数在400和500之间时,将CCRx的数值改为400,因TAR已经大于400了,则在这个Timer的周期内,PWM输出就会全是高电平。
之前说Timer和AD冲突,是因为你在ADC的中断处理函数中来修改CCRx,而不考虑当时TAR具体的数值,就会发生你所遇到的错误。
Charles Wu:
回复 Charles Wu:
所以建议你将对CCRx的修改放在TACCR0的中断处理函数中,此时TAR数值为CCR0。但若这样还是会出现这种情况,就需要考虑是否是CCRx设置的数值太小,毕竟中断处理函数也不能做到完全实时,若Timer的Clock较快,还是有可能会发生上述的情况。
Lawson lan1:
回复 Charles Wu:
明白~ 谢谢!