用正弦表怎么生成SPWM?

2019-07-15 15:36发布

小弟最近想做spwm  原理懂得 等面积原则那个 在网上搜了正弦表生成器 不知道怎么转换成 开关时间啊(怎么利用那个写程序)?望大侠指点下  谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
soufei
1楼-- · 2019-07-16 21:48
 精彩回答 2  元偷偷看……
神一滴
2楼-- · 2019-07-17 03:39
给你个软件  我也是从论坛下载的

spwm_calc_v1.3.2.rar

167.66 KB, 下载次数: 798

spwm波表

2467823362
3楼-- · 2019-07-17 06:06
软件不能用啊{:1:}{:1:}
小粮zz
4楼-- · 2019-07-17 07:02
很久没登了 我去年写的  你们参考一下吧
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;
    }
   
}
青春流年
5楼-- · 2019-07-17 12:02
楼主你现在做的怎么样,用什么做的,能不能给的建议
小粮zz
6楼-- · 2019-07-17 13:13
 精彩回答 2  元偷偷看……

一周热门 更多>