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.

svgen_dq



由于需要使用fpga做pwm发生器,用ti的control suite 里的svgen_dq.h更改得到,将本来程序输出Ta,Tb,Tc换成T1,T2, T0.发给FPGA作为比较

点,同时发送的还有扇区信息,现在做开环的实验,即给定正弦信号通过clarke变换的 alpha、beta变换。将这个信号给svgen_dq,但是从输出的fpga波形来看

几个扇区是不正确的

clarke变换是经过修改的,因为svgen_dq.c里的判断扇区的反变换部分将Ua =  Ubeta;

clarke.c

   v->Beta = v->As;

   v->Alpha = (-v->As - 2*v->Bs)*0.57735026918963;  // 1/sqrt(3) = 0.57735026918963

svgen_dq.c

iq Va,Vb,Vc,temp_sv1,temp_sv2;
int Sector = 0;  // Sector is treated as Q0 - independently with global Q


                                                                                                                                                                           
    temp_sv1=_IQdiv2(v->Ubeta);                                                                             
    temp_sv2=_IQmpy(_IQ(0.8660254),v->Ualpha);                                                                                                         
    Va = v->Ubeta;                                                                 
    Vb = -temp_sv1 + temp_sv2;                                                 
    Vc = -temp_sv1 - temp_sv2;                                                                                             
    if (Va>_IQ(0)) Sector = 1;                                                     
    if (Vb>_IQ(0)) Sector = Sector+2;                                             
    if (Vc>_IQ(0)) Sector = Sector+4;                                             
                    
    Va = v->Ubeta;                                                     
    Vb = temp_sv1 + temp_sv2;                                                     
    Vc = temp_sv1 - temp_sv2;                                             
    v->VecSector = Sector    ;            
                                                                                
switch(Sector)                                                                    
{                                                                                
    case 0:                                                                        
    v->T0 = _IQ(0);                                                            
    v->T1 = _IQ(0);                                                            
    v->T2 = _IQ(0);                                                        
    break;                                                                        
    case 1:                       
    v->T1 = Vc;                                                                    
    v->T2 = Vb;                                                                    
    v->T0 = _IQmpy((_IQ(1)-v->T1-v->T2),_IQ(0.5));   
    break;                                                                        
    case 2:                      
    v->T1 = Vb;                                                                
    v->T2 = -Va;        
    v->T0 = _IQmpy((_IQ(1)-v->T1-v->T2),_IQ(0.5));                               
    break;                                                                        
    case 3:                      
    v->T1 = -Vc;                                                                    
    v->T2 = Va;                                                                
     v->T0 = _IQmpy((_IQ(1)-v->T1-v->T2),_IQ(0.5));  
    break;                                                                        
    case 4:                     
    v->T1 = -Va;                                                                    
    v->T2 = Vc;                                                                 
    v->T0 = _IQmpy((_IQ(1)-v->T1-v->T2),_IQ(0.5));   
    break;                                                                        
    case 5:                     
    v->T1 = Va;                                                                    
    v->T2 = -Vb;                                            
    v->T0 = _IQmpy((_IQ(1)-v->T1-v->T2),_IQ(0.5));
    break;                                                                        
    case 6:                     
    v->T1 = -Vb;                                                                    
    v->T2 = -Vc;                                                                    
    v->T0 = _IQmpy((_IQ(1)-v->T1-v->T2),_IQ(0.5));
    break;