• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

正弦波逆变器SPWM参考

//最近在搞SPWM逆变,贡献一个小程序,FYI

//用18F452调的,只有SPWM波形部分,反馈没加进来,如果需要改幅度,该R_rate的值就好了,范围(1~195)

//晶震10M+PLL锁到40M,RC2输出SPWM波形,RC0为50HZ方波,作为半桥驱动时的交越信号。

void main()
 {    asm("NOP");   
      TRISC=0X00;                //设置I/O口方向
      TRISD=0X00;          //设置I/O口方向
      PORTC=0X00;
      PORTD=0X00;
   //=============LCD init======================
   //   lcd_init();                
   //=============timer0 init===================
   T0CON=0x82; //8分频  ;0xCx is 8bit timer
   TMR0L=0x79;
   TMR0H=0XFE; 
  
   GIE=0X1;                    //开放全局中断
      TMR0IE=1;                   //使能timer0 interrupt   
   //==============PWM init=====================         
      PR2=124;                    //设置PWM频率20K
      CCPR1L=0;                   //设置占空比高8位,init时为0
      CCP1CON=0x0F;               //CCP select PWM mode
      T2CON=0X05;                 //设置TIMER2预分频比并使能T2     
   //==============MAIN LOOP====================

      while(1)

      {  }

}

//===============中断函数=============================
void interrupt ISR(void)
  {    
    if((TMR0IF)&&(TMR0IE))
    {  
    
     TMR0L=0x79;
     TMR0H=0XFE;
     TMR0IF=0;//清除中断标志       
        update_duty();//用3.2K的定时频率按照正弦规律改变脉宽,改64次正好为50HZ的调制正弦波
  }
   }

//下面这部分摘自另一个文件,

unsigned char R_sin=0; //这个变量从0~31变化。
unsigned char R_rate=190;//幅度
void update_duty(void)
{   unsigned int i=0;
 
 if(R_sin==0)
    RC0=!RC0;   //创造交越信号
   
 i=((float)(sin_tab[R_sin]))*R_rate/100;
 
  R_sin++;
 if(R_sin==32)
    R_sin=0;   
    
 CCPR1L=i/4;                   //设置占空比高8位,init时为0
    CCP1CON=0x0F+(i&3)*16;
 }

const unsigned char sin_tab[32]={
 0,25,50,74,98,120,142,162,180,
 197,212,225,235,244,250,254,
 255,254,250,244,235,225,212,
 197,180,162,142,120,98,74,50,25};

全部回复(2)
正序查看
倒序查看
2011-05-06 10:03
这真是一个好东西,但反馈也是很重要的,一个SPWM的芯片其卖点好象就是在稳压做得好不好!
0
回复
2011-05-07 00:26
@萧山老寿
这真是一个好东西,但反馈也是很重要的,一个SPWM的芯片其卖点好象就是在稳压做得好不好!
0
回复