打印
[AVR单片机]

使用atmega8同时产生三路余弦波

[复制链接]
2647|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Ascarikz1|  楼主 | 2007-6-27 10:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在在用atmega16(mega8也可以)产生三路频率和振幅相同的余弦波,且此3路的余弦波要求相互之间的相位差可调. 

单片机的T/C1,T/C2全部投入使用,选用快速PWM模式,计数器的TOP值选择固定的8位.程序的设计思路很简单,在此就不多废话:就是当计数器计数值和OCR1A(OCR1B/OCR2)比较匹配时发生中断. 

问题来了: 
     1.当OCR1A(OCR1B/OCR2)三者的值相等或者非常接近时,三个比较匹配中断几乎同时发生.此时就有先后处理的问题,程序第一时间仅能处理其中的一个,其结果就会使另外两个中断处理得不及时,从而导致另外两个相应的匹配寄存器得不到及时的更新,换句话说,可能丢失了>=1次以上的匹配. 
     例如,我的本意是让三路输出相位差为0的余弦波,结果却不是这样,如附件中的图1,产生了相位差.且波形也稍稍的被干扰.图2是相互相位差要求为120度,但是还是因为有同时中断的存在,所以还是有偏差.而且随着时间的推移,这样产生的误差是越来越大. 
    2.所以请教高手帮忙解决,欢迎提建议.

相关链接:https://bbs.21ic.com/upfiles/img/20076/2007627103222375.rar

相关帖子

沙发
Ascarikz1|  楼主 | 2007-6-27 10:49 | 只看该作者

1

各位兄弟,可别光来看,发表发表一下意见啊

使用特权

评论回复
板凳
jasonell| | 2007-6-27 11:15 | 只看该作者

看你输出的余玄频率了,这个冲突是避免不了的

就看这个误差你接受不,

使用特权

评论回复
地板
Ascarikz1|  楼主 | 2007-6-27 11:19 | 只看该作者

怎么接受?

误差太大了.
是用来精确控制电机的角度,这样的误差远远不能满足!

使用特权

评论回复
5
maomao40| | 2007-6-27 11:26 | 只看该作者

兄弟,你的软件不错:)

使用特权

评论回复
6
Ascarikz1|  楼主 | 2007-6-27 11:29 | 只看该作者

什么软件不错啊?5楼

使用特权

评论回复
7
zhiwei| | 2007-6-27 12:46 | 只看该作者

这个问题好解决

TCNT1你用做8位,OCR1A和OCR1B是同源,你可以用软件模拟打开T2,给TCNT2赋合适的值使它与T1同步,然后只需取其中一任意一个中断来更新占空比即可。但是如果你用双边PWM模式即相位修正模式,它在Bottom中断,你有1/2Top的时间来计算相位和更新占空比(单边如果匹配值接近TOP则进入中断没有足够的时间在越界进入下一个PWM周期前更新匹配值)。双边PWM滤波后波形效果应该也会好一些,同时由于晶振加大一倍,可以提高系统速度,弥补每PWM周期中断的CPU开销。
建议是使用M48/88系列,它工作频率可以更高,可以达到更多路数。

使用特权

评论回复
8
农民讲习所| | 2007-6-27 17:40 | 只看该作者

最好这里使用汇编

这样最好:先调整好输出数据,中断后马上输出,并允许其它中断嵌套。

char Buff[3] = { 248,248,248 };

SIGNAL(SIG_OUTPUT_COMPARE1A) {
    OCR1A=Buff[0];
         
         sei();
         Buff[0]=cos_table[i++];    
    if( i == sizeof(cos_table) )i=0;
         cli();
}

使用特权

评论回复
9
Ascarikz1|  楼主 | 2007-6-28 09:24 | 只看该作者

多谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

23

帖子

0

粉丝