This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于永磁同步电机控制中的SVPWM



请问,关于永磁同步电机用SVPWM控制:

我看到的程序都是,在进行电机控制的时候,首先都是配置成 0 中断,然后再在 0 中断里,配置成周期中断,

我想问的是,为什么需要这么做啊?

我的想法是,直接配置成周期中断,然后,比较寄存器配置成影子模式,0 时刻装载新的值。这样,每次计数器的值等于PRD值的时候,

就进入中断,然后更新比较寄存器的值,把更新后的值,写入比较寄存器的影子寄存器,之后在0 时刻,影子寄存器内的值,装载进比较寄存器,

这样正好可以产生SVPWM。

那么请问一下,为什么我看到的程序,都需要,配置成 0 中断,然后再在 0 中断里,配置成周期中断,呢?

我这种做法,不行吗?

  • 两种中断中实现的功能是否相同?

  • 对的 ,两种中断进入后,都是执行同一个中断子程序,我贴一段这个子程序的代码:

    	if(EPwm1Regs.ETSEL.bit.INTSEL == ET_CTR_ZERO)
    	{
               EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
               EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
    	   EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
               EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;
    	}
    	else
    	{	  
        	   tbPrdNext = (Uint16)((long)(1.0/(CPUPRD*(1<<EPWM1_TOTAL_CLKDIV)*2))/(long)fsHzNext);
    	   EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
    	   EPwm1Regs.TBPRD = tbPrdNext;  
               EPwm2Regs.TBPRD = tbPrdNext;  
               EPwm3Regs.TBPRD = tbPrdNext;
    	}

    之后的代码里,有电流Clarke变换,Park变换,Park逆变换等等,最后还有空间矢量SVPWM调制,

    svgen1.Ualpha = -Ualpha1;
    svgen1.Ubeta = -Ubeta1;	 
    svgen1.vdc = vdc1;
    svgen1.vdcbase = 100;
    svgen1.Svpwm_Prd = T1PWM_PRD;
    svgen1.calc( svgen1 );
    svgen1.gen( svgen1 );

  • Changjiang Liu 说:

    两种中断中实现的功能是否相同?

    对的 ,两种中断进入后,都是执行同一个中断子程序,我贴一段这个子程序的代码:

    if(EPwm1Regs.ETSEL.bit.INTSEL == ET_CTR_ZERO)
    
    {
    
           EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
    
           EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
    
       EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
    
           EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;
    
    }
    
    else
    
    {     
    
           tbPrdNext = (Uint16)((long)(1.0/(CPUPRD*(1<<EPWM1_TOTAL_CLKDIV)*2))/(long)fsHzNext);
    
       EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
    
       EPwm1Regs.TBPRD = tbPrdNext;  
    
           EPwm2Regs.TBPRD = tbPrdNext;  
    
           EPwm3Regs.TBPRD = tbPrdNext;
    
    }
    

    之后的代码里,有电流Clarke变换,Park变换,Park逆变换等等,最后还有空间矢量SVPWM调制,

    svgen1.Ualpha = -Ualpha1;
    
    svgen1.Ubeta = -Ubeta1;  
    
    svgen1.vdc = vdc1;
     
    
    
    
    
    ?
    
    1
    2
    3
    4
     
    svgen1.vdcbase = 100;
    
    svgen1.Svpwm_Prd = T1PWM_PRD;
    
    svgen1.calc( svgen1 );
    
    svgen1.gen( svgen1 );
     
    
  • Changjiang Liu 说:

    两种中断中实现的功能是否相同?

    help!