有谁做过3路PWM输出--------同时中断产生的困扰
我现在在用atmega16(mega8也可以)产生三路频率和振幅相同的余弦波,且此3路的余弦波要求相互之间的相位差可调.单片机的T/C1,T/C2全部投入使用,选用快速PWM模式,计数器的TOP值选择固定的8位.程序的设计思路很简单,在此就不多废话:就是当计数器计数值和OCR1A(OCR1B/OCR2)比较匹配时发生中断.
问题来了:
1.当OCR1A(OCR1B/OCR2)三者的值相等或者非常接近时,三个比较匹配中断几乎同时发生.此时就有先后处理的问题,程序第一时间仅能处理其中的一个,其结果就会使另外两个中断处理得不及时,从而导致另外两个相应的匹配寄存器得不到及时的更新,换句话说,可能丢失了>=1次以上的匹配.
例如,我的本意是让三路输出相位差为0的余弦波,结果却不是这样,如附件中的图1,产生了相位差.且波形也稍稍的被干扰.图2是相互相位差要求为120度,但是还是因为有同时中断的存在,所以还是有偏差.而且随着时间的推移,这样产生的误差是越来越大.
2.所以请教高手帮忙解决,欢迎提建议. 点击此处下载armok01159521.rar 1。当3个中断同时产生,CPU当然只能一个一个的处理,所以误差不能消除。只能采用提高系统的时钟频率(会影响PWM的频率)和采用汇编尽量减少中断服务程序的执行时间来减少误差。
2。如果相位的改变是同时的,可以考虑只使用一个中断,在中断中将3个PWM的输出同时改变。
页:
[1]