SPWM输出滤波正弦波
大家可以看看我的头像,我用2812内固有的数据产生正弦波,但是怎么调整都有一个很大的刺,大家有没有遇到过这种情况呀 初来乍到先自己顶一下吧 正弦表中有溢出数据,就是UINT16的数据最高位不能为1,不然编译器会认为是负数。 usbfish 发表于 2012-11-27 19:05 static/image/common/back.gif正弦表中有溢出数据,就是UINT16的数据最高位不能为1,不然编译器会认为是负数。 ...
都是Uint16型了,最高位不可以是1吗?,而且我设置了(T1PR,0)的范围,不会溢出呀 ddaiss 发表于 2012-11-27 18:59 static/image/common/back.gif
加进位、减借位时,较高位跳变形成的毛刺。
最简单的办法是高频滤波,缓解一下。
最好锁存处理,不论大小跳变,均待跳变稳定后,再开放新的输出。
有个什么过零点的问题你这是单极性的 似乎有这个问题
用双极性spwm好点吧 你的正弦表是Q格式的么?怎么分的?0~2pi的范围还是0~pi/2的范围呢? 同意6楼,上次我一个同学也遇到过这样的问题。上次我们也是用滤波来解决的。示波器在采集信号的时候,有是否加滤波的设置,你可以直接用示波器验证一下,看加上滤波行不行。。 usbfish 发表于 2012-11-27 21:48 static/image/common/back.gif
你的正弦表是Q格式的么?怎么分的?0~2pi的范围还是0~pi/2的范围呢?
上部分代码给大家看看,我用的芯片内固有的正弦数据,我查看过EvaRegs.CMPR1中的所有数值,没有溢出的呀
#pragma DATA_SECTION(sine_table,"IQmathTables");
_iq30 sine_table;
EvaRegs.CMPR1 =_IQsat(_IQ30mpy(sine_table + _IQ30(0.9999),EvaRegs.T1PR/2),EvaRegs.T1PR,0);
JQ_Lin 发表于 2012-11-27 20:34 static/image/common/back.gif
加进位、减借位时,较高位跳变形成的毛刺。
最简单的办法是高频滤波,缓解一下。
最好锁存处理,不论大小 ...
这个讲的有点深,我初学,能否讲的更详细一些,高频滤波怎么处理呀 gongxd 发表于 2012-11-27 21:32 static/image/common/back.gif
有个什么过零点的问题你这是单极性的 似乎有这个问题
用双极性spwm好点吧 ...
这个跟单双极性没什么关系吧 shi562142022 发表于 2012-11-27 21:57 static/image/common/back.gif
同意6楼,上次我一个同学也遇到过这样的问题。上次我们也是用滤波来解决的。示波器在采集信号的时候,有是 ...
其实如果不看正弦波只看SPWM输出的话,可以看到一个明显的错误,占空比突然变小了 在CCS里面,上电跟踪检查一下正弦波峰值点的计算输出有没有错误。
即Siin=1或-1时的计算输出,楼主仔细检查一遍,一定要上电调试查看。 usbfish 发表于 2012-11-28 08:55 static/image/common/back.gif
在CCS里面,上电跟踪检查一下正弦波峰值点的计算输出有没有错误。
即Siin=1或-1时的计算输出,楼主仔细检查 ...
额。。。没有问题的,这个我把所有数值保存在buffer中,更有趣的是,如果我改变_IQ30(0.9999)这个值,比如改为0.999999这时会出现两个特别大的毛刺 JQ_Lin 发表于 2012-11-27 20:34 static/image/common/back.gif
加进位、减借位时,较高位跳变形成的毛刺。
最简单的办法是高频滤波,缓解一下。
最好锁存处理,不论大小 ...
我这个只是想产生SPWM波,然后非常简单的接了个电阻和电容,用示波器来查看,如果放大观察,会发现,SPWM在毛刺位置占空比突然表小或变大,但是我查看了一下CMP数据,并没有突变的情况,所以到论坛里问问 顶一下, ddaiss 发表于 2012-11-28 20:50 static/image/common/back.gif
顶一下,
没有找到记忆中的帖子,但找到了我曾回复过的仿真截图。
供参考。
原图仿真结果
正弦波上的跳变尖峰.png
R-C滤波消除尖峰
消除正弦波上的跳变尖峰-1.png
JQ_Lin 发表于 2012-11-28 23:58 static/image/common/back.gif
没有找到记忆中的帖子,但找到了我曾回复过的仿真截图。
供参考。
这是什么仿真软件?
如果真用高通滤波的话,是使用FIR吗?
最后是我这个波形每个周期有一个大的毛刺,不是很多 用的是 Proteus 。
点击图片看清晰大图,图中有文字说明。
我仅在三路输出放大器上加入了R-C。
这个 我也遇到过不过是正弦表的问题,比如12BIT 最大是4095 而不是4096 本帖最后由 ddaiss 于 2012-11-29 12:08 编辑
xivisi 发表于 2012-11-29 11:24 static/image/common/back.gif
这个 我也遇到过不过是正弦表的问题,比如12BIT 最大是4095 而不是4096_IQ30mpy(sine_table + _IQ30(0.9999),EvaRegs.T1PR/2)敢问我这一步的运算对吗,我有点怀疑自己的这一步运算,_IQ30mpy可以这么用吗,还是应该是哟个_IQ30mpyI32int呢
毕竟EvaRegs.T1PR/2是一个16位的
针对您的回答,我想问一下您说的“比如12BIT 最大是4095 而不是4096”如何应用到我的问题上来呢,没想明白,求详解 JQ_Lin 发表于 2012-11-29 11:21 static/image/common/back.gif
用的是 Proteus 。
点击图片看清晰大图,图中有文字说明。
这么说你用的是DA喽? ddaiss 发表于 2012-11-29 11:37 static/image/common/back.gif
这么说你用的是DA喽?
不是我。是原帖作者。
用4040对脉冲计数产生eprom的地址,从eprom取出波形数据送DAC0832进行DA转化,输出正弦波,调理后作为标准3相正弦信号。此信号的幅度需要受输出电压控制--》改变spwm--》调整输出电压。
“现在仿真3相sin的波形干扰。用什么滤波器去除?模电基础太差。”——原作者把这种必然出现的尖峰称作“干扰”了。
JQ_Lin 发表于 2012-11-29 12:07 static/image/common/back.gif
不是我。是原帖作者。
用4040对脉冲计数产生eprom的地址,从eprom取出波形数据送DAC0832进行DA转化,输出 ...
哦,我也要看看如何用滤波器了,至今还没用过。
那你说的用了滤波器以后有缓冲效果是什么意思 本帖最后由 JQ_Lin 于 2012-11-29 12:55 编辑
ddaiss 发表于 2012-11-29 12:10 static/image/common/back.gif
哦,我也要看看如何用滤波器了,至今还没用过。
那你说的用了滤波器以后有缓冲效果是什么意思 ...
我在6楼说的第一个办法是“高频滤波,缓解一下。”
在输出缓冲放大器上用R-C滤波,可以缓解跳变尖峰。 是“缓解”。
第二个办法是“锁存处理”。
如果你用的也是DAC,就充分利用它的功能吧。把 ILE 用起来,时钟接到 ILE 脚。
JQ_Lin 发表于 2012-11-29 12:13 static/image/common/back.gif
我在6楼说的第一个办法是“高频滤波,缓解一下。”
在输出缓冲放大器上用R-C滤波,可以缓解跳变尖峰。 是 ...
哦,知道了,多谢你
我还是继续研究一下吧,我们俩用的方法好像不太一样 呼叫@xivisi xivisi 发表于 2012-11-29 11:24 static/image/common/back.gif
这个 我也遇到过不过是正弦表的问题,比如12BIT 最大是4095 而不是4096
我觉得可能你遇到的跟我类似,求详解 ddaiss 发表于 2012-11-30 08:14 static/image/common/back.gif
我觉得可能你遇到的跟我类似,求详解
不好意思,刚看到,我用的是MCU,DAC是12BIT,单极性,超出12bit的高bit忽略,所以出现在波峰有一个突然地向下尖峰
从你的图来看,像是用符号数小得越界被认作一个较大的值,最好检查正弦表的数值是否在寄存器允许的数值 xivisi 发表于 2012-11-30 08:51 static/image/common/back.gif
不好意思,刚看到,我用的是MCU,DAC是12BIT,单极性,超出12bit的高bit忽略,所以出现在波峰有一个突然 ...
哦,这样呀,我有点质疑我的IQ乘法运算了 usbfish 发表于 2012-11-28 08:55 static/image/common/back.gif
在CCS里面,上电跟踪检查一下正弦波峰值点的计算输出有没有错误。
即Siin=1或-1时的计算输出,楼主仔细检查 ...
朋友问一下你哦,_IQ30mpy(sine_table + _IQ30(0.9999),EvaRegs.T1PR/2),这句话有没有问题呀,sine_table + _IQ30(0.9999)是一个IQ格式的数,而EvaRegs.T1PR/2是一个16位数,他们可以这么直接相乘吗 ddaiss 发表于 2012-11-30 10:14 static/image/common/back.gif
朋友问一下你哦,_IQ30mpy(sine_table + _IQ30(0.9999),EvaRegs.T1PR/2),这句话有没有问题呀,sine_tabl ...
可以是可以,但是你将一个Q30格式的数据和一个Q0格式的数据相乘,结果还是Q30,不知道你后面使用的时候有没有处理,不然肯定溢出,这就是我说的原因,因为我以前和你遇到过一模一样的现象。 usbfish 发表于 2012-11-30 12:06 static/image/common/back.gif
可以是可以,但是你将一个Q30格式的数据和一个Q0格式的数据相乘,结果还是Q30,不知道你后面使用的时候有 ...
_IQ30mpy的参数应当是两个Q30的数据,最后得到的也是Q30格式的数据,你的第二个参量不是Q30,而是Q0。
因此有两种处理方法,一是将输入的第二个参数也转化为Q30的数据,二是将所得的结果左移30位,或者乘以2的30次方。 这波形应该溢出了
usbfish 发表于 2012-11-30 12:11 static/image/common/back.gif
_IQ30mpy的参数应当是两个Q30的数据,最后得到的也是Q30格式的数据,你的第二个参量不是Q30,而是Q0。
因 ...
恩,正解,我在后后面没有任何处理,不过Q30格式与Q0格式相乘,由于第二个参数比较大,不能转化为Q30格式的 chengtina 发表于 2012-11-30 12:15 static/image/common/back.gif
这波形应该溢出了
恩,好象是这个问题,我还在想怎么解决 usbfish 发表于 2012-11-30 12:11 static/image/common/back.gif
_IQ30mpy的参数应当是两个Q30的数据,最后得到的也是Q30格式的数据,你的第二个参量不是Q30,而是Q0。
因 ...
由于两者的乘积会超过32位,请问这种情况该如何处理呀 ddaiss 发表于 2012-11-30 15:10 static/image/common/back.gif
由于两者的乘积会超过32位,请问这种情况该如何处理呀
Q15格式就可以了 usbfish 发表于 2012-11-30 16:28 static/image/common/back.gif
Q15格式就可以了
我是初学,还是有点不太懂
你的意思是把IQ30精度的sin值改为IQ15吗? ddaiss 发表于 2012-11-30 16:37 static/image/common/back.gif
我是初学,还是有点不太懂
你的意思是把IQ30精度的sin值改为IQ15吗?
对,Q15就是把数据乘以2的15次方,即乘以32768,一般来说足够满足你的精度需求了。
但是需要注意,1.0的Q15等于0x8000,最高位为1,如果被认为是有符号数,那么就是负数,会溢出,需要小心。-1同理。 usbfish 发表于 2012-11-30 17:45 static/image/common/back.gif
对,Q15就是把数据乘以2的15次方,即乘以32768,一般来说足够满足你的精度需求了。
但是需要注意,1.0的Q ...
把它改为32位数据是不是就可以避免了?
可以看我头像 svpwm 哈哈
andy9909 发表于 2012-12-11 13:14 static/image/common/back.gif
可以看我头像 svpwm 哈哈
楼主是正弦波,跟你这个没什么关系吧 waver 发表于 2013-1-4 19:15 static/image/common/back.gif
楼主是正弦波,跟你这个没什么关系吧
碰巧开个玩笑 顶一下,lz的问题解决的怎么样了 Q30格式的数据和一个Q0格式的数据相乘,结果还是Q30,计算结果将会溢出(数太大没法用Q30表示)
你的 “04.EvaRegs.CMPR1 =_IQsat(_IQ30mpy(sine_table + _IQ30(0.9999),EvaRegs.T1PR/2),EvaRegs.T1PR,0);“ 明显数据格式不匹配, 当然编译器会自行进行转化,但结果很可能就出错了 __IQsat(A,long P, long N) //IQ数值的限幅函数,把A限制在 之间 {:smile:}{:smile:}{:smile:}
页:
[1]