spwm 怎样产生

发布: 2009-9-05 08:37 | 作者: xly2104 | 来源: StmFans思蜕盟 OPELC 自由电子联盟

最近要整个spwm  通过低通滤波之后产生一个正弦波  在网上找了很多资料  现在对用面积等效法计算正弦值表存在困惑  请教这个表到底怎么算的 还有在中断里进行ton  toff  开短时间的计算(包含乘除)  stm32速度跟的上吗
binglin (2009-9-05 10:52:45)
正弦波的一个周期分为N个点,然后360/N,用正弦或余弦求出对应点的值(系数)。

如果速度够,就实时运算,如果不够快就先生成一个表,用查表法。
mouxiang (2009-9-05 23:27:44)
呵呵,用各个点对应的正弦值来做SPWM效果也还好可以的,我最近恰巧试过。我半周期取了100个点,直接用的个点对应正弦值来做正弦表,没有实时计算,得到的SPWM波形输出直接用RC滤波滤掉高频分量后,能看到比较好的正弦波。
binglin (2009-9-06 18:27:02)
呵呵,mouxiang的经验值得参考,谢谢mouxiang的经验分享。
mouxiang (2009-9-06 19:01:36)
呵呵,等下我把我的产生SPWM波的程序传上来吧,用的是最简单的查表法,在TIM1的中断里面修改下一周期的占空比。产生出来的波形在示波器上面看大致是对的,不过从示波器上看有的脉冲会出现突然向下的翻转,这个现象比较难描述,我画个图上来吧不过好像滤波之后没什么影响。老师说也有可能是数字示波器自己的问题。我还没找到这个问题的原因,各位帮忙看看有什么问题呀
mouxiang (2009-9-06 19:07:44)
就是这个
mouxiang (2009-9-06 19:14:51)
附件是我的SPWM产生的程序

SPWM.rar
(2009-09-06 19:14:51, Size: 488 KB, Downloads: 95)

binglin (2009-9-06 23:44:00)
谢谢mouxiang啊,给了个这么好的参考实例程序。
mouxiang (2009-9-07 00:03:53)
呵呵,我也是不确定我这个程序到底还有什么问题没呀,只是提供了一个自己的思路,也是在参考别人的程序之后写的。因为数字示波器上的波形看起来有时候会出现上面那张图上的毛病……我自己是没找到哪里出了什么问题,所以发上来让大家帮忙找找
bkkman (2009-9-07 14:29:47)
[i=s] 本帖最后由 bkkman 于 2009-9-7 14:34 编辑

是MCU输出脚波形还是高压输出波形?最好分别测一下,还可找一模拟示波器比对一下.

看图,缺口有些规律,是否以缺口脉冲为触发条件,查一查相关电路波形,是否有相关性.
mouxiang (2009-9-07 15:45:35)
MCU输出的波形,有时候有这种现象,有时候又没有,我开始觉得可能是被其他中断打断了,我又把其他中断关掉,还是这个样子,我问老师,他说一般都是在定时器中断里面修改占空比的,我也正是这样做的,所以不是很清楚哪个地方出问题。我在想是不是TIM1的模式设置的不对呢?我用的PWM2模式。我在现在这个周期对TIM1作出的修改,应该是在下一个周期生效吧,也就应该不会存在延迟的问题哦。或者真的是模拟示波器和数字示波器的问题?我什么时候还是去找个模拟的来试下吧。其实模拟的好久没用了,都给忘掉怎么弄了
binglin (2009-9-07 18:33:22)
mouxiang你用的更新模式是即时更新还是更新事件UEV时更新?

如果是即时更新,则有可能出现你这种情况。
mouxiang (2009-9-07 19:49:28)
炳哥哥这句话提醒我了
我之前也有想过这个问题,但是在例程里面也没看到有对UEV的设置,所以一直都没怎么在意。刚才我又看了下用户手册,发现原来TIM1_CR1里的ARPE就是控制着ARR的,也就是影响着是立即更新还是等到更新事件产生才更新的问题。
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;         
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;         
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
   
  TIM_OCInit(TIM3, &TIM_OCInitStructure);

//启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)

  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

这样的设置就是等到下一个周期才更新占空比啦。
呵呵,现在我觉得应该就是这个问题了,明天去试试看。
mouxiang (2009-9-07 19:56:56)
另外,我还看到一条 TIM_PrescalerConfig(TIM2, 35999, TIM_PSCReloadMode_Immediate);
这个应该是将定时器设置为立即更新的吧。
实在是惭愧,定时器这东西也是经常在用的东东了,到现在才发现原来很多问题一直都没理解
谢谢炳哥哥的提醒呀
mouxiang (2009-9-08 21:54:52)
今天试了下,还是没解决。SPWM波设成10KHZ的时候,今天突然又正常了,波形跟预期的一样,没有那种缺口出现,不论用不用这个ARR的设置都没问题。但是设成5KHZ,也就是20ms包含100个点的时候,又出现那种缺口了,使用了预装载也没有效果。搞不明白了
我用的这个函数TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, u16 TIM_OCPreload);
binglin (2009-9-08 23:32:56)
周六日我也用你的SPWM程序测试一下。
mouxiang (2009-9-09 10:40:19)
呵呵,谢谢炳哥哥哈这个问题烦了我很久咯
binglin (2009-9-09 11:21:45)
下载了SPWM程序,初步看了一下,用了TIM1/2/3,分别用来做什么的?mouxiang能简单介绍一下程序的编写思路吗?让我不用花太多的时间来分析它的功能。
mouxiang (2009-9-09 13:41:18)
噢,TIM2和TIM3是拿来检测正弦电压过零点用来同步电网电压的频率和相位的,这里其实没什么用,我忘了删了
我用来产生SPWM的就只有TIM1,在TIM1的中断中修改占空比,实际上就是查表得到下一个周期的占空比。TIM1的通道1和3产生的波形一样,是前半周期输出SPWM,后半周期为0,通道2和4产生的波形一样,在后半周期输出SPWM,用在全桥逆变器上面。
麻烦炳哥哥了哈
mouxiang (2009-9-09 14:11:56)
[i=s] 本帖最后由 mouxiang 于 2009-9-9 14:27 编辑

我把多余的东西删掉了,只用了TIM1,不过从刚才的波形看,又是和预期波形相符的。这波形时好时坏的,真搞不懂

SPWM-10KHZ.rar
(2009-09-09 14:27:50, Size: 468 KB, Downloads: 61)

mouxiang (2009-9-09 14:25:24)
再看5KHZ的,又出现那种有缺口的状况了
上面那个SPWM是10KHZ的,半周期100个点。

SPWM-5KHZ.rar
(2009-09-09 14:25:24, Size: 468 KB, Downloads: 60)