你好,我想知道msp430f149的TimerA 用来产生PWM,CCR0定周期,CCR1和CCR2定D,如果在PWM的产生过程中,CCR1和CCR2是时刻根据AD才到的值变化的,PWM会不会出现问题? 我在另一个地方有个帖子www.ourdev.cn/.../bbs_content.jsp
这个问题困扰我很久了, 求助~
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.
你好,我想知道msp430f149的TimerA 用来产生PWM,CCR0定周期,CCR1和CCR2定D,如果在PWM的产生过程中,CCR1和CCR2是时刻根据AD才到的值变化的,PWM会不会出现问题? 我在另一个地方有个帖子www.ourdev.cn/.../bbs_content.jsp
这个问题困扰我很久了, 求助~
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较快,还是有可能会发生上述的情况。