搜索
bottom↓
回复: 48

SPWM输出滤波正弦波

[复制链接]

出0入0汤圆

发表于 2012-11-27 18:48:06 | 显示全部楼层 |阅读模式
大家可以看看我的头像,我用2812内固有的数据产生正弦波,但是怎么调整都有一个很大的刺,大家有没有遇到过这种情况呀

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2012-11-27 18:53:06 | 显示全部楼层
初来乍到先自己顶一下吧

出0入0汤圆

 楼主| 发表于 2012-11-27 18:59:43 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-11-27 19:05:59 | 显示全部楼层
正弦表中有溢出数据,就是UINT16的数据最高位不能为1,不然编译器会认为是负数。

出0入0汤圆

 楼主| 发表于 2012-11-27 20:07:35 | 显示全部楼层
usbfish 发表于 2012-11-27 19:05
正弦表中有溢出数据,就是UINT16的数据最高位不能为1,不然编译器会认为是负数。 ...

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

出0入0汤圆

发表于 2012-11-27 20:34:55 | 显示全部楼层
ddaiss 发表于 2012-11-27 18:59

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

出0入0汤圆

发表于 2012-11-27 21:32:43 | 显示全部楼层
有个什么过零点的问题  你这是单极性的 似乎有这个问题

用双极性spwm好点吧

出0入0汤圆

发表于 2012-11-27 21:48:27 | 显示全部楼层
你的正弦表是Q格式的么?怎么分的?0~2pi的范围还是0~pi/2的范围呢?

出0入0汤圆

发表于 2012-11-27 21:57:33 | 显示全部楼层
同意6楼,上次我一个同学也遇到过这样的问题。上次我们也是用滤波来解决的。示波器在采集信号的时候,有是否加滤波的设置,你可以直接用示波器验证一下,看加上滤波行不行。。

出0入0汤圆

 楼主| 发表于 2012-11-28 08:05:43 | 显示全部楼层
usbfish 发表于 2012-11-27 21:48
你的正弦表是Q格式的么?怎么分的?0~2pi的范围还是0~pi/2的范围呢?

上部分代码给大家看看,我用的芯片内固有的正弦数据,我查看过EvaRegs.CMPR1中的所有数值,没有溢出的呀

  1. #pragma DATA_SECTION(sine_table,"IQmathTables");
  2. _iq30 sine_table[512];
  3. EvaRegs.CMPR1 =  _IQsat(_IQ30mpy(sine_table[index1] + _IQ30(0.9999),EvaRegs.T1PR/2),EvaRegs.T1PR,0);
复制代码

出0入0汤圆

 楼主| 发表于 2012-11-28 08:07:09 | 显示全部楼层
JQ_Lin 发表于 2012-11-27 20:34
加进位、减借位时,较高位跳变形成的毛刺。
最简单的办法是高频滤波,缓解一下。
最好锁存处理,不论大小 ...

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

出0入0汤圆

 楼主| 发表于 2012-11-28 08:07:33 | 显示全部楼层
gongxd 发表于 2012-11-27 21:32
有个什么过零点的问题  你这是单极性的 似乎有这个问题

用双极性spwm好点吧 ...

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

出0入0汤圆

 楼主| 发表于 2012-11-28 08:09:06 | 显示全部楼层
shi562142022 发表于 2012-11-27 21:57
同意6楼,上次我一个同学也遇到过这样的问题。上次我们也是用滤波来解决的。示波器在采集信号的时候,有是 ...

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

出0入0汤圆

发表于 2012-11-28 08:55:15 | 显示全部楼层
在CCS里面,上电跟踪检查一下正弦波峰值点的计算输出有没有错误。
即Siin=1或-1时的计算输出,楼主仔细检查一遍,一定要上电调试查看。

出0入0汤圆

 楼主| 发表于 2012-11-28 09:06:55 | 显示全部楼层
usbfish 发表于 2012-11-28 08:55
在CCS里面,上电跟踪检查一下正弦波峰值点的计算输出有没有错误。
即Siin=1或-1时的计算输出,楼主仔细检查 ...

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

出0入0汤圆

 楼主| 发表于 2012-11-28 10:32:15 | 显示全部楼层
JQ_Lin 发表于 2012-11-27 20:34
加进位、减借位时,较高位跳变形成的毛刺。
最简单的办法是高频滤波,缓解一下。
最好锁存处理,不论大小 ...

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

出0入0汤圆

 楼主| 发表于 2012-11-28 20:50:46 | 显示全部楼层
顶一下,

出0入0汤圆

发表于 2012-11-28 23:58:34 | 显示全部楼层
ddaiss 发表于 2012-11-28 20:50
顶一下,

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

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


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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-11-29 09:39:31 | 显示全部楼层
JQ_Lin 发表于 2012-11-28 23:58
没有找到记忆中的帖子,但找到了我曾回复过的仿真截图。
供参考。

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

出0入0汤圆

发表于 2012-11-29 11:21:36 | 显示全部楼层
用的是 Proteus 。

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

出0入0汤圆

发表于 2012-11-29 11:24:27 | 显示全部楼层
这个 我也遇到过  不过是正弦表的问题,比如12BIT 最大是4095 而不是4096

出0入0汤圆

 楼主| 发表于 2012-11-29 11:30:22 | 显示全部楼层
本帖最后由 ddaiss 于 2012-11-29 12:08 编辑
xivisi 发表于 2012-11-29 11:24
这个 我也遇到过  不过是正弦表的问题,比如12BIT 最大是4095 而不是4096
  1. _IQ30mpy(sine_table[index1] + _IQ30(0.9999),EvaRegs.T1PR/2)
复制代码
敢问我这一步的运算对吗,我有点怀疑自己的这一步运算,_IQ30mpy可以这么用吗,还是应该是哟个_IQ30mpyI32int呢
毕竟EvaRegs.T1PR/2是一个16位的


针对您的回答,我想问一下您说的“比如12BIT 最大是4095 而不是4096”如何应用到我的问题上来呢,没想明白,求详解

出0入0汤圆

 楼主| 发表于 2012-11-29 11:37:21 | 显示全部楼层
JQ_Lin 发表于 2012-11-29 11:21
用的是 Proteus 。

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

这么说你用的是DA喽?

出0入0汤圆

发表于 2012-11-29 12:07:56 | 显示全部楼层
ddaiss 发表于 2012-11-29 11:37
这么说你用的是DA喽?

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

出0入0汤圆

 楼主| 发表于 2012-11-29 12:10:14 | 显示全部楼层
JQ_Lin 发表于 2012-11-29 12:07
不是我。是原帖作者。
用4040对脉冲计数产生eprom的地址,从eprom取出波形数据送DAC0832进行DA转化,输出 ...

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

出0入0汤圆

发表于 2012-11-29 12:13:06 | 显示全部楼层
本帖最后由 JQ_Lin 于 2012-11-29 12:55 编辑
ddaiss 发表于 2012-11-29 12:10
哦,我也要看看如何用滤波器了,至今还没用过。
那你说的用了滤波器以后有缓冲效果是什么意思 ...


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

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

出0入0汤圆

 楼主| 发表于 2012-11-29 15:08:14 | 显示全部楼层
JQ_Lin 发表于 2012-11-29 12:13
我在6楼说的第一个办法是“高频滤波,缓解一下。”
在输出缓冲放大器上用R-C滤波,可以缓解跳变尖峰。 是 ...

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

出0入0汤圆

 楼主| 发表于 2012-11-30 08:13:39 | 显示全部楼层
呼叫@xivisi

出0入0汤圆

 楼主| 发表于 2012-11-30 08:14:14 | 显示全部楼层
xivisi 发表于 2012-11-29 11:24
这个 我也遇到过  不过是正弦表的问题,比如12BIT 最大是4095 而不是4096

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

出0入0汤圆

发表于 2012-11-30 08:51:54 | 显示全部楼层
ddaiss 发表于 2012-11-30 08:14
我觉得可能你遇到的跟我类似,求详解

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

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

出0入0汤圆

 楼主| 发表于 2012-11-30 09:02:31 | 显示全部楼层
xivisi 发表于 2012-11-30 08:51
不好意思,刚看到,我用的是MCU,DAC是12BIT,单极性,超出12bit的高bit忽略,所以出现在波峰有一个突然 ...

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

出0入0汤圆

 楼主| 发表于 2012-11-30 10:14:20 | 显示全部楼层
usbfish 发表于 2012-11-28 08:55
在CCS里面,上电跟踪检查一下正弦波峰值点的计算输出有没有错误。
即Siin=1或-1时的计算输出,楼主仔细检查 ...

朋友问一下你哦,_IQ30mpy(sine_table[index1] + _IQ30(0.9999),EvaRegs.T1PR/2),这句话有没有问题呀,sine_table[index1] + _IQ30(0.9999)是一个IQ格式的数,而EvaRegs.T1PR/2是一个16位数,他们可以这么直接相乘吗

出0入0汤圆

发表于 2012-11-30 12:06:25 | 显示全部楼层
ddaiss 发表于 2012-11-30 10:14
朋友问一下你哦,_IQ30mpy(sine_table + _IQ30(0.9999),EvaRegs.T1PR/2),这句话有没有问题呀,sine_tabl ...

可以是可以,但是你将一个Q30格式的数据和一个Q0格式的数据相乘,结果还是Q30,不知道你后面使用的时候有没有处理,不然肯定溢出,这就是我说的原因,因为我以前和你遇到过一模一样的现象。

出0入0汤圆

发表于 2012-11-30 12:11:11 | 显示全部楼层
usbfish 发表于 2012-11-30 12:06
可以是可以,但是你将一个Q30格式的数据和一个Q0格式的数据相乘,结果还是Q30,不知道你后面使用的时候有 ...

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

出0入10汤圆

发表于 2012-11-30 12:15:53 | 显示全部楼层
这波形应该溢出了

出0入0汤圆

 楼主| 发表于 2012-11-30 14:07:51 | 显示全部楼层
usbfish 发表于 2012-11-30 12:11
_IQ30mpy的参数应当是两个Q30的数据,最后得到的也是Q30格式的数据,你的第二个参量不是Q30,而是Q0。
因 ...

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

出0入0汤圆

 楼主| 发表于 2012-11-30 14:14:51 | 显示全部楼层
chengtina 发表于 2012-11-30 12:15
这波形应该溢出了

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

出0入0汤圆

 楼主| 发表于 2012-11-30 15:10:23 | 显示全部楼层
usbfish 发表于 2012-11-30 12:11
_IQ30mpy的参数应当是两个Q30的数据,最后得到的也是Q30格式的数据,你的第二个参量不是Q30,而是Q0。
因 ...

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

出0入0汤圆

发表于 2012-11-30 16:28:06 | 显示全部楼层
ddaiss 发表于 2012-11-30 15:10
由于两者的乘积会超过32位,请问这种情况该如何处理呀

Q15格式就可以了

出0入0汤圆

 楼主| 发表于 2012-11-30 16:37:27 | 显示全部楼层
usbfish 发表于 2012-11-30 16:28
Q15格式就可以了

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

出0入0汤圆

发表于 2012-11-30 17:45:35 | 显示全部楼层
ddaiss 发表于 2012-11-30 16:37
我是初学,还是有点不太懂
你的意思是把IQ30精度的sin值改为IQ15吗?

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

出0入0汤圆

 楼主| 发表于 2012-11-30 18:56:18 | 显示全部楼层
usbfish 发表于 2012-11-30 17:45
对,Q15就是把数据乘以2的15次方,即乘以32768,一般来说足够满足你的精度需求了。
但是需要注意,1.0的Q ...

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

出0入0汤圆

发表于 2012-12-11 13:14:48 | 显示全部楼层
可以看我头像 svpwm 哈哈

出0入0汤圆

发表于 2013-1-4 19:15:10 | 显示全部楼层
andy9909 发表于 2012-12-11 13:14
可以看我头像 svpwm 哈哈

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

出0入0汤圆

发表于 2013-1-5 16:04:21 | 显示全部楼层
waver 发表于 2013-1-4 19:15
楼主是正弦波,跟你这个没什么关系吧

碰巧开个玩笑

出0入0汤圆

发表于 2013-7-10 21:59:22 | 显示全部楼层
顶一下,lz的问题解决的怎么样了

出0入0汤圆

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

出0入0汤圆

发表于 2014-7-30 10:25:48 | 显示全部楼层
__IQsat(A,long P, long N) //IQ数值的限幅函数,把A限制在[N,P] 之间

出0入0汤圆

发表于 2014-8-21 21:22:23 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 20:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表