⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svpwm.c

📁 电机无速度传感器矢量控制在DSP2407下的实现程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    
    u_ab.former = u_ab.nonce;
	u_bc.former = u_bc.nonce;
	
    while (ADC1_BUSY);          /*convertion of ADC1 and ADC2 complete*/
    while (ADC2_BUSY);      
	
	u_ab.nonce = ADC1_DATA;      /*read ADC1 and ADC2 result in sequence*/ 
	u_bc.nonce = ADC1_DATA;
	i_a = ADC1_DATA;
	i_b = ADC1_DATA;  
	
	u_dc_temp = ADC2_DATA;       
	i_dc = ADC2_DATA;         
	u_dc.control = ADC2_DATA;
	key = ADC2_DATA;
	
	ADC12_STOP;                 /*stop ADC1 and ADC2*/		
    
	/*零偏调整*/
	i_a += I_A_E;
	i_b += I_B_E;
	u_dc_temp -= U_DC_E;
	u_ab.nonce -= U_AB_E;
	u_bc.nonce += U_BC_E;
	
	/*取出低12位*/
	u_dc_temp &= 0x0FFF;
	i_a &= 0x0FFF;
	i_b &= 0x0FFF;
	u_dc.control &= 0x0FFF;
	u_ab.nonce &= 0x0FFF;
	u_bc.nonce &= 0x0FFF;
    
    /*判断正负,并得到实际值*/
	if (u_dc_temp >= 2048)      u_dc_temp -= 4096; 
	if (i_a >= 2048)		    i_a -= 4096;
	if (i_b >= 2048)            i_b -= 4096;  
	if (u_dc.control >= 2048)   u_dc.control -= 4096;
	if (u_ab.nonce >= 2048)     u_ab.nonce -= 4096;    
    if (u_bc.nonce >= 2048)     u_bc.nonce -= 4096;
    
    if (u_dc.control <= 0)		u_dc.control = 0;
    
    /*检测BC线电压上升沿过零点*/
    if ((u_bc.former < 0) && (u_bc.nonce >= 0))  phase.angle = 0; 
    
    /*u_a_array[t_step] = u_ab.nonce;
    u_b_array[t_step] = u_bc.nonce; 
    u_c_array[t_step] = u_bc.nonce;
    u_dc_array[t_step] = u_dc_temp;
    i_a_array[t_step] = i_a;
    i_b_array[t_step] = i_b;
    	
	
    /* 预测电网电压的空间矢量的值并进行3/2变换 */	
	u_ab.forecast = u_ab.nonce + ((u_ab.nonce - u_ab.former)>>1);
	u_bc.forecast = u_bc.nonce + ((u_bc.nonce - u_bc.former)>>1);
    
	u_ab.forecast = SLONGMUL(u_ab.forecast, K_V_AB, 12);
	u_bc.forecast = SLONGMUL(u_bc.forecast, K_V_BC, 12);
	u_ca.forecast = - u_ab.forecast - u_bc.forecast;
		                 
    
    u_ac_set.d = ((u_ab.forecast - u_ca.forecast)>>1);      
    u_ac_set.q = SLONGMUL((SQUARE_3), u_bc.forecast, 12);
   
    	
   /* 对直流电压采样值用平均值方法进行滤波 */
    u_dc_temp = SLONGMUL(u_dc_temp , K_V_DC , 12);		
    u_dc_sam_array[p_u_dc_sam] = u_dc_temp;
    
    p_u_dc_sam++;
    if (p_u_dc_sam >= 16) p_u_dc_sam = 0;
        
    u_dc.sam = 0;               
    for (i = 0; i < 16; i++)	u_dc.sam += u_dc_sam_array[i] >> 4;
    
    /*判断直流电压是否过压或欠压*/    
	if (u_dc_temp > U_DC_HIGHEST)	
	{
		DISABLE_PWM;
		ERROR;
	}
	else if (u_dc_temp < U_DC_LOWEST)	
	{
		DISABLE_PWM; 
		ERROR;
	} 
	else
	{    
		if (SWITCH_ON)
		{
			ENABLE_PWM;    
			RUNNING;
		} 
	}
	
	/*直流侧电压PI调节*/
	asm("  SETC OVM") ;               /*当有溢出时,ACC被填充为最大值*/
    
    if(u_dc.set >= U_DC_SET)   u_dc.set = U_DC_SET;
    else  u_dc.set++;
    
    u_dc.err = u_dc.set - u_dc.sam;                
    u_dc.err_I = u_dc.err_I + SLONGMUL(u_dc.err , K_DC_I , 12); 
    /* 防止溢出 */
    if (u_dc.err_I >= U_DC_ERR_MAX)   u_dc.err_I = U_DC_ERR_MAX;
    if (u_dc.err_I <= -U_DC_ERR_MAX)  u_dc.err_I = -U_DC_ERR_MAX;    
    	
    i_set.amp = u_dc.err_I + SLONGMUL(u_dc.err , K_DC_P1 ,12);
    
    /* 限制i_set的幅度 */    
    if (i_set.amp > I_SET_MAX)  i_set.amp = I_SET_MAX;       
    if (-i_set.amp > I_SET_MAX) i_set.amp = -I_SET_MAX;
    
    /*i_set.amp = 3000;*/
    
    /* C相电流计算 */
    i_a = SLONGMUL(i_a , K_I_A , 12); 
    i_b = SLONGMUL(i_b , K_I_B , 12);
    /*由于接线的原因,电流需要反相*/
    i_a = -i_a;
    i_b = -i_b;
    i_c = - i_a - i_b;
    
    
    /*判断是否过流,是则进入保护*/
    if ((i_a > I_AC_MAX) || (i_b > I_AC_MAX) || (i_c > I_AC_MAX))		
    {
    	over_current();
    }
    if ((i_a < -I_AC_MAX) || (i_b < -I_AC_MAX) || (i_c < -I_AC_MAX))	
    {
    	over_current();
    } 
    
    /* d,q轴电流计算 */
    i_sam.d = i_a - ((i_b + i_c)>>1);
    i_sam.q = SLONGMUL((SQUARE_3) , (i_b - i_c) , 12);
	
	/*相位控制*/
    phase.angle++;
    if (phase.angle >= 100){ 
        phase.angle = 0;
    }           
    
    /*计算交流电流的设定值*/
    i_set.q = SLONGMUL(i_set.amp , sin_table[phase.angle], 15);        
    if (phase.angle < 75)
	i_set.d = SLONGMUL(i_set.amp , sin_table[phase.angle + 25], 15); 
    else                                                             
    i_set.d = SLONGMUL(i_set.amp , sin_table[phase.angle - 75], 15);

    /* 电流环P调节计算 */
    if (k_i_p < K_I_P_MAX)  k_i_p ++;
    else  k_i_p = K_I_P_MAX;
    
    i_err.d = i_set.d - i_sam.d;
    i_err.q = i_set.q - i_sam.q;
    i_err.d = SLONGMUL(i_err.d , k_i_p , 12);
    i_err.q = SLONGMUL(i_err.q , k_i_p , 12);

	/* 由i_err得到电感上的压降 u_l */
    u_l.d = SLONGMUL(i_err.d , K_V_L ,12);
    u_l.q = SLONGMUL(i_err.q , K_V_L ,12);
    
	/* Put the value in the array */
    u_set_d_array[t_step] = u_ac_set.d;
	u_set_q_array[t_step] = u_ac_set.q; 
	
	/* 计算整流器桥臂中点电压 */ 
    u_ac_set.d = u_ac_set.d - u_l.d;   
    u_ac_set.q = u_ac_set.q - u_l.q;  

	/*u_ac_set还要乘以0.810283*/
	u_ac_set.d = SLONGMUL(u_ac_set.d, SQUARE_2_3, 12); 
	u_ac_set.q = SLONGMUL(u_ac_set.q, SQUARE_2_3, 12); 

    if(u_ac_set.d >= U_AC_SET_MAX)  u_ac_set.d = U_AC_SET_MAX;
    if(u_ac_set.d <= -U_AC_SET_MAX) u_ac_set.d = -U_AC_SET_MAX;
    if(u_ac_set.q >= U_AC_SET_MAX)  u_ac_set.q = U_AC_SET_MAX;
    if(u_ac_set.q <= -U_AC_SET_MAX) u_ac_set.q = -U_AC_SET_MAX;

    /* 计算整流器桥臂中点电压相对直流侧电压的标么值 */
    u_ac_dc.d =((sint)h_divide(u_ac_set.d , u_dc.sam));
    u_ac_dc.q =((sint)h_divide(u_ac_set.q , u_dc.sam));
     
    /*判断整流器桥臂中点电压矢量所在的扇区*/
    temp_d = SLONGMUL(u_ac_dc.d, SQUARE_3_3, 12);
    temp_q = u_ac_dc.q;
	if (u_ac_dc.q >= 0) 
	{
		if (temp_q < temp_d) phase.sector = 0;
		else if ((temp_q > temp_d) && (temp_q > -temp_d)) phase.sector = 1;
		else  phase.sector = 2;
	} 
	else 
	{
		if (temp_q > temp_d) phase.sector = 3;
		else if ((temp_q < temp_d) && (temp_q < -temp_d)) phase.sector = 4;
		else phase.sector = 5;
	}
                     
			 
    /* Put the value in the array */
         u_a_array[t_step] = u_ab.forecast;
         u_b_array[t_step] = u_bc.forecast;
         u_c_array[t_step] = u_ca.forecast;
         i_a_array[t_step] = i_a;
         i_b_array[t_step] = i_b;
         u_dc_array[t_step] = u_dc.sam;
         u_dc_err_I_array[t_step] = u_dc.err_I;         
         i_set_amp_array[t_step] = i_set.amp;  
         i_err_d_array[t_step] = i_sam.d;
         i_err_q_array[t_step] = i_sam.q;
         i_set_d_array[t_step] = i_set.d;
         i_set_q_array[t_step] = i_set.q; 
         phase_angle_array[t_step] =  phase.angle;
                  
                  
    /* 计算各比较寄存器的装载值 */
    cmpr1=SLONGMUL(u_ac_dc.d , decomp[phase.sector][0][0],12) + SLONGMUL(u_ac_dc.q , decomp[phase.sector][1][0],12);     
    cmpr1=SLONGMUL(cmpr1 , T1_PER,12);
    if (cmpr1 < 0) cmpr1 = 0;

    cmpr2 = SLONGMUL(u_ac_dc.d , decomp[phase.sector][0][1],12) + SLONGMUL(u_ac_dc.q , decomp[phase.sector][1][1],12);     
    cmpr2 = SLONGMUL(cmpr2 , T1_PER,12);
    if (cmpr2 < 0) cmpr2 = 0;

    cmpr0 = (T1_PER - cmpr2 - cmpr1) >> 1;
    if (cmpr0 < 0)
    {
    	cmpr2 = cmpr2 + cmpr0;
    	cmpr1 = cmpr1 + cmpr0;
    	cmpr0 = 0;                
	}       
         
    cmpr1 += cmpr0;
    cmpr2 += cmpr1; 

    if (cmpr0 <= 110) cmpr0 = 110;
    if (cmpr1 <= 110) cmpr1 = 110;
    if (cmpr2 <= 110) cmpr2 = 110;
    if (cmpr0 > (T1_PER - 110)) cmpr0 = T1_PER - 110; 
    if (cmpr1 > (T1_PER - 110)) cmpr1 = T1_PER - 110; 
    if (cmpr2 > (T1_PER - 110)) cmpr2 = T1_PER - 110; 
    
    cmpr0_array[t_step] = cmpr0;
    cmpr1_array[t_step] = cmpr1;
    cmpr2_array[t_step] = cmpr2; 
    
    switch(phase.sector) {
	case 0 : *CMPR1=cmpr0; *CMPR2=cmpr1; *CMPR3=cmpr2; break;
	case 1 : *CMPR2=cmpr0; *CMPR1=cmpr1; *CMPR3=cmpr2; break;
	case 2 : *CMPR2=cmpr0; *CMPR3=cmpr1; *CMPR1=cmpr2; break;
	case 3 : *CMPR3=cmpr0; *CMPR2=cmpr1; *CMPR1=cmpr2; break;
	case 4 : *CMPR3=cmpr0; *CMPR1=cmpr1; *CMPR2=cmpr2; break;
	case 5 : *CMPR1=cmpr0; *CMPR3=cmpr1; *CMPR2=cmpr2; break;
	default: break;}
    *ACTR = 0x0666;  	/*Configure PWM outputs*/
    
    /* 数组指针控制 */
	t_step++;
    if (t_step >= 300){ 
        t_step = 0;
    }

    asm("	CLRC INTM " ); 
    
}    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -