huangxiaolpbany 发表于 2021-5-17 23:58:19

请教:使用ATMEG128生成正交脉冲,如何保证A一直超前B90度?

需求:使用AVR生成正交脉冲,脉冲频率变化。
思路:1、A脉冲由定时器1生成,B脉冲由定时器3生成。定时器1和定时器3工作在CTC模式下。
         2、频率变化时,计算出定时器1的TCCR1B和OCR1A,如果计算出的OCR1A或者TCCR1B和上一次有变化,则开启定时器1的匹配中断A;TIMSK|=BIT(4)
         3、开启定时器1的匹配中断A,在中断程序中运行以下指令:
      TIMSK&=~BIT(4);
      TCNT1=ocr1atemp>>1;
      TCCR1A=tccr1atemp;
      TCCR1B=tccr1btemp;
      OCR1A=ocr1atemp;
      
      TCNT3=0;
      TCCR3A=tccr1atemp;
      TCCR3B=tccr1btemp;
      OCR3A=ocr1atemp;

      先关闭中断;
      将定时器1的TCNT1设置为计算出的OCR1A的一半,定时器3的TCNT3设置为0,然后定时器1和定时器3的OCR1A和OCR3A相同。
        此时定时器1将会先遭遇匹配中断,自动改变输出引脚电平;定时器3后遭遇匹配中断,自动改变电平;


问题:按以上方式,发现频率变化时有时候A超前B,有时候B超前A,但我需要A一直超前B,请教解决方法。

总结:需要A一直超前B,请教解决方法。

qtechzdh 发表于 2021-5-18 03:35:55

只需要一个定时器,4倍于信号频率,在AB信号的4个边沿都有中断控制。

huangxiaolpbany 发表于 2021-5-18 06:31:24

qtechzdh 发表于 2021-5-18 03:35
只需要一个定时器,4倍于信号频率,在AB信号的4个边沿都有中断控制。

我也这样想过,这个单片机还有其他工作,想找个不怎么占用资源的方法,确实不行也只能这么做,不过还得测试看下情况,谢谢。

tomzbj 发表于 2021-5-18 10:38:29

huangxiaolpbany 发表于 2021-5-18 06:31
我也这样想过,这个单片机还有其他工作,想找个不怎么占用资源的方法,确实不行也只能这么做,不过还得测 ...

外加一片74HC74呗...

takashiki 发表于 2021-5-18 10:56:30

不要工作在CTC模式下嘛,一个工作在快速PWM模式下,另一个工作在相位修正 PWM 模式,同时启动,选择合适的匹配值正好是正交的,并且能够保证相位。

huangxiaolpbany 发表于 2021-5-18 11:09:11

在车上想了下,画了个图。
最上面是正常模式,

第二是定时器1匹配中断中判断是上升沿处理,
第三种定时器1匹配中断中判断是下降沿处理,但结果一样,一旦在定时器1匹配中断后会造成脉冲b超前A。

第四是定时器1匹配中断中判断是上升沿处理,但首先将定时器3控制的脉冲b强制为高电平,
第五种定时器1匹配中断中判断是下降沿处理,
但首先将定时器3控制的脉冲b强制为低电平
结果看来是可以的。

实际是不是可行,要试下才知道。

huangxiaolpbany 发表于 2021-5-18 11:10:13

takashiki 发表于 2021-5-18 10:56
不要工作在CTC模式下嘛,一个工作在快速PWM模式下,另一个工作在相位修正 PWM 模式,同时启动,选择合适的 ...

谢谢,我也是猜相位修正应该可行,但没想明白,准备按您的说法再试试,谢谢

huangxiaolpbany 发表于 2021-5-18 21:29:41

找出解决办法了,进T1中断后,判断PB5和PE3状态,如果为高,就是要TCCR1C的强制指令,将AB脉冲均设置为0,然后重新设定计时器就可以了。

hpdell 发表于 2021-9-14 11:16:36

huangxiaolpbany 发表于 2021-5-18 21:29
找出解决办法了,进T1中断后,判断PB5和PE3状态,如果为高,就是要TCCR1C的强制指令,将AB脉冲均设置为0, ...

貌似你们研究的比较透彻哟,
页: [1]
查看完整版本: 请教:使用ATMEG128生成正交脉冲,如何保证A一直超前B90度?