ddaiss 发表于 2012-11-27 18:48:06

SPWM输出滤波正弦波

大家可以看看我的头像,我用2812内固有的数据产生正弦波,但是怎么调整都有一个很大的刺,大家有没有遇到过这种情况呀

ddaiss 发表于 2012-11-27 18:53:06

初来乍到先自己顶一下吧

ddaiss 发表于 2012-11-27 18:59:43

usbfish 发表于 2012-11-27 19:05:59

正弦表中有溢出数据,就是UINT16的数据最高位不能为1,不然编译器会认为是负数。

ddaiss 发表于 2012-11-27 20:07:35

usbfish 发表于 2012-11-27 19:05 static/image/common/back.gif
正弦表中有溢出数据,就是UINT16的数据最高位不能为1,不然编译器会认为是负数。 ...

都是Uint16型了,最高位不可以是1吗?,而且我设置了(T1PR,0)的范围,不会溢出呀

JQ_Lin 发表于 2012-11-27 20:34:55

ddaiss 发表于 2012-11-27 18:59 static/image/common/back.gif


加进位、减借位时,较高位跳变形成的毛刺。
最简单的办法是高频滤波,缓解一下。
最好锁存处理,不论大小跳变,均待跳变稳定后,再开放新的输出。

gongxd 发表于 2012-11-27 21:32:43

有个什么过零点的问题你这是单极性的 似乎有这个问题

用双极性spwm好点吧

usbfish 发表于 2012-11-27 21:48:27

你的正弦表是Q格式的么?怎么分的?0~2pi的范围还是0~pi/2的范围呢?

shi562142022 发表于 2012-11-27 21:57:33

同意6楼,上次我一个同学也遇到过这样的问题。上次我们也是用滤波来解决的。示波器在采集信号的时候,有是否加滤波的设置,你可以直接用示波器验证一下,看加上滤波行不行。。

ddaiss 发表于 2012-11-28 08:05:43

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);

ddaiss 发表于 2012-11-28 08:07:09

JQ_Lin 发表于 2012-11-27 20:34 static/image/common/back.gif
加进位、减借位时,较高位跳变形成的毛刺。
最简单的办法是高频滤波,缓解一下。
最好锁存处理,不论大小 ...

这个讲的有点深,我初学,能否讲的更详细一些,高频滤波怎么处理呀

ddaiss 发表于 2012-11-28 08:07:33

gongxd 发表于 2012-11-27 21:32 static/image/common/back.gif
有个什么过零点的问题你这是单极性的 似乎有这个问题

用双极性spwm好点吧 ...

这个跟单双极性没什么关系吧

ddaiss 发表于 2012-11-28 08:09:06

shi562142022 发表于 2012-11-27 21:57 static/image/common/back.gif
同意6楼,上次我一个同学也遇到过这样的问题。上次我们也是用滤波来解决的。示波器在采集信号的时候,有是 ...

其实如果不看正弦波只看SPWM输出的话,可以看到一个明显的错误,占空比突然变小了

usbfish 发表于 2012-11-28 08:55:15

在CCS里面,上电跟踪检查一下正弦波峰值点的计算输出有没有错误。
即Siin=1或-1时的计算输出,楼主仔细检查一遍,一定要上电调试查看。

ddaiss 发表于 2012-11-28 09:06:55

usbfish 发表于 2012-11-28 08:55 static/image/common/back.gif
在CCS里面,上电跟踪检查一下正弦波峰值点的计算输出有没有错误。
即Siin=1或-1时的计算输出,楼主仔细检查 ...

额。。。没有问题的,这个我把所有数值保存在buffer中,更有趣的是,如果我改变_IQ30(0.9999)这个值,比如改为0.999999这时会出现两个特别大的毛刺

ddaiss 发表于 2012-11-28 10:32:15

JQ_Lin 发表于 2012-11-27 20:34 static/image/common/back.gif
加进位、减借位时,较高位跳变形成的毛刺。
最简单的办法是高频滤波,缓解一下。
最好锁存处理,不论大小 ...

我这个只是想产生SPWM波,然后非常简单的接了个电阻和电容,用示波器来查看,如果放大观察,会发现,SPWM在毛刺位置占空比突然表小或变大,但是我查看了一下CMP数据,并没有突变的情况,所以到论坛里问问

ddaiss 发表于 2012-11-28 20:50:46

顶一下,

JQ_Lin 发表于 2012-11-28 23:58:34

ddaiss 发表于 2012-11-28 20:50 static/image/common/back.gif
顶一下,

没有找到记忆中的帖子,但找到了我曾回复过的仿真截图。
供参考。

原图仿真结果
正弦波上的跳变尖峰.png


R-C滤波消除尖峰
消除正弦波上的跳变尖峰-1.png


ddaiss 发表于 2012-11-29 09:39:31

JQ_Lin 发表于 2012-11-28 23:58 static/image/common/back.gif
没有找到记忆中的帖子,但找到了我曾回复过的仿真截图。
供参考。



这是什么仿真软件?
如果真用高通滤波的话,是使用FIR吗?
最后是我这个波形每个周期有一个大的毛刺,不是很多

JQ_Lin 发表于 2012-11-29 11:21:36

用的是 Proteus 。

点击图片看清晰大图,图中有文字说明。
我仅在三路输出放大器上加入了R-C。

xivisi 发表于 2012-11-29 11:24:27

这个 我也遇到过不过是正弦表的问题,比如12BIT 最大是4095 而不是4096

ddaiss 发表于 2012-11-29 11:30:22

本帖最后由 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”如何应用到我的问题上来呢,没想明白,求详解

ddaiss 发表于 2012-11-29 11:37:21

JQ_Lin 发表于 2012-11-29 11:21 static/image/common/back.gif
用的是 Proteus 。

点击图片看清晰大图,图中有文字说明。


这么说你用的是DA喽?

JQ_Lin 发表于 2012-11-29 12:07:56

ddaiss 发表于 2012-11-29 11:37 static/image/common/back.gif
这么说你用的是DA喽?

不是我。是原帖作者。
用4040对脉冲计数产生eprom的地址,从eprom取出波形数据送DAC0832进行DA转化,输出正弦波,调理后作为标准3相正弦信号。此信号的幅度需要受输出电压控制--》改变spwm--》调整输出电压。
“现在仿真3相sin的波形干扰。用什么滤波器去除?模电基础太差。”——原作者把这种必然出现的尖峰称作“干扰”了。

ddaiss 发表于 2012-11-29 12:10:14

JQ_Lin 发表于 2012-11-29 12:07 static/image/common/back.gif
不是我。是原帖作者。
用4040对脉冲计数产生eprom的地址,从eprom取出波形数据送DAC0832进行DA转化,输出 ...

哦,我也要看看如何用滤波器了,至今还没用过。
那你说的用了滤波器以后有缓冲效果是什么意思

JQ_Lin 发表于 2012-11-29 12:13:06

本帖最后由 JQ_Lin 于 2012-11-29 12:55 编辑

ddaiss 发表于 2012-11-29 12:10 static/image/common/back.gif
哦,我也要看看如何用滤波器了,至今还没用过。
那你说的用了滤波器以后有缓冲效果是什么意思 ...

我在6楼说的第一个办法是“高频滤波,缓解一下。”
在输出缓冲放大器上用R-C滤波,可以缓解跳变尖峰。 是“缓解”。

第二个办法是“锁存处理”。
如果你用的也是DAC,就充分利用它的功能吧。把 ILE 用起来,时钟接到 ILE 脚。

ddaiss 发表于 2012-11-29 15:08:14

JQ_Lin 发表于 2012-11-29 12:13 static/image/common/back.gif
我在6楼说的第一个办法是“高频滤波,缓解一下。”
在输出缓冲放大器上用R-C滤波,可以缓解跳变尖峰。 是 ...

哦,知道了,多谢你
我还是继续研究一下吧,我们俩用的方法好像不太一样

ddaiss 发表于 2012-11-30 08:13:39

呼叫@xivisi

ddaiss 发表于 2012-11-30 08:14:14

xivisi 发表于 2012-11-29 11:24 static/image/common/back.gif
这个 我也遇到过不过是正弦表的问题,比如12BIT 最大是4095 而不是4096

我觉得可能你遇到的跟我类似,求详解

xivisi 发表于 2012-11-30 08:51:54

ddaiss 发表于 2012-11-30 08:14 static/image/common/back.gif
我觉得可能你遇到的跟我类似,求详解

不好意思,刚看到,我用的是MCU,DAC是12BIT,单极性,超出12bit的高bit忽略,所以出现在波峰有一个突然地向下尖峰

从你的图来看,像是用符号数小得越界被认作一个较大的值,最好检查正弦表的数值是否在寄存器允许的数值

ddaiss 发表于 2012-11-30 09:02:31

xivisi 发表于 2012-11-30 08:51 static/image/common/back.gif
不好意思,刚看到,我用的是MCU,DAC是12BIT,单极性,超出12bit的高bit忽略,所以出现在波峰有一个突然 ...

哦,这样呀,我有点质疑我的IQ乘法运算了

ddaiss 发表于 2012-11-30 10:14:20

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位数,他们可以这么直接相乘吗

usbfish 发表于 2012-11-30 12:06:25

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:11:11

usbfish 发表于 2012-11-30 12:06 static/image/common/back.gif
可以是可以,但是你将一个Q30格式的数据和一个Q0格式的数据相乘,结果还是Q30,不知道你后面使用的时候有 ...

_IQ30mpy的参数应当是两个Q30的数据,最后得到的也是Q30格式的数据,你的第二个参量不是Q30,而是Q0。
因此有两种处理方法,一是将输入的第二个参数也转化为Q30的数据,二是将所得的结果左移30位,或者乘以2的30次方。

chengtina 发表于 2012-11-30 12:15:53

这波形应该溢出了

ddaiss 发表于 2012-11-30 14:07:51

usbfish 发表于 2012-11-30 12:11 static/image/common/back.gif
_IQ30mpy的参数应当是两个Q30的数据,最后得到的也是Q30格式的数据,你的第二个参量不是Q30,而是Q0。
因 ...

恩,正解,我在后后面没有任何处理,不过Q30格式与Q0格式相乘,由于第二个参数比较大,不能转化为Q30格式的

ddaiss 发表于 2012-11-30 14:14:51

chengtina 发表于 2012-11-30 12:15 static/image/common/back.gif
这波形应该溢出了

恩,好象是这个问题,我还在想怎么解决

ddaiss 发表于 2012-11-30 15:10:23

usbfish 发表于 2012-11-30 12:11 static/image/common/back.gif
_IQ30mpy的参数应当是两个Q30的数据,最后得到的也是Q30格式的数据,你的第二个参量不是Q30,而是Q0。
因 ...

由于两者的乘积会超过32位,请问这种情况该如何处理呀

usbfish 发表于 2012-11-30 16:28:06

ddaiss 发表于 2012-11-30 15:10 static/image/common/back.gif
由于两者的乘积会超过32位,请问这种情况该如何处理呀

Q15格式就可以了

ddaiss 发表于 2012-11-30 16:37:27

usbfish 发表于 2012-11-30 16:28 static/image/common/back.gif
Q15格式就可以了

我是初学,还是有点不太懂
你的意思是把IQ30精度的sin值改为IQ15吗?

usbfish 发表于 2012-11-30 17:45:35

ddaiss 发表于 2012-11-30 16:37 static/image/common/back.gif
我是初学,还是有点不太懂
你的意思是把IQ30精度的sin值改为IQ15吗?

对,Q15就是把数据乘以2的15次方,即乘以32768,一般来说足够满足你的精度需求了。
但是需要注意,1.0的Q15等于0x8000,最高位为1,如果被认为是有符号数,那么就是负数,会溢出,需要小心。-1同理。

ddaiss 发表于 2012-11-30 18:56:18

usbfish 发表于 2012-11-30 17:45 static/image/common/back.gif
对,Q15就是把数据乘以2的15次方,即乘以32768,一般来说足够满足你的精度需求了。
但是需要注意,1.0的Q ...

把它改为32位数据是不是就可以避免了?

andy9909 发表于 2012-12-11 13:14:48

可以看我头像 svpwm 哈哈

waver 发表于 2013-1-4 19:15:10

andy9909 发表于 2012-12-11 13:14 static/image/common/back.gif
可以看我头像 svpwm 哈哈

楼主是正弦波,跟你这个没什么关系吧

andy9909 发表于 2013-1-5 16:04:21

waver 发表于 2013-1-4 19:15 static/image/common/back.gif
楼主是正弦波,跟你这个没什么关系吧

碰巧开个玩笑

youpeng 发表于 2013-7-10 21:59:22

顶一下,lz的问题解决的怎么样了

Ticl4 发表于 2014-7-3 11:31:32

Q30格式的数据和一个Q0格式的数据相乘,结果还是Q30,计算结果将会溢出(数太大没法用Q30表示)
你的 “04.EvaRegs.CMPR1 =_IQsat(_IQ30mpy(sine_table + _IQ30(0.9999),EvaRegs.T1PR/2),EvaRegs.T1PR,0);“ 明显数据格式不匹配, 当然编译器会自行进行转化,但结果很可能就出错了

小瓜瓜 发表于 2014-7-30 10:25:48

__IQsat(A,long P, long N) //IQ数值的限幅函数,把A限制在 之间

jason520 发表于 2014-8-21 21:22:23

{:smile:}{:smile:}{:smile:}
页: [1]
查看完整版本: SPWM输出滤波正弦波