Exemple #1
0
void get_adc_offset()
{
	int LoopCtrl;

	Uint32 RunTimeMsec,StartTimeMsec;
	double u_offset_in, v_offset_in;
	double R_offset_in, S_offset_in;

	double u_offset_out, v_offset_out;
	double R_offset_out, S_offset_out;
	
	UNION32 u32data;

	load_sci_tx_mail_box( "\n***********************"); delay_msecs(10);
	load_sci_tx_mail_box( "\n Start ADC Offset Calc "); delay_msecs(10);
	load_sci_tx_mail_box( "\n***********************"); delay_msecs(10);

	gfRunTime=0.0;
	LoopCtrl = 1;

	while(LoopCtrl == 1)
	{
		if( gfRunTime >= 5.0 ) LoopCtrl = 0;
		RunTimeMsec = ulGetTime_mSec( StartTimeMsec);
		if(RunTimeMsec > 1){
			StartTimeMsec = ulGetNow_mSec( );
			u_offset_in = (double)giAdcUphase;
			v_offset_in = (double)giAdcVphase;
			R_offset_in = (double)giAdcRphase;
			S_offset_in = (double)giAdcSphase;

			LPF1(0.002,10.0,u_offset_in, & u_offset_out);
			LPF1(0.002,10.0,v_offset_in, & v_offset_out);
			LPF1(0.002,10.0,R_offset_in, & R_offset_out);
			LPF1(0.002,10.0,S_offset_in, & S_offset_out);
		}
	}

	if( gfRunTime >= 5.0 ){
		adc_u_offset = (int)u_offset_out;
		adc_v_offset = (int)v_offset_out;

		adc_R_offset = (int)R_offset_out;
		adc_S_offset = (int)S_offset_out;

		u32data.word.word0 = adc_u_offset; write_code_2_eeprom(CODE_adc_u_offset,u32data);
		u32data.word.word0 = adc_v_offset; write_code_2_eeprom(CODE_adc_v_offset,u32data);

		u32data.word.word0 = adc_R_offset; write_code_2_eeprom(CODE_adc_R_offset,u32data);
		u32data.word.word0 = adc_S_offset; write_code_2_eeprom(CODE_adc_S_offset,u32data);
				
		load_sci_tx_mail_box("\n*********************");delay_msecs(10);		
		load_sci_tx_mail_box("\n OK Adc offset Saved ");delay_msecs(10);		
		load_sci_tx_mail_box("\n*********************");delay_msecs(10);		
	}
}
Exemple #2
0
void get_adc_vdc_high()
{
	int LoopCtrl;

	Uint32 RunTimeMsec,StartTimeMsec;
	double adc_Vdc_in, adc_Vdc_out;
	
	UNION32 u32data;

	load_sci_tx_mail_box( "Start ADC at Vdc high"); delay_msecs(10);

	gfRunTime=0.0;
	LoopCtrl = 1;
	gMachineState = STATE_READY;

	while(LoopCtrl == 1)
	{
		if( gfRunTime >= 1.0 ) LoopCtrl = 0;

		RunTimeMsec = ulGetTime_mSec( StartTimeMsec);
		if(RunTimeMsec > 1){
			StartTimeMsec = ulGetNow_mSec( );
			adc_Vdc_in = (double)giAdcVdc;
			LPF1(0.002,10.0,adc_Vdc_in, & adc_Vdc_out);
		}
	}

	if( gfRunTime >= 1.0 ){

		code_adc_vdc_high = adc_Vdc_out;
		u32data.dword = code_adc_vdc_high; write_code_2_eeprom(CODE_adc_vdc_high,u32data);
						
		load_sci_tx_mail_box("OK adc_vdc_high Saved");delay_msecs(10);				
	}
}
Exemple #3
0
void VVVF_Control()
{
	float	Es_m;
	float	Slip;
	float	sgn_freq;
	float	Det_slip;				// sqrt()안의 부호검사
	float	Det_emf;
	
	// 전압 추정시 시간지연(Ts)을 보상
	CosDeltaTheta=cos(we*Ts);
	SinDeltaTheta=sin(we*Ts);
	Us_dq[ds]=Vs_dq[ds]*CosDeltaTheta + Vs_dq[qs]*SinDeltaTheta;
	Us_dq[qs]=-Vs_dq[ds]*SinDeltaTheta + Vs_dq[qs]*CosDeltaTheta;
	Vs_dq[ds]=Us_dq[ds];
	Vs_dq[qs]=Us_dq[qs];
	
	// 주파수 명령
//	if ( gfRunTime < gExcitationTime)		// DC 여자 ==> Flux Setup
	if( gMachineState == STATE_INIT_RUN)
	{
		Freq_ref=0.0;
		Freq_out=0.0;
		reference=0.0;
		we=0.0;
		theta=0.0;	
		SinTheta=0.0;
		CosTheta=1.0;					
		Vs_ref=VF_Vs_Coeff_TrqBoost*Vs_rat;	
	}
	else
	{	
//		RefProc(reference_in, &reference);
		Freq_ref = Freq_rat*reference;
		if (Freq_ref > VF_Freq_TrqBoost)
		{
			// 주파수의 부호
			if (Freq_ref >= 0.0)	sgn_freq =  1.0;
			else						sgn_freq = -1.0;
			
			// 슬립 보상
			Slip = fabs(Freq_slip)*inv_Freq_rat;
			Power_core_rat = gMotorRatePower*(1.0-gMotorRateEffiency/(1.0-S_rat))-1.5*Is_rat*Is_rat*VF_Rs;
			Power_core=0.5*( (1.0+Slip)/(1+S_rat)*(Freq_out*inv_Freq_rat) + (1.0+Slip*Slip)/(1.0+S_rat*S_rat)*(Freq_out*inv_Freq_rat)*(Freq_out*inv_Freq_rat) )*Power_core_rat;
			LPF1(Ts,VF_Slip_Comp_FilterPole,1.5*(Vs_dq[ds]*Is_dq[ds]+Vs_dq[qs]*Is_dq[qs]- VF_Rs_ThermalCoeff*VF_Rs*Is_mag*Is_mag)-Power_core,&Power_gap);	
			Det_slip = Freq_ref*Freq_ref + S_lin*Power_gap;

			if (Det_slip < 0.0)
					LPF1(Ts,VF_Slip_Comp_FilterPole,-0.5*sqrt(fabs(S_lin*Power_gap)),&Freq_slip);
			else	LPF1(Ts,VF_Slip_Comp_FilterPole,0.5*(sqrt(Det_slip)-fabs(Freq_ref)),&Freq_slip);
		
			// 슬립 제한
			if (Freq_slip>2.0*Freq_slip_rat)			Freq_slip=2.0*Freq_slip_rat;
			else if (Freq_slip<-2.0*Freq_slip_rat)	Freq_slip=-2.0*Freq_slip_rat;

			Freq_out=Freq_ref + sgn_freq*Freq_slip;

		}
		else
		{	
			Freq_out=Freq_ref;
			Power_gap=0.0;
			Freq_slip=0.0;
		}	
	
		// 각도 계산 : 주파수 명령 + 슬립 ==> 새로운 주파수 명령
		we=PI_2*Freq_out;
		theta+=we*Ts;

		if (theta>PI)			theta-=PI_2;
		else if (theta<-PI)	theta+=PI_2;		

		SinTheta=sin(theta);		CosTheta=cos(theta);	

		Vs_max=0.57735*Vdc;
		Es_m=VF_Fs_Coeff*fabs(Freq_out)*inv_Freq_rat*Vs_rat;
		if (Es_m>Vs_max)	Es_m=Vs_max;
	
		Is_DQ[DS]= CosTheta*Is_dq[ds] + SinTheta*Is_dq[qs];
		Is_DQ[QS]=-SinTheta*Is_dq[ds] + CosTheta*Is_dq[qs];

		Det_emf=(Es_m*Es_m)-(VF_Rs*Is_DQ[QS])*(VF_Rs*Is_DQ[QS]);  //sqrt안의 음수여부조사
		if ( (Det_emf>0.0) && (fabs(Freq_out)>VF_Freq_TrqBoost) )
				LPF1(Ts,VF_IR_Comp_FilterPole,0.9*(VF_Rs*Is_DQ[DS]+sqrt(Det_emf)-Es_m),&Vs_IR_comp);		
		else	LPF1(Ts,VF_IR_Comp_FilterPole,VF_Vs_Coeff_TrqBoost*Vs_rat,&Vs_IR_comp);	
	
		// 전류 제한기
		if (Is_mag>Is_max)
		{
			del_Vs_comp=(2.0*Vs_rat*inv_Is_rat)*(Is_mag-Is_max);

			if (del_Vs_comp>0.2*Vs_rat)			del_Vs_comp=0.2*Vs_rat;
			else if (del_Vs_comp<-0.2*Vs_rat)	del_Vs_comp=-0.2*Vs_rat;
		}	
		else	del_Vs_comp=0.0;
	
		// 최종 전압 명령
		Vs_ref = Es_m + Vs_IR_comp - del_Vs_comp;		// IR보상, 전류크기 제한 
		if (Vs_ref>Vs_max)	Vs_ref=Vs_max;
	}		
	// 출력 전압
	Vs_dq_ref[ds]=Vs_ref*CosTheta + VF_DeadTimeGain*(Vs_dq_ref[ds]-Vs_dq[ds]);
	Vs_dq_ref[qs]=Vs_ref*SinTheta + VF_DeadTimeGain*(Vs_dq_ref[qs]-Vs_dq[qs]);

	rpm = 60 * Freq_out * inv_P_pair ;
}
Exemple #4
0
void VVVF_Control()
{
	double	Es_m;
	double	Vs_gain;	
	double	Slip;
	double	sgn_freq;
	double	Det_slip;				// sqrt()안의 부호검사
	double	Det_emf;
	
	Is_mag=sqrt(Is_dq[ds]*Is_dq[ds]+Is_dq[qs]*Is_dq[qs]);
	
	// 전압 추정시 시간지연(Ts)을 보상
	CosDeltaTheta=cos(we*Ts);
	SinDeltaTheta=sin(we*Ts);
	Us_dq[ds]=Vs_dq[ds]*CosDeltaTheta + Vs_dq[qs]*SinDeltaTheta;
	Us_dq[qs]=-Vs_dq[ds]*SinDeltaTheta + Vs_dq[qs]*CosDeltaTheta;
	Vs_dq[ds]=Us_dq[ds];
	Vs_dq[qs]=Us_dq[qs];
	
	// 주파수 명령
	if (t<VF_ExcitationTime)		// DC 여자 ==> Flux Setup
	{
		Freq_ref=0.0;
		Freq_out=0.0;
		reference=0.0;
		we=0.0;
		theta=0.0;	
		SinTheta=0.0;
		CosTheta=1.0;	
		
		// 초기 고정자 저항 추정 ==> IR 보상 
		Re_Power=(Vs_dq[ds]*Is_dq[ds]+Vs_dq[qs]*Is_dq[qs]);
		if ( (Is_mag>0.1*Is_rat) && (t>0.1) )
			LPF1(Ts,5.0,Re_Power/(Is_mag*Is_mag),&VF_Rs);			
		Vs_ref=VF_Vs_Coeff_TrqBoost*Vs_rat;	
	}
	else
	{	
		Freq_ref=Freq_rat*reference;
	
		// 주파수의 부호
		if (Freq_ref>=0.0) 	sgn_freq=1.0;
		else				sgn_freq=-1.0;
			
		// 슬립 보상
		Slip=fabs(Freq_slip)*inv_Freq_rat;
		Power_core_rat=Po_rat*(1.0-Effiency_Coeff/(1.0-S_rat))-1.5*Is_rat*Is_rat*VF_Rs;
		Power_core=0.5*( (1.0+Slip)/(1+S_rat)*(Freq_out*inv_Freq_rat) + (1.0+Slip*Slip)/(1.0+S_rat*S_rat)*(Freq_out*inv_Freq_rat)*(Freq_out*inv_Freq_rat) )*Power_core_rat;
		LPF1(Ts,VF_Slip_Comp_FilterPole,1.5*(Vs_dq[ds]*Is_dq[ds]+Vs_dq[qs]*Is_dq[qs] - VF_Rs_ThermalCoeff*VF_Rs*Is_mag*Is_mag)-Power_core,&Power_gap);	
		Det_slip=Freq_ref*Freq_ref + S_lin*Power_gap;
		if (Det_slip<0.0)
				LPF1(Ts,VF_Slip_Comp_FilterPole,-0.5*sqrt(fabs(S_lin*Power_gap)),&Freq_slip);
		else	LPF1(Ts,VF_Slip_Comp_FilterPole,0.5*(sqrt(Det_slip)-fabs(Freq_ref)),&Freq_slip);
		
		// 슬립 제한
		if (Freq_slip>2.0*Freq_slip_rat)
			Freq_slip=2.0*Freq_slip_rat;
		else if (Freq_slip<-2.0*Freq_slip_rat)	
			Freq_slip=-2.0*Freq_slip_rat;
	
		Freq_out=Freq_ref + sgn_freq*Freq_slip;
	
		// 각도 계산 : 주파수 명령 + 슬립 ==> 새로운 주파수 명령
		we=PI_2*Freq_out;
		theta+=we*Ts;
		if (theta>PI)		theta-=PI_2;
		else if (theta<-PI)	theta+=PI_2;		
		SinTheta=sin(theta);
		CosTheta=cos(theta);	

		// 저항에 걸리는 전압강하를 보상하기위해서는 
		// Phase lag(low pass filter)가 반드시 포함되어야 한다.
		// 이는본질적으로 IR보상식은 불안정하기 때문에
		// 강제로 phase delay를 주기위함이며, 이로인해
		// 보상을 안정되게 하기 위함이다.
		// 따라서 VF_IR_Comp_FilterPole은 너무 큰 값을 가질수 없다.
		Vs_max=0.57735*Vdc;
		Es_m=VF_Fs_Coeff*fabs(Freq_out)*inv_Freq_rat*Vs_rat;
		if (Es_m>Vs_max)	Es_m=Vs_max;
	
		Is_DQ[DS]= CosTheta*Is_dq[ds] + SinTheta*Is_dq[qs];
		Is_DQ[QS]=-SinTheta*Is_dq[ds] + CosTheta*Is_dq[qs];

		Det_emf=(Es_m*Es_m)-(VF_Rs*Is_DQ[QS])*(VF_Rs*Is_DQ[QS]);  //sqrt안의 음수여부조사
		if ( (Det_emf>0.0)&&(fabs(Freq_out)>VF_Freq_TrqBoost) )
				LPF1(Ts,VF_IR_Comp_FilterPole,VF_Rs*Is_DQ[DS]+sqrt(Det_emf)-Es_m,&Vs_IR_comp);		
		else	LPF1(Ts,VF_IR_Comp_FilterPole,VF_Vs_Coeff_TrqBoost*Vs_rat,&Vs_IR_comp);	
	
	
		// 전류 제한기
		if (Is_mag>Is_max)
		{
			del_Vs_comp=(2.0*Vs_rat*inv_Is_rat)*(Is_mag-Is_max);
			if (del_Vs_comp>0.1*Vs_rat)	
				del_Vs_comp=0.1*Vs_rat;
			else if (del_Vs_comp<-0.1*Vs_rat)	
				del_Vs_comp=-0.1*Vs_rat;
		}	
		else	del_Vs_comp=0.0;
	
		// 최종 전압 명령
		Vs_ref = Es_m + Vs_IR_comp - del_Vs_comp;		// IR보상, 전류크기 제한 
		if (Vs_ref>Vs_max)
			Vs_ref=Vs_max;
	}	
	
	// 출력 전압
	Vs_dq_ref[ds]=Vs_ref*CosTheta + VF_DeadTimeGain*(Vs_dq_ref[ds]-Vs_dq[ds]);
	Vs_dq_ref[qs]=Vs_ref*SinTheta + VF_DeadTimeGain*(Vs_dq_ref[qs]-Vs_dq[qs]);
}
Exemple #5
0
// 역방향 운전시에 사용된다. : 미리 추정된 고정자 저항값이 사용되며,
// 저항값을 찾지 않으므로 여자시간은 길지 않다.
// 전류 리밋값이 미리 주어져야 한다. 
// 정방향 운전에는 벡터제어가 사용됨.
void ReverseDirection_VVVF_Control()
{
	double	Es_m;
	double	Vs_gain;	
	double	Slip;
	double	sgn_freq;
	double	Det_slip;			// sqrt()안의 부호검사
	double	Det_emf;
	
	Is_mag=sqrt(Is_dq[ds]*Is_dq[ds]+Is_dq[qs]*Is_dq[qs]);
	
	// 전압 추정시 시간지연(Ts)을 보상
	CosDeltaTheta=cos(we*Ts);
	SinDeltaTheta=sin(we*Ts);
	Us_dq[ds]=Vs_dq[ds]*CosDeltaTheta + Vs_dq[qs]*SinDeltaTheta;
	Us_dq[qs]=-Vs_dq[ds]*SinDeltaTheta + Vs_dq[qs]*CosDeltaTheta;
	Vs_dq[ds]=Us_dq[ds];
	Vs_dq[qs]=Us_dq[qs];
	
	// DC 여자 ==> Flux Setup : 벡터제어에서와 연동하기 위해서 같은 여자시간을 사용한다.
	if (t<ExcitationTime)		
	{
		Freq_ref=0.0;
		Freq_out=0.0;
		reference=0.0;
		we=0.0;
		theta=0.0;	
		SinTheta=0.0;
		CosTheta=1.0;	
		
		//DC여자 동안 전압 명령 		
		Vs_ref=Rs*(VF_ExcitationCurrentCoeff*Is_rat);	
	}
	else
	{	
		// 주파수 명령
		// 1차 모터가 대차를 당기고 있을 경우
		// 2차 모터는 적절한 힘으로 당겨줘야한다.
		// 따라서 2차 모터는 설정된 슬립 만큼 주파수를 낮게 인가하면 
		// 회생영역에서 동작하게 되며 대차를 당기는 힘을 발생시킨다.
		// 따라서 주파수 명령은 속도제어를 하고 있는 1차 인버터의 속도명령보다 작아져야 한다.
		if (reference>=0.0)
		{
				Freq_ref=(wr_rat*inv_PI_2)*reference - Rev_SlipFreq_ref;
				if (Freq_ref<0.0)	Freq_ref=0.0;
		}		
		else
		{	
			Freq_ref=(wr_rat*inv_PI_2)*reference + Rev_SlipFreq_ref;
			if (Freq_ref>0.0)	Freq_ref=0.0;
		}
			
		Freq_out=Freq_ref;
	
		// 각도 계산 : 주파수 명령 + 슬립 ==> 새로운 주파수 명령
		we=PI_2*Freq_out;
		theta+=we*Ts;
		if (theta>PI)	theta-=PI_2;
		else if (theta<-PI)	theta+=PI_2;		
		SinTheta=sin(theta);
		CosTheta=cos(theta);	

		// 저항에 걸리는 전압강하를 보상하기위해서는 
		// Phase lag(low pass filter)가 반드시 포함되어야 한다.
		// 이는본질적으로 IR보상식은 불안정하기 때문에
		// 강제로 phase delay를 주기위함이며, 이로인해
		// 보상을 안정되게 하기 위함이다.
		// 따라서 VF_IR_Comp_FilterPole은 너무 큰 값을 가질수 없다.
		if (t<0.1)
				Vs_max=0.57735*Vdc;
		else	Vs_max+=20.0*(0.57735*Vdc-Vs_max)*Ts;
		
		Es_m=VF_Fs_Coeff*fabs(Freq_out)*inv_Freq_rat*Vs_rat;
		if (Es_m>Vs_max)	Es_m=Vs_max;
	
		Is_DQ[DS]= CosTheta*Is_dq[ds] + SinTheta*Is_dq[qs];
		Is_DQ[QS]=-SinTheta*Is_dq[ds] + CosTheta*Is_dq[qs];

		Det_emf=(Es_m*Es_m)-(Rs*Is_DQ[QS])*(Rs*Is_DQ[QS]);  //sqrt안의 음수여부조사
		if ( (Det_emf>0.0)&&(fabs(Freq_out)>VF_Freq_TrqBoost) )
				LPF1(Ts,VF_IR_Comp_FilterPole,Rs*Is_DQ[DS]+sqrt(Det_emf)-Es_m,&Vs_IR_comp);		
		else	LPF1(Ts,VF_IR_Comp_FilterPole,VF_Vs_Coeff_TrqBoost*Vs_rat,&Vs_IR_comp);	
	
	
		// 전류 제한기 => (VF_CurLimitCoeff*Is_max)
		if (Is_mag>(VF_CurLimitCoeff*Is_max))
		{
			del_Vs_comp=(3.0*Vs_rat*inv_Is_rat)*(Is_mag-(VF_CurLimitCoeff*Is_max));
			if (del_Vs_comp>0.1*Vs_rat)	
				del_Vs_comp=0.1*Vs_rat;
			else if (del_Vs_comp<-0.1*Vs_rat)	
				del_Vs_comp=-0.1*Vs_rat;
		}	
		else	del_Vs_comp=0.0;
	
	
		// 최종 전압 명령
		Vs_ref = Es_m + Vs_IR_comp - del_Vs_comp;		// IR보상, 전류크기 제한 
		if (Vs_ref>Vs_max)
			Vs_ref=Vs_max;
	}	
	
	// 출력 전압
	Vs_dq_ref[ds]=Vs_ref*CosTheta + VF_DeadTimeGain*(Vs_dq_ref[ds]-Vs_dq[ds]);
	Vs_dq_ref[qs]=Vs_ref*SinTheta + VF_DeadTimeGain*(Vs_dq_ref[qs]-Vs_dq[qs]);
}
Exemple #6
0
void CrossOver::run(LV2_Handle instance, uint32_t n_samples)
{
    CrossOver *plugin;
    plugin = (CrossOver *) instance;    
    double f_before_1 = plugin->f_1;
    double f_before_2 = plugin->f_2;
    float Order;
    
    plugin->f_1 = (float)(*(plugin->freq_1));
    plugin->f_2 = (float)(*(plugin->freq_2));
    
    double fc = sqrt( plugin->f_1 * plugin->f_2);
    double fc_before = sqrt( f_before_1 * f_before_2);
    double BW = abs(plugin->f_2 - plugin->f_1);
    double BW_before = abs(f_before_2 - f_before_1);
    
    Order = (float)(*(plugin->order));
    Order = round(Order)+1;
    
    for (uint32_t i=0; i<= n_samples-1;i++)
    {
		plugin->u[i] = plugin->in[i];
	}
	
	/*********************************************************/	
    
    switch (int(Order))
    {
        case 1:
			LPF1(plugin->u, plugin->y1, n_samples, f_before_1, plugin->f_1, plugin->T, &plugin->y1_1, &plugin->u1_1, &plugin->y1_2, &plugin->u1_2, &plugin->y1_3, &plugin->u1_3  );
            break;
        case 2:
			LPF2(plugin->u, plugin->y1, n_samples, f_before_1, plugin->f_1, plugin->T, &plugin->y1_1, &plugin->u1_1, &plugin->y1_2, &plugin->u1_2, &plugin->y1_3, &plugin->u1_3  );
            break;
        case 3:
			LPF3(plugin->u, plugin->y1, n_samples, f_before_1, plugin->f_1, plugin->T, &plugin->y1_1, &plugin->u1_1, &plugin->y1_2, &plugin->u1_2, &plugin->y1_3, &plugin->u1_3  );
            break;
        default:
			LPF1(plugin->u, plugin->y1, n_samples, f_before_1, plugin->f_1, plugin->T, &plugin->y1_1, &plugin->u1_1, &plugin->y1_2, &plugin->u1_2, &plugin->y1_3, &plugin->u1_3  );
    }
    
    for (uint32_t i=0; i<= n_samples-1;i++)
    {
		plugin->out_1[i] = plugin->y1[i];
	}
	
	/*********************************************************/
       
    double g_before_1 = plugin->g_1;
    plugin->g_1 = pow(10, (float)(*(plugin->gain_1))/20.0);
    
    for (uint32_t i=1; i<=n_samples; i++)
	{
		plugin->out_1[i-1] = (g_before_1 + ((plugin->g_1 - g_before_1)/(n_samples - 1))*(i-1) )*(float)plugin->out_1[i-1];
	}
	
	
	/*********************************************************//*********************************************************/
    
    switch (int(Order))
    {
        case 1:
			BPF1(plugin->u, plugin->y2, n_samples, fc_before, fc, BW_before, BW, plugin->T, &plugin->y2_1, &plugin->u2_1, &plugin->y2_2, &plugin->u2_2, &plugin->y2_3, &plugin->u2_3, &plugin->y2_4, &plugin->u2_4, &plugin->y2_5, &plugin->u2_5, &plugin->y2_6, &plugin->u2_6  );
            break;
        case 2:
			BPF2(plugin->u, plugin->y2, n_samples, fc_before, fc, BW_before, BW, plugin->T, &plugin->y2_1, &plugin->u2_1, &plugin->y2_2, &plugin->u2_2, &plugin->y2_3, &plugin->u2_3, &plugin->y2_4, &plugin->u2_4, &plugin->y2_5, &plugin->u2_5, &plugin->y2_6, &plugin->u2_6  );
            break;
        case 3:
			BPF3(plugin->u, plugin->y2, n_samples, fc_before, fc, BW_before, BW, plugin->T, &plugin->y2_1, &plugin->u2_1, &plugin->y2_2, &plugin->u2_2, &plugin->y2_3, &plugin->u2_3, &plugin->y2_4, &plugin->u2_4, &plugin->y2_5, &plugin->u2_5, &plugin->y2_6, &plugin->u2_6  );
            break;
        default:
			BPF1(plugin->u, plugin->y2, n_samples, fc_before, fc, BW_before, BW, plugin->T, &plugin->y2_1, &plugin->u2_1, &plugin->y2_2, &plugin->u2_2, &plugin->y2_3, &plugin->u2_3, &plugin->y2_4, &plugin->u2_4, &plugin->y2_5, &plugin->u2_5, &plugin->y2_6, &plugin->u2_6  );
    }
    
    for (uint32_t i=0; i<= n_samples-1;i++)
    {
		plugin->out_2[i] = plugin->y2[i];
	}
	
	/*********************************************************/
       
    double g_before_2 = plugin->g_2;
    plugin->g_2 = pow(10, (float)(*(plugin->gain_2))/20.0);
    
    for (uint32_t i=1; i<=n_samples; i++)
	{
		plugin->out_2[i-1] = (g_before_2 + ((plugin->g_2 - g_before_2)/(n_samples - 1))*(i-1) )*(float)plugin->out_2[i-1];
	} 
	
	/*********************************************************//*********************************************************/
    
    switch (int(Order))
    {
        case 1:
			HPF1(plugin->u, plugin->y3, n_samples, f_before_2, plugin->f_2, plugin->T, &plugin->y3_1, &plugin->u3_1, &plugin->y3_2, &plugin->u3_2, &plugin->y3_3, &plugin->u3_3  );
            break;
        case 2:
			HPF2(plugin->u, plugin->y3, n_samples, f_before_2, plugin->f_2, plugin->T, &plugin->y3_1, &plugin->u3_1, &plugin->y3_2, &plugin->u3_2, &plugin->y3_3, &plugin->u3_3  );
            break;
        case 3:
			HPF3(plugin->u, plugin->y3, n_samples, f_before_2, plugin->f_2, plugin->T, &plugin->y3_1, &plugin->u3_1, &plugin->y3_2, &plugin->u3_2, &plugin->y3_3, &plugin->u3_3  );
            break;
        default:
			HPF1(plugin->u, plugin->y3, n_samples, f_before_2, plugin->f_2, plugin->T, &plugin->y3_1, &plugin->u3_1, &plugin->y3_2, &plugin->u3_2, &plugin->y3_3, &plugin->u3_3  );
    }
    
    for (uint32_t i=0; i<= n_samples-1;i++)
    {
		plugin->out_3[i] = plugin->y3[i];
	}
	
	/*********************************************************/
       
    double g_before_3 = plugin->g_3;
    plugin->g_3 = pow(10, (float)(*(plugin->gain_3))/20.0);
    
    for (uint32_t i=1; i<=n_samples; i++)
	{
		plugin->out_3[i-1] = (g_before_3 + ((plugin->g_3 - g_before_3)/(n_samples - 1))*(i-1) )*(float)plugin->out_3[i-1];
	}
	

}