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

📄 c_pwm1.c

📁 该程序是基于DSPLF243编写的交流感应电机双馈试验台的控制程序。现场调试已过
💻 C
📖 第 1 页 / 共 2 页
字号:
	
	u_dc_temp = ADC1_DATA;      /*read ADC1 and ADC2 result in sequence*/ 
	i_a = ADC1_DATA;
	i_b = ADC1_DATA;
	u_dc.control = ADC1_DATA;  
	u_ab.nonce = ADC2_DATA;       
	u_bc.nonce = ADC2_DATA;         
	temp = ADC2_DATA;
	temp = 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;
	
	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;
    if ((u_bc.former < 0) && (u_bc.nonce >= 0))  phase.angle = 0; /*检测A相电压上升沿过零点*/
    
    /*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; */
    	
	
    /* 预测电网电压的空间矢量的值 */	
	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_A, 12);
	u_bc.forecast = SLONGMUL(u_bc.forecast, K_V_B, 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;
		} 
	}
	
	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);
        
    if (i_set.amp > I_SET_MAX)  i_set.amp = I_SET_MAX;       /* 限制i_set的幅度 */
    if (-i_set.amp > I_SET_MAX) i_set.amp = -I_SET_MAX;
    
    
    /* 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));
     
    /* 根据u_ac_dc.d,q的值来计算phase.sector */
    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_l.d;         
         i_set_amp_array[t_step] = u_l.q;  
         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 <= 50) cmpr0 = 50;
    if (cmpr1 <= 50) cmpr1 = 50;
    if (cmpr2 <= 50) cmpr2 = 50;
    if (cmpr0 > (T1_PER - 50)) cmpr0 = T1_PER - 50; 
    if (cmpr1 > (T1_PER - 50)) cmpr1 = T1_PER - 50; 
    if (cmpr2 > (T1_PER - 50)) cmpr2 = T1_PER - 50; 
    
    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 + -