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

📄 aci3_4.c

📁 这是ti公司的一个重要的技术文档源码! 三相异步电机无速度传感器直接磁场定向控制! 主要是用于F2812
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ***************** LEVEL3 ***************** */
#if (BUILDLEVEL==LEVEL3)

    rc1.target_value = _IQ(speed_ref);
    rc1.calc(&rc1);

    rg1.rmp_freq = rc1.setpt_value;
    rg1.calc(&rg1);
     
    pid1_iq.pid_ref_reg3 = _IQ(Iq_ref);
	pid1_iq.pid_fdb_reg3 = park1.qe;
	pid1_iq.calc(&pid1_iq);

    pid1_id.pid_ref_reg3 = _IQ(Id_ref);
	pid1_id.pid_fdb_reg3 = park1.de;
	pid1_id.calc(&pid1_id);

    ipark1.de = pid1_id.pid_out_reg3;
    ipark1.qe = pid1_iq.pid_out_reg3;	
    ipark1.ang = rg1.rmp_out;
    ipark1.calc(&ipark1);

  	svgen_dq1.Ualfa = ipark1.ds;
 	svgen_dq1.Ubeta = ipark1.qs;
  	svgen_dq1.calc(&svgen_dq1);	

    pwm1.Mfunc_c1 = (int)_IQtoIQ15(svgen_dq1.Ta); /* Mfunc_c1 is in Q15 */
    pwm1.Mfunc_c2 = (int)_IQtoIQ15(svgen_dq1.Tb); /* Mfunc_c2 is in Q15 */  
    pwm1.Mfunc_c3 = (int)_IQtoIQ15(svgen_dq1.Tc); /* Mfunc_c3 is in Q15 */
	pwm1.update(&pwm1);
	
    ilg2_vdc1.read(&ilg2_vdc1);
	
 	clarke1.as = _IQ15toIQ((long)ilg2_vdc1.Imeas_a);
  	clarke1.bs = _IQ15toIQ((long)ilg2_vdc1.Imeas_b);
	clarke1.calc(&clarke1);
	
    park1.ds = clarke1.ds;
    park1.qs = clarke1.qs;
    park1.ang = rg1.rmp_out;
    park1.calc(&park1);

    volt1.DC_bus = _IQ15toIQ((long)ilg2_vdc1.Vdc_meas);
    volt1.Mfunc_V1 = svgen_dq1.Ta;
    volt1.Mfunc_V2 = svgen_dq1.Tb;
    volt1.Mfunc_V3 = svgen_dq1.Tc;        
 	volt1.calc(&volt1);

    if((cap1.read(&cap1))==0)             /* Call the capture read function */
    {
        speed1.time_stamp=(long)(cap1.time_stamp);    /* Read out new time stamp        */
        speed1.calc(&speed1);                 /* Call the speed calulator       */
    }

    pwmdac_ch1 = (int)_IQtoIQ15(svgen_dq1.Ta);
    pwmdac_ch2 = (int)_IQtoIQ15(svgen_dq1.Tb);    
    pwmdac_ch3 = (int)_IQtoIQ15(svgen_dq1.Tc);    

    drv1.enable_flg = enable_flg;
    drv1.update(&drv1);

#endif /* (BUILDLEVEL==LEVEL3) */

/* ***************** LEVEL4 ***************** */
#if (BUILDLEVEL==LEVEL4)

    rc1.target_value = _IQ(speed_ref);
    rc1.calc(&rc1);

    rg1.rmp_freq = rc1.setpt_value;
    rg1.calc(&rg1);
    
    pid1_iq.pid_ref_reg3 = _IQ(Iq_ref);
	pid1_iq.pid_fdb_reg3 = park1.qe;
	pid1_iq.calc(&pid1_iq);

    pid1_id.pid_ref_reg3 = _IQ(Id_ref);
	pid1_id.pid_fdb_reg3 = park1.de;
	pid1_id.calc(&pid1_id);

    ipark1.de = pid1_id.pid_out_reg3;
    ipark1.qe = pid1_iq.pid_out_reg3;	
    ipark1.ang = rg1.rmp_out;
    ipark1.calc(&ipark1);

  	svgen_dq1.Ualfa = ipark1.ds;
 	svgen_dq1.Ubeta = ipark1.qs;
  	svgen_dq1.calc(&svgen_dq1);	

    pwm1.Mfunc_c1 = (int)_IQtoIQ15(svgen_dq1.Ta); /* Mfunc_c1 is in Q15 */
    pwm1.Mfunc_c2 = (int)_IQtoIQ15(svgen_dq1.Tb); /* Mfunc_c2 is in Q15 */  
    pwm1.Mfunc_c3 = (int)_IQtoIQ15(svgen_dq1.Tc); /* Mfunc_c3 is in Q15 */
	pwm1.update(&pwm1);
	
    ilg2_vdc1.read(&ilg2_vdc1);
	
 	clarke1.as = _IQ15toIQ((long)ilg2_vdc1.Imeas_a);
  	clarke1.bs = _IQ15toIQ((long)ilg2_vdc1.Imeas_b);
	clarke1.calc(&clarke1);
	
    park1.ds = clarke1.ds;
    park1.qs = clarke1.qs;
    park1.ang = rg1.rmp_out;
    park1.calc(&park1);

    volt1.DC_bus = _IQ15toIQ((long)ilg2_vdc1.Vdc_meas);
    volt1.Mfunc_V1 = svgen_dq1.Ta;
    volt1.Mfunc_V2 = svgen_dq1.Tb;
    volt1.Mfunc_V3 = svgen_dq1.Tc;        
 	volt1.calc(&volt1);

 	fe1.u_ds_fe = volt1.Vdirect;
	fe1.u_qs_fe = volt1.Vquadra;
 	fe1.i_ds_fe = clarke1.ds;
	fe1.i_qs_fe = clarke1.qs;
 	fe1.calc(&fe1);

 	se1.i_ds_se = clarke1.ds;
	se1.i_qs_se = clarke1.qs;
 	se1.psi_dr_se = fe1.psi_dr_fe;
	se1.psi_qr_se = fe1.psi_qr_fe;
	se1.theta_r_se = fe1.theta_r_fe;
 	se1.calc(&se1);

    if((cap1.read(&cap1))==0)             /* Call the capture read function */
    {
        speed1.time_stamp=(long)(cap1.time_stamp);    /* Read out new time stamp        */
        speed1.calc(&speed1);                 /* Call the speed calulator       */
    }

    pwmdac_ch1 = (int)_IQtoIQ15(rg1.rmp_out);
    pwmdac_ch2 = (int)_IQtoIQ15(fe1.theta_r_fe);    
    pwmdac_ch3 = (int)_IQtoIQ15(clarke1.as);    

    drv1.enable_flg = enable_flg;
    drv1.update(&drv1);

#endif /* (BUILDLEVEL==LEVEL4) */

/* ***************** LEVEL5 ***************** */
#if (BUILDLEVEL==LEVEL5)

    if (speed_loop_count==speed_loop_ps)
     {
      pid1_spd.pid_ref_reg3 = _IQ(speed_ref);
      pid1_spd.pid_fdb_reg3 = speed1.speed_prd;
	  pid1_spd.calc(&pid1_spd);
      speed_loop_count=1;
     }
    else speed_loop_count++; 

    pid1_iq.pid_ref_reg3 = pid1_spd.pid_out_reg3;
	pid1_iq.pid_fdb_reg3 = park1.qe;
	pid1_iq.calc(&pid1_iq);

    pid1_id.pid_ref_reg3 = _IQ(Id_ref);
	pid1_id.pid_fdb_reg3 = park1.de;
	pid1_id.calc(&pid1_id);

    ipark1.de = pid1_id.pid_out_reg3;
    ipark1.qe = pid1_iq.pid_out_reg3;	
    ipark1.ang = fe1.theta_r_fe;
    ipark1.calc(&ipark1);

  	svgen_dq1.Ualfa = ipark1.ds;
 	svgen_dq1.Ubeta = ipark1.qs;
  	svgen_dq1.calc(&svgen_dq1);	

    pwm1.Mfunc_c1 = (int)_IQtoIQ15(svgen_dq1.Ta); /* Mfunc_c1 is in Q15 */
    pwm1.Mfunc_c2 = (int)_IQtoIQ15(svgen_dq1.Tb); /* Mfunc_c2 is in Q15 */  
    pwm1.Mfunc_c3 = (int)_IQtoIQ15(svgen_dq1.Tc); /* Mfunc_c3 is in Q15 */
	pwm1.update(&pwm1);
	
    ilg2_vdc1.read(&ilg2_vdc1);
	
 	clarke1.as = _IQ15toIQ((long)ilg2_vdc1.Imeas_a);
  	clarke1.bs = _IQ15toIQ((long)ilg2_vdc1.Imeas_b);
	clarke1.calc(&clarke1);
	
    park1.ds = clarke1.ds;
    park1.qs = clarke1.qs;
    park1.ang = fe1.theta_r_fe;
    park1.calc(&park1);

    volt1.DC_bus = _IQ15toIQ((long)ilg2_vdc1.Vdc_meas);
    volt1.Mfunc_V1 = svgen_dq1.Ta;
    volt1.Mfunc_V2 = svgen_dq1.Tb;
    volt1.Mfunc_V3 = svgen_dq1.Tc;        
 	volt1.calc(&volt1);

 	fe1.u_ds_fe = volt1.Vdirect;
	fe1.u_qs_fe = volt1.Vquadra;
 	fe1.i_ds_fe = clarke1.ds;
	fe1.i_qs_fe = clarke1.qs;
 	fe1.calc(&fe1);

 	se1.i_ds_se = clarke1.ds;
	se1.i_qs_se = clarke1.qs;
 	se1.psi_dr_se = fe1.psi_dr_fe;
	se1.psi_qr_se = fe1.psi_qr_fe;
	se1.theta_r_se = fe1.theta_r_fe;
 	se1.calc(&se1);

    if((cap1.read(&cap1))==0)             /* Call the capture read function */
    {
        speed1.time_stamp=(long)(cap1.time_stamp);    /* Read out new time stamp        */
        speed1.calc(&speed1);                 /* Call the speed calulator       */
    }

    pwmdac_ch1 = (int)_IQtoIQ15(svgen_dq1.Ta);
    pwmdac_ch2 = (int)_IQtoIQ15(clarke1.as);    
    pwmdac_ch3 = (int)_IQtoIQ15(fe1.theta_r_fe);    

    drv1.enable_flg = enable_flg;
    drv1.update(&drv1);

#endif /* (BUILDLEVEL==LEVEL5) */

/* ***************** LEVEL6 ***************** */
#if (BUILDLEVEL==LEVEL6)

    if (speed_loop_count==speed_loop_ps)
     {
      pid1_spd.pid_ref_reg3 = _IQ(speed_ref);
      pid1_spd.pid_fdb_reg3 = se1.wr_hat_se;
	  pid1_spd.calc(&pid1_spd);
      speed_loop_count=1;
     }
    else speed_loop_count++; 

    pid1_iq.pid_ref_reg3 = pid1_spd.pid_out_reg3;
	pid1_iq.pid_fdb_reg3 = park1.qe;
	pid1_iq.calc(&pid1_iq);

    pid1_id.pid_ref_reg3 = _IQ(Id_ref);
	pid1_id.pid_fdb_reg3 = park1.de;
	pid1_id.calc(&pid1_id);

    ipark1.de = pid1_id.pid_out_reg3;
    ipark1.qe = pid1_iq.pid_out_reg3;	
    ipark1.ang = fe1.theta_r_fe;
    ipark1.calc(&ipark1);

  	svgen_dq1.Ualfa = ipark1.ds;
 	svgen_dq1.Ubeta = ipark1.qs;
  	svgen_dq1.calc(&svgen_dq1);	

    pwm1.Mfunc_c1 = (int)_IQtoIQ15(svgen_dq1.Ta); /* Mfunc_c1 is in Q15 */
    pwm1.Mfunc_c2 = (int)_IQtoIQ15(svgen_dq1.Tb); /* Mfunc_c2 is in Q15 */  
    pwm1.Mfunc_c3 = (int)_IQtoIQ15(svgen_dq1.Tc); /* Mfunc_c3 is in Q15 */
	pwm1.update(&pwm1);
	
    ilg2_vdc1.read(&ilg2_vdc1);
	
 	clarke1.as = _IQ15toIQ((long)ilg2_vdc1.Imeas_a);
  	clarke1.bs = _IQ15toIQ((long)ilg2_vdc1.Imeas_b);
	clarke1.calc(&clarke1);
	
    park1.ds = clarke1.ds;
    park1.qs = clarke1.qs;
    park1.ang = fe1.theta_r_fe;
    park1.calc(&park1);

    volt1.DC_bus = _IQ15toIQ((long)ilg2_vdc1.Vdc_meas);
    volt1.Mfunc_V1 = svgen_dq1.Ta;
    volt1.Mfunc_V2 = svgen_dq1.Tb;
    volt1.Mfunc_V3 = svgen_dq1.Tc;        
 	volt1.calc(&volt1);

 	fe1.u_ds_fe = volt1.Vdirect;
	fe1.u_qs_fe = volt1.Vquadra;
 	fe1.i_ds_fe = clarke1.ds;
	fe1.i_qs_fe = clarke1.qs;
 	fe1.calc(&fe1);

 	se1.i_ds_se = clarke1.ds;
	se1.i_qs_se = clarke1.qs;
 	se1.psi_dr_se = fe1.psi_dr_fe;
	se1.psi_qr_se = fe1.psi_qr_fe;
	se1.theta_r_se = fe1.theta_r_fe;
 	se1.calc(&se1);
     
    if((cap1.read(&cap1))==0)             /* Call the capture read function */
    {
        speed1.time_stamp=(long)(cap1.time_stamp);    /* Read out new time stamp        */
        speed1.calc(&speed1);                 /* Call the speed calulator       */
    }

    pwmdac_ch1 = (int)_IQtoIQ15(svgen_dq1.Ta);
    pwmdac_ch2 = (int)_IQtoIQ15(clarke1.as);    
    pwmdac_ch3 = (int)_IQtoIQ15(fe1.theta_r_fe);    

    drv1.enable_flg = enable_flg;
    drv1.update(&drv1);

#endif /* (BUILDLEVEL==LEVEL6) */   

	pwmdac1.update(&pwmdac1);  

// Enable more interrupts from this timer
	EvaRegs.EVAIMRA.bit.T1UFINT = 1;
	
// Note: To be safe, use a mask value to write to the entire
	// EVAIFRA register.  Writing to one bit will cause a read-modify-write
	// operation that may have the result of writing 1's to clear 
	// bits other then those intended. 
    EvaRegs.EVAIFRA.all = BIT9;
	
// Acknowledge interrupt to recieve more interrupts from PIE group 2
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
}

//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

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