发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名
[问答] 用正弦表怎么生成SPWM?
27323 SPWM
分享
小弟最近想做spwm  原理懂得 等面积原则那个 在网上搜了正弦表生成器 不知道怎么转换成 开关时间啊(怎么利用那个写程序)?望大侠指点下  谢谢
3
2013-8-31 09:33:32   评论 分享淘帖 邀请回答
31个回答
2013-9-1 18:25:08 评论

举报


首先感谢您 你说的太简单了。。。我是说怎么转化为TA的占空比
2013-9-1 21:20:57 评论

举报

童鞋,你问对人了。
正弦表的生成有两种办法
1.利用matlab:程序如下:
fs=195;               %设定采样频率
N=195;                %采样点数为195
n=0:N-1;
t=n/fs;
f1=1;                %这个f1可以不要
x=round(1875*(1+(0.8*sin(2*pi*f1*t))));    %生成正弦信号,并取整
plot(t,x)
x就是比较寄存器的值,总共195个,下溢中断赋值就行了
2.方法二是在dsp中产生正弦表,计算占空比,计算比较寄存器的值
核心程序如下:
while (n<=195)  
  {
   
    q=n*2*PI;      
    q/=195;
    j=sin(q);     
    l=1875*(1+M*j);//M为调制比     //计算占空比表达式
   
   if(l>=375&l<=3375)
     sin_table[n]=l;  
    else
        {
        if(l>3375)
         sin_table[n]=3375;
        else
         sin_table[n]=375;
        }  
   n=n+1;
  }

具体吧!这些程序都是我编的,我就是这么做的。两种都可以。
2014-4-1 11:47:35 评论

举报

1006050515 发表于 2014-4-1 11:47
童鞋,你问对人了。
正弦表的生成有两种办法
1.利用matlab:程序如下:

您好!我现在要生成spwm波,但是不知道占空比怎么计算?载波pWM的频率是40KHZ,调制信号正弦波的频率是2KHZ,pWM的幅度是从0-3.3V。不知道有没有相关的计算公式?
2014-7-28 19:48:15 评论

举报

2014-8-11 16:52:48 评论

举报

按正弦表来刷TACCRx的值。占空比100%就是1,50%就是0,0%就是-1,按照正弦表的值计算占空比,再计算TACCRx的值
2014-9-15 10:50:56 评论

举报

楼主 写好了吗 ?不知道你写了关于 PI校正以后的SPWM吗?交流一下
2014-9-18 15:22:38 评论

举报

给你个软件  我也是从论坛下载的

spwm_calc_v1.3.2.rar

167.66 KB, 下载次数: 874

spwm波表

2014-9-23 23:59:00 评论

举报

软件不能用啊{:1:}{:1:}
2014-9-24 20:50:56 评论

举报

很久没登了 我去年写的  你们参考一下吧
430单片机
#include <msp430x16x.h>
int n=0;
int flag = 1;
int spwm[256]=
{
   1   , 5  ,   9   , 13  ,  17    ,21  ,  24  ,  28  ,
   32  ,  36 ,   40 ,   43 ,   47  ,  51 ,   55,    58 ,   62,
    66  ,  70  ,  73   , 77  ,  81,    85   , 88  ,  92  ,  96,
    99  , 103,   106  , 110 ,  114   ,117,   121,   124,

   128  , 131  , 135 ,  138,   141  , 145   ,148   ,152  , 155 ,
   158  , 162   ,165 ,  168 ,  171  , 174,   178 ,  181,
   184   ,187  , 190,   193,   196,   199 ,  202  , 205  , 208 ,
   210   ,213  , 216,   219,   221 ,  224 ,  227 ,  229,

   232   ,234  , 237 ,  239 ,  242  , 244 ,  247 ,  249 ,  251 ,
   253  , 256  , 258  , 260  , 262  , 264 , 266 ,  268,
   270  , 272 ,  274 ,  276  , 277 ,  279  , 281  , 282  ,
   284  , 285 ,  287 ,  288 ,  290,   291,   293   ,294,   295,
   296  , 297   ,299,   300,   301  , 302,   303  , 303 ,  304 ,
     305  , 306 ,  307  , 307  , 308 ,  308  , 309,   309,

   310  , 310 ,  311 ,  311  , 311 ,  311 ,  311,   311,
   311  , 311 ,  311  , 311   ,311  , 311  , 311  , 311 ,  310,


   310 ,  309  , 309,   308  , 308 ,  307,   307,   306,
   305   ,304 ,  304 ,  303 ,  302  , 301  , 300,   299 ,  298,


   296 ,  295 ,  294   ,293  , 291   ,290  , 289,   287   ,286 ,
   284   ,282 ,  281   ,279  , 277  , 276,   274 ,  272,


   270  , 268  , 266 ,  264  , 262 ,  260 ,  258 ,  256,
   254 ,  251,   249  , 247 ,  244 ,  242 ,  240,   237  , 235,
   232  , 229,   227 ,  224   ,222  , 219,   216   ,213,   211  ,
   208   ,205 ,  202,   199,   196 ,  193 ,  190   ,187,

   184  , 181  , 178  , 175   ,171 ,  168  , 165  , 162 ,  158,
   155  , 152   ,148 ,  145 ,  142,   138 ,  135 ,  131,


   128   ,124,   121  , 117  , 114,   110  , 107 ,  103,    99 ,
   96    ,92  ,  88   , 85  ,  81  ,  77 ,   74,    70,
    66 ,   62 ,   59  ,  55  ,  51  ,  47  ,  44 ,   40 ,   36,
    32   , 28 ,   25  ,  21,    17 ,   13   ,  9  ,   5,    2

};
void TimerB_Init()
{
  P4SEL |= BIT2;                            // Set for Timer A1
  P4DIR |= BIT2;
  P4SEL |= BIT1;                            // Set for Timer A1
  P4DIR |= BIT1;
  TACCR0 = 312;
  TBCCR0 = 312;                               // Init TACCR0 w/ sample prd=CCR0+1
  TBCCR1 = 0;  
  TBCCR2 = 0;   
  TBCCTL1 = OUTMOD_7;                       // Set/reset
  TBCCTL2 = OUTMOD_7;                       // Set/reset
  CCTL0= CCIE;
  TBCTL = TBCLR + MC_1 + TBSSEL_2;          // clear TAR, up mode*/
  TACTL = TACLR + MC_1 + TASSEL_2;          // clear TAR, up mode*/
}


void ini_sys(void)
{
    BCSCTL1 &= ~XT2OFF;                       // XT2on
      do
      {
      IFG1 &= ~OFIFG;                           // Clear OSCFault flag
      for (char i = 0xFF; i > 0; i--);               // Time for flag to set
      }
      while ((IFG1 & OFIFG));                   // OSCFault flag still set?
    BCSCTL2=SELM_2+SELS;
}

void main()
{
   WDTCTL=WDTPW+WDTHOLD;
   ini_sys();  
   TimerB_Init();
   _EINT();

   
   while(1)
   {

        if( flag == 1)
        {
          TBCCR2 = 0;
          TBCCR1=spwm[n];
        }   
      
        else
        {
          TBCCR1 = 0;  
          TBCCR2 = spwm[n%256];
        }
        
   }
}

#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA(void)
{

    n++;
    if((n%256) == 0)
    {
      flag = 1- flag;
    }
    if(n == 512)
    {
      n = 0;
    }
   
}
2014-10-26 09:53:33 评论

举报

楼主你现在做的怎么样,用什么做的,能不能给的建议
2014-10-28 18:44:18 评论

举报

青春流年 发表于 2014-10-28 18:44
楼主你现在做的怎么样,用什么做的,能不能给的建议

我用430单片机做的,效果也不是特别好,做了好久了的!都忘了
2015-1-3 18:20:39 评论

举报

1006050515 发表于 2014-4-1 11:47
童鞋,你问对人了。
正弦表的生成有两种办法
1.利用matlab:程序如下:

可不可以留下联系方式,如qq,有问题请教。
2015-5-17 19:37:49 评论

举报

神一滴 发表于 2014-9-23 23:59
给你个软件  我也是从论坛下载的

这个软件生成的数组怎么写到单片机里?要算法是什么?
2015-5-17 19:39:27 评论

举报

直接建立一个数组复制进去啊
2015-5-27 23:58:37 评论

举报

11楼OK
查表法最简单。
那些数字用excel简单拖公式就可以得到了。
2015-5-28 20:08:37 评论

举报

1006050515 发表于 2014-4-1 11:47
童鞋,你问对人了。
正弦表的生成有两种办法
1.利用matlab:程序如下:

l=1875*(1+M*j),你这里的1875是怎么来的,还有后边的那个375和3375,这些值是怎么计算出来的
2015-6-19 15:02:59 评论

举报

2015-6-29 23:28:24 评论

举报

2015-7-15 15:35:37 评论

举报

只有小组成员才能发言,加入小组>>

12下一页

1030个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /6 下一条

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