This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430 TimerA的 PWM问题

Other Parts Discussed in Thread: MSP430F149

你好,我想知道msp430f149的TimerA 用来产生PWM,CCR0定周期,CCR1和CCR2定D,如果在PWM的产生过程中,CCR1和CCR2是时刻根据AD才到的值变化的,PWM会不会出现问题?  我在另一个地方有个帖子www.ourdev.cn/.../bbs_content.jsp

这个问题困扰我很久了, 求助~

  • 我使用过富士通的MB95200/300系列的8位单片机,这个系列的单片机的定时器里的比较器含临时存储锁存器,好像在比较器有比较结果的时候比较器才调入数据寄存器的数据,这样应该不存在楼主的问题了

    我也关心这类类似的问题,只是现在没时间没情绪专注还有点急躁,脑袋可能也不是那么灵光吧,总是疑问多

    不知道msp430的比较器是不是也是这样的

  • Hi Lawson:

    你可以将问题一分为二,先确定PWM占空比按一定规律调节的程序正常工作,再将ADC的值送到调节占空比的变量中。来确定问题根源~

  • 这是一个很典型的AD和Timer两个时间冲突造成的问题。建议你这样处理数据,AD的数据处理在主程序中进行,计算成需要设CCR1和CCR2的数值。而对CCR1和CCR2数据的更新,放在CCR0的中断处理函数,切尽量让CCR0的中断处理函数执行最短的时间。

  • 请问Charles Wu:用计数器的中断还是用CCR的中断好呢?差一个计数时钟

    这种设置在脉宽为零或者为1的时候要不要考虑呢?如果新附给的CCRX值为零,会有什么情况么?

  • 我个人会选择CCR0的中断,原因倒不是差一个时钟周期,而是CCR0的中断处理不需要通过TAIV判断中断向量,执行时间更短。而CCRx为0的情况当然还是要考虑,具体怎么写这段冗余代码,还是要根据实际应用的情况,比如MCLK的频率,Timer Clock频率以及PWM输出的占空比范围等。

  • 谢谢  Charles WU  ,  我按你的建议,这个问题给解决了。谢谢~~

  • 你好,Charles     程序我是改过来了,将原来的中断处理放在了主函数中,  问题也暂时解决了。但我不知道 你说的时间冲突是什么概念。  是系统在处理AD中断的时候来了 TimerA的中断?  

    后来,我在这次修改的基础上,在主函数中增加了些代码, 发现,同样的问题又出现了。 你能否具体讲下你所说的时间冲突是什么意思。

    谢谢!

  • 个人语言组织能力不太好,之前的解释的不是很清楚。

    其实说到底,冲突是程序对CCRx数值的修改和TAR计数之间产生的冲突。举一个例子,假设CCR0为1000,CCRx为500,PWM为set/reset模式,则在TAR计数在400和500之间时,将CCRx的数值改为400,因TAR已经大于400了,则在这个Timer的周期内,PWM输出就会全是高电平。

    之前说Timer和AD冲突,是因为你在ADC的中断处理函数中来修改CCRx,而不考虑当时TAR具体的数值,就会发生你所遇到的错误。

  • 所以建议你将对CCRx的修改放在TACCR0的中断处理函数中,此时TAR数值为CCR0。但若这样还是会出现这种情况,就需要考虑是否是CCRx设置的数值太小,毕竟中断处理函数也不能做到完全实时,若Timer的Clock较快,还是有可能会发生上述的情况。

  • 明白~    谢谢!