消防水带圆织机价格:SPWM程序(PICC)

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 21:29:08
贡献一个我写的SPWM程序(PICC)2010-05-23 18:01

//最近在搞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};

思想是:SPWM输出20KHZ,以3.2K的频率修改脉宽,改64次为一个周期,得到50HZ的SPWM波