打印

用正弦表怎么生成SPWM

[复制链接]
10693|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Varus|  楼主 | 2018-10-27 20:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
Snow7| | 2018-10-27 21:07 | 只看该作者
用Time_A或者Time_B

使用特权

评论回复
板凳
android2| | 2018-10-27 22:13 | 只看该作者
利用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个,下溢中断赋值就行了

使用特权

评论回复
地板
拉克丝| | 2018-10-27 22:23 | 只看该作者
在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;
  }

使用特权

评论回复
5
lefeng| | 2018-10-27 22:31 | 只看该作者
我现在要生成spwm波,但是不知道占空比怎么计算?载波pWM的频率是40KHZ,调制信号正弦波的频率是2KHZ,pWM的幅度是从0-3.3V。不知道有没有相关的计算公式?

使用特权

评论回复
6
CaLipton| | 2018-10-27 22:57 | 只看该作者
按正弦表来刷TACCRx的值。占空比100%就是1,50%就是0,0%就是-1,按照正弦表的值计算占空比,再计算TACCRx的值

使用特权

评论回复
7
Lewisnx| | 2018-10-27 23:06 | 只看该作者
参考一下吧
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;
    }
   
}

使用特权

评论回复
8
Mattheww| | 2018-10-28 09:42 | 只看该作者
直接建立一个数组复制进去啊

使用特权

评论回复
9
Rollo| | 2018-10-28 15:06 | 只看该作者
查表法最简单。
那些数字用excel简单拖公式就可以得到了。

使用特权

评论回复
10
uboot| | 2023-11-26 10:48 | 只看该作者
swpm 记号

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

155

主题

703

帖子

1

粉丝