spwm的仿真笔记

[复制链接]
8913|36
 楼主| 叶春勇 发表于 2021-8-26 13:43 | 显示全部楼层 |阅读模式
yjmwxwx 网友的帖子中,有关spwm作为信号源的滤波器设计
在spice仿真软件中没有spwm信号,spice中只有一个pwl文件支持信号源
于是写了一个生成spwm的pwl文件的程序
程序原理根据sin表生成一个pwl文件
说明:
一个pwm波表示如下图:

Tr为上升时间
Tf为下降时间
Ton为从pwm表中读取的数值
Tx为末尾与下一个pwm的间隙

python程序如下:
  1. spwm_table=[14,18,21,24,26,27,26,24,21,18,14,9,6,3,1,0,1,3,6,9]
  2. def get_period(f):
  3.     return 1/f

  4. def float2str(v,scale):
  5.     return str(int(v*scale))+'p'

  6. def get_pwl_line(t,v):
  7.     return float2str(t,1e6)+','+str(v)


  8. #stm32定时器频率
  9. freq=56
  10. spwm_period=28   ##arr寄存器

  11. #stm32波形参数

  12. Vinitial=0.0
  13. Von=3.3
  14. tr=1e-4
  15. tf=1e-4
  16. start=0.0

  17. period=get_period(freq)*(spwm_period);
  18. f=open('d:\spwm.txt','w')

  19. for t in spwm_table:
  20.     print(t)
  21.     if (t==0) :
  22.         msg=get_pwl_line(start,Vinitial)
  23.         print(msg)
  24.         f.write(msg)
  25.         f.write('\r\n')
  26.         msg=get_pwl_line(start+period-1e-4,Vinitial)
  27.         print(msg)
  28.         f.write(msg)
  29.         f.write('\r\n')
  30.     else:
  31.         
  32.         ton=t/freq
  33.         msg=get_pwl_line(start,Vinitial)
  34.         print(msg)
  35.         f.write(msg)
  36.         f.write('\r\n')
  37.         msg=get_pwl_line(start+tr,Von)
  38.         print(msg)
  39.         f.write(msg)
  40.         f.write('\r\n')
  41.         msg=get_pwl_line(start+ton,Von)
  42.         print(msg)
  43.         f.write(msg)
  44.         f.write('\r\n')
  45.         msg=get_pwl_line(start+ton+tf,Vinitial)
  46.         print(msg)
  47.         f.write(msg)
  48.         f.write('\r\n')
  49.         msg=get_pwl_line(start+period-1e-5,Vinitial)
  50.         print(msg)
  51.         f.write(msg)
  52.         f.write('\r\n')
  53.     print('---')
  54.     start=start+period

  55. f.close()


本帖子中包含更多资源

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

×
 楼主| 叶春勇 发表于 2021-8-26 13:47 | 显示全部楼层
生成的pwm波如下:

经滤波后

本帖子中包含更多资源

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

×
 楼主| 叶春勇 发表于 2021-8-26 13:50 | 显示全部楼层
注意,PWL文件为一个spwm周期
使用时 加上“PWL repeat for N file=xxxxx endrepeat" ,这样spwm就能重复多个周期。就可以用这个波形去设计滤波器了。
@king5555 ,你有没有建立过spwm的信号模型?
 楼主| 叶春勇 发表于 2021-8-26 14:02 | 显示全部楼层
本帖最后由 叶春勇 于 2021-8-26 14:13 编辑

经spice软件fft分析,spwm信号很脏
我测试的是56M,周期=27+1,spwm长度20
基频在100khz,但是200k,300k,400k的谐波能量很大,信号非常的脏。

本帖子中包含更多资源

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

×

评论

HWM
SPWM含丰富谐波,这很正常。  发表于 2021-8-26 16:53
Jack315 发表于 2021-8-26 14:05 | 显示全部楼层
这个干得漂亮,赞一个!
Jack315 发表于 2021-8-26 14:10 | 显示全部楼层
来个信号源 PWL 设置的详细教程。我的仿真就卡在这里了。
 楼主| 叶春勇 发表于 2021-8-26 14:18 | 显示全部楼层
Jack315 发表于 2021-8-26 14:10
来个信号源 PWL 设置的详细教程。我的仿真就卡在这里了。

使用ltspice仿真软件
第一步:电压源对话框

第二步:
在仿真界面,修改电压源的值为

这样就ok了。

本帖子中包含更多资源

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

×
yjmwxwx 发表于 2021-8-26 14:33 | 显示全部楼层
感谢分享,波形确实够差的
Jack315 发表于 2021-8-26 14:48 | 显示全部楼层
叶春勇 发表于 2021-8-26 14:18
使用ltspice仿真软件
第一步:电压源对话框

收到。

偶熟悉的仿真器就是这个信号源的问题。
用方波、积分得到三角波。
然后和正弦信号比大小,这样也得到了 PWM 波。

原来的方波是 100KHz 的,换成 1MHz 以上估计电脑就要转不动了。
LTSpice 以前玩得少,你玩得 6 的。跟你学了
Jack315 发表于 2021-8-26 15:13 | 显示全部楼层
这个数据文件俺的仿真器里也能用。这下可好了
 楼主| 叶春勇 发表于 2021-8-26 16:55 | 显示全部楼层
本帖最后由 叶春勇 于 2021-8-26 17:00 编辑
yjmwxwx 发表于 2021-8-26 14:33
感谢分享,波形确实够差的

这个是100hz的波形文件,56M频率 周期560,sin表长度=1000,从你的源文件生成的。我自己仿真的结果,滤波器设计的好,采样点多的,最终正弦波非常好。


本帖子中包含更多资源

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

×
yjmwxwx 发表于 2021-8-26 17:50 | 显示全部楼层
叶春勇 发表于 2021-8-26 16:55
这个是100hz的波形文件,56M频率 周期560,sin表长度=1000,从你的源文件生成的。我自己仿真的结果,滤波 ...

麻烦帮忙仿真了,这个仿真软件我还不会用,现在的波形感觉已经不错了,四个正弦波的振幅也差不多。
Jack315 发表于 2021-8-26 18:07 | 显示全部楼层
叶春勇 发表于 2021-8-26 14:02
经spice软件fft分析,spwm信号很脏
我测试的是56M,周期=27+1,spwm长度20
基频在100khz,但是200k,300k,4 ...

能不能帮整个正弦 100KHz,PWM 脉冲频率 10MHz的数据文件。
滤波器要仿真这个信号的输出波形。

先转 MATLAB 来试试,又要整传递函数了……
 楼主| 叶春勇 发表于 2021-8-26 18:56 | 显示全部楼层
yjmwxwx 发表于 2021-8-26 17:50
麻烦帮忙仿真了,这个仿真软件我还不会用,现在的波形感觉已经不错了,四个正弦波的振幅也差不多。
...

电桥里面那个自动平衡的运放(下臂?),如果采样电阻100k,经过运放放大,就乱七八糟的。估计10k也是。
yjmwxwx 发表于 2021-8-26 19:19 | 显示全部楼层
叶春勇 发表于 2021-8-26 18:56
电桥里面那个自动平衡的运放(下臂?),如果采样电阻100k,经过运放放大,就乱七八糟的。估计10k也是。
...

那里波形肯定好不了,关键是还要滤波电路简单还要能用在多个频率上
 楼主| 叶春勇 发表于 2021-8-26 19:34 | 显示全部楼层
yjmwxwx 发表于 2021-8-26 19:19
那里波形肯定好不了,关键是还要滤波电路简单还要能用在多个频率上

如果这个滤波器就一个,起始100Hz,终值100khz的带通,基本无解,100Hz里面就有大量100Khz以内的高频信号。无非就是切换档位。你不是后来胡乱搞了个针对100Hz的换档,不就这个意思吗?



yjmwxwx 发表于 2021-8-26 19:51 | 显示全部楼层
叶春勇 发表于 2021-8-26 19:34
如果这个滤波器就一个,起始100Hz,终值100khz的带通,基本无解,100Hz里面就有大量100Khz以内的高频信号 ...

对啊,100HZ里面很多100KHZ的高频信号,一个滤波器应该不行吧,100HZ以前搞过,ARR里面是111,正弦表点数5000,最高振幅111,波形很差不如现在好,感觉胡乱加了个电容和三极管满足要求了,搞成多路滤波器是不是还要接个模拟开关,电路这方面我实在是不懂
 楼主| 叶春勇 发表于 2021-8-26 20:01 | 显示全部楼层
yjmwxwx 发表于 2021-8-26 19:51
对啊,100HZ里面很多100KHZ的高频信号,一个滤波器应该不行吧,100HZ以前搞过,ARR里面是111,正弦表点数 ...

慢慢折腾,搞多了就知道坑在哪,就是HWM所说的试错成本。
网上琳琅满目的电桥,技术路线多着呢。哪个好,哪个差,这不就排坑呗。
Jack315 发表于 2021-8-26 21:00 | 显示全部楼层
本帖最后由 Jack315 于 2021-8-26 21:03 编辑
叶春勇 发表于 2021-8-26 19:34
如果这个滤波器就一个,起始100Hz,终值100khz的带通,基本无解,100Hz里面就有大量100Khz以内的高频信号 ...

SPWM 产生的正弦波看起来是没解了。

俄版用的 MCU 有直接的 DAC,XJW 用的是 DDS。
SPWM 的只能一个点(正弦频率)。和方波的方案是一个意思。
多个点的时候,每个点都要一个高 Q 的带通滤波器。

@yjmwxwx 以你手上的资源,基本玩不下去了。
实在要玩下去的话,就做多个正弦振荡器,然后用模拟开关选择;或者用方波,然后测时间常数……
还要继续下去吗?
 楼主| 叶春勇 发表于 2021-8-26 21:10 | 显示全部楼层
king5555 发表于 2021-8-26 17:53
设置过几次PWL(t1 v1 t2 v2...),但在PWL FILE中我只试过一次,从电脑音讯中抓过一短音乐的.wav档案,用 ...

本大师教导我们,代数搞不定,用数值计算(spice)搞
您需要登录后才可以回帖 登录 | 注册

本版积分规则

151

主题

4810

帖子

50

粉丝
快速回复 在线客服 返回列表 返回顶部