Exemplo n.º 1
0
// *****************************************************************
//
// *****************************************************************
void Run_Demod_RMNK( TRMNK *prmnk, float inX )
{
    float  HQx;
    float  xa2, xb2;
    float  k = 10000.0;

    // ----- 5.0 * TWO_PI * DISCRET_TIME = (float)0.0006283185307179586476925286766559

    prmnk->XPhaseIncriment = prmnk->delta_phi + (float)0.2 * TWO_PI_DISCRET_TIME * prmnk->pi_pll_x2.BlockOut + prmnk->c4;
    prmnk->XFrequency      = prmnk->XPhaseIncriment *  TWO_PI_INVERT_ALGO_FREQUENCY;
    prmnk->x_phi = prmnk->x_phi + prmnk->XPhaseIncriment;
    if ( prmnk->x_phi >= TWO_PI ) prmnk->x_phi = prmnk->x_phi - TWO_PI;


    prmnk->x_base_sin = sinf( prmnk->x_phi );
    prmnk->x_base_cos = cosf( prmnk->x_phi );

    // --------------------------------------------
    HQx          = prmnk->Qx[0] + prmnk->x_base_sin*prmnk->Qx[1] + prmnk->x_base_cos*prmnk->Qx[2] - inX;
    prmnk->Qx[0] = prmnk->Qx[0] - prmnk->MjuX[0] *                     HQx;
    prmnk->Qx[1] = prmnk->Qx[1] - prmnk->MjuX[1] * prmnk->x_base_sin * HQx;
    prmnk->Qx[2] = prmnk->Qx[2] - prmnk->MjuX[2] * prmnk->x_base_cos * HQx;

    // ------ фильтрование КВАДРАТа ПУЧНОСТИ -----
    Run_Z2Coef( &prmnk->fi_Xa,  prmnk->Qx[1]*prmnk->Qx[1] + prmnk->Qx[2]*prmnk->Qx[2] );

    // ------ фильтрованный КВАДРАТ ПУЧНОСТИ  -------
    prmnk->XAmpl = prmnk->fi_Xa.BlockOut;

    // ------ фильтрация -------
    Run_Z2Coef( &prmnk->fi_Xb,  prmnk->Qx[2] );



    if ( prmnk->ANodePeriod.isNewValuePresent == 1 )
    {
        prmnk->ANodePeriod.isNewValuePresent = 0;

        Run_Z2Coef( &prmnk->fi_Xc,  prmnk->ANodePeriod.Period );
        //prmnk->delta_phi = TWO_PI / prmnk->fi_Xc.BlockOut;
        //prmnk->delta_phi = TWO_PI / prmnk->ANodePeriod.Period;
    }

    // ------ Регулирование отфильтрованного параметра prmnk->Qx[2] -------
    Run_PiReg( &prmnk->pi_pll_x1,  prmnk->fi_Xb.BlockOut     );
    Run_PiReg( &prmnk->pi_pll_x2, -prmnk->pi_pll_x1.BlockOut );

    //prmnk->pi_pll_x2.BlockOut = prmnk->pi_pll_x1.BlockOut;
}
Exemplo n.º 2
0
// *****************************************************************
//
// *****************************************************************
void Run_Algo( TGyro *gyro )
{
    float cos_freq, sc_argument, local_var;
    Sint8 iCounter;

    // --- 1 ------ НАСРОЙКА ПРИБОРА -----
    if ( gyro->DebugMode != 0 )
    {
        SetupAlgo( gyro );

        gyro->ExcitationPhaseAG = gyro->Base_ExcitationPhaseAG + gyro->c5;
        gyro->ExcitationPhase   = gyro->Base_ExcitationPhase   + gyro->c6;

        if ( gyro->ExcitationPhaseAG < (float)0.0 ) gyro->ExcitationPhaseAG = (float)0.0;
        if ( gyro->ExcitationPhase   < (float)0.0 ) gyro->ExcitationPhase   = (float)0.0;

        // ----- Если сканироваение Стартовой фазы, зануляю УЗЕЛ ------
        if ( gyro->DebugMode == 6 ) gyro->in_Uy = 0;
    }

    // --- 2 ------ ДАННЫЕ В UART -------
    Setup_UART_data( gyro );

    // --- 3 ------ Фильтрация входных сигналов ------
    Input_Filtration_short( &gyro->fi_input_x , gyro->in_Ux );
    Input_Filtration_short( &gyro->fi_input_y , gyro->in_Uy );


    // --- 4 ------ RMNK ------ (R-рекуррентный M-метод N-наименьших K-квадратов)
//**********************
    Run_Demod_RMNK( &gyro->rmnk, gyro->DebugCoef*gyro->fi_input_x.BlockOut );
    if ( gyro->DebugCoef < 0 )
        gyro->rmnk.x_phi_180 = gyro->rmnk.x_phi + ONE_PI;
    else gyro->rmnk.x_phi_180 = gyro->rmnk.x_phi;
//**********************
    // --- 5 ------ Амплитуда КОЛебаний канала У -----
    if ( gyro->Y_minVal > gyro->fi_input_y.BlockOut ) gyro->Y_minVal = gyro->fi_input_y.BlockOut;
    if ( gyro->Y_maxVal < gyro->fi_input_y.BlockOut ) gyro->Y_maxVal = gyro->fi_input_y.BlockOut;
    if ( ++gyro->Y_CountSumCounter >= gyro->Y_CountSumValues )
    {
        gyro->rmnk.YAmpl =  (float)0.5 * (gyro->Y_maxVal - gyro->Y_minVal);
        gyro->Y_CountSumCounter = 0;
        gyro->Y_minVal = (float) 0.0;
        gyro->Y_maxVal = (float) 0.0;
    }

    // --- 6 ------- Демодуляция Кориолиса и Квадратуры ---
    Run_Demod( &gyro->fi_demod_c, - gyro->fi_input_y.BlockOut * sinf( gyro->rmnk.x_phi_180 ) );
    Run_Demod( &gyro->fi_demod_q, - gyro->fi_input_y.BlockOut * cosf( gyro->rmnk.x_phi_180 ) );//

    // --- 7 ----- Регулирование колебаний амплитуды пучности ----
    Run_PiReg( &gyro->pi_am_1,  gyro->rmnk.XAmpl       );
    Run_PiReg( &gyro->pi_am_2, -gyro->pi_am_1.BlockOut );

    // --- 8 ------ Если автогениратор отключился
    // ---   ------- тогда переходим на компенсирование узла
    if ( gyro->isAlgoCounter >= 2 )
    {
        Run_PiReg( &gyro->pi_om_1,  gyro->fi_demod_c.BlockOut );
        Run_PiReg( &gyro->pi_om_2, -gyro->pi_om_1   .BlockOut );

        Run_PiReg( &gyro->pi_si_1,  gyro->fi_demod_q.BlockOut );
        Run_PiReg( &gyro->pi_si_2, -gyro->pi_si_1   .BlockOut );
    }

    // --- 9 -------- Коррекция амплитуд -----
    if ( gyro->pi_am_2.BlockOut > (float) 9.9 ) gyro->pi_am_2.BlockOut = (float) 9.9;
    if ( gyro->pi_am_2.BlockOut < (float)-9.9 ) gyro->pi_am_2.BlockOut = (float)-9.9;
    if ( gyro->pi_om_2.BlockOut > (float) 9.9 ) gyro->pi_om_2.BlockOut = (float) 9.9;
    if ( gyro->pi_om_2.BlockOut < (float)-9.9 ) gyro->pi_om_2.BlockOut = (float)-9.9;
    if ( gyro->pi_si_2.BlockOut > (float) 9.9 ) gyro->pi_si_2.BlockOut = (float) 9.9;
    if ( gyro->pi_si_2.BlockOut < (float)-9.9 ) gyro->pi_si_2.BlockOut = (float)-9.9;

    // --- 10-------- формирование гармонических сигналов ------------
    gyro->cos_exc  = cosf( gyro->rmnk.x_phi_180 + gyro->ExcitationPhase   );
    gyro->cos_comp = cosf( gyro->rmnk.x_phi_180 + gyro->CompensationPhase );
    gyro->sin_comp = sinf( gyro->rmnk.x_phi_180 + gyro->CompensationPhase + gyro->PhiQPhase );

    // --- 11 ----------- Управляющие сигналы --------------------------
    gyro->GyroOutRaw = gyro->k_Omega * gyro->pi_om_2.BlockOut;

    gyro->DebugCounter = gyro->DebugCounter + DISCRET_TIME;
    if ( gyro->DebugCounter >= (float)60.0 )
    {
        gyro->DebugCounter1 = gyro->DebugCounter1 + (float)1.0;
        if ( gyro->DebugCounter1 >= (float)10.0 )
        {
            gyro->DebugCoef     = gyro->DebugCoef * (float) -1.0;
            gyro->NULL_value    = gyro->DebugCoef;
            gyro->DebugCounter1 = (float)0.0;
        }
        gyro->DebugCounter = (float)0.0;
    }

    gyro->out_Ux     = - (gyro->pi_am_2.BlockOut + gyro->c1) * gyro->cos_exc;
    gyro->out_Uy     = - (gyro->pi_om_2.BlockOut + gyro->c2) * gyro->cos_comp
                       + (gyro->pi_si_2.BlockOut + gyro->c3) * gyro->sin_comp;

    // --- 12 ----------- Счетчик и флаг запуска 0.4 сек --------
    if ( ++gyro->AlgoCounter >= gyro->StartUpTime  ) gyro->isAlgoCounter = 2;
    // ******************************************
    // *** 13 **** Разгон(Старт) Гирика *********
    // ******************************************

    Calc_Period( &gyro->rmnk.ANodePeriod, gyro->fi_input_x.BlockOut );
    if ( gyro->isAlgoCounter < 2 || gyro->DebugMode == 6 )
    {
        // --- Расчет простого периода колебаний системы
        // --- и перенос начального значения инкримента фазы в RMNK ---
        gyro->rmnk.delta_phi = TWO_PI / gyro->rmnk.ANodePeriod.Period;

        // -- ФАЗА (Задержка) АГ (перасчет для режима сканирование) ----
        if ( gyro->DebugMode == 6 )
        {
            gyro->Zn_exc.zn_curr = gyro->DefaultPeriod * gyro->ExcitationPhaseAG * TWO_PI_INVERT;
            Setup_Zn(&gyro->Zn_exc);
        }

        // ---- Скользящий буфера -----
        memmove(&gyro->XBuffer[1], gyro->XBuffer, 100);
        gyro->XBuffer[0] = - gyro->fi_input_x.BlockOut;

        local_var    = Get_SplineValue( gyro->XBuffer, &gyro->Zn_exc);
        gyro->out_Ux = ( local_var >= (float)0.0 ) ? gyro->pi_am_2.BlockOut : -gyro->pi_am_2.BlockOut;
    }


    // ******************************************
    // ***  14  *****   Отладка *****************
    // ******************************************
    /*
    if ( gyro->DebugMode == 0 )
    {   // ------ Debug -----
        if ( Debug.init_counter++ >= Debug.init_count ) Debug.isInited = 1;
        if ( Debug.isWork == 1 && Debug.isInited == 1 )
        {
            Debug.param1[ Debug.work_counter ] = *Debug.debug_value;
            if ( ++Debug.work_counter >= Debug.work_count )
            {
                Debug.isSleep      = 1;
                Debug.isWork       = 0;
                Debug.work_counter = 0;
            }
        }
    }
    */


    // --- 15 ---------  Усреднение главных параметров ---------
    Calc_Means_Values_for_Correction( gyro );

    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    // ---- 16 --------- Пошаговая система расчета коррекций ------------
    if ( ++gyro->CorrectionOrderCalc >= 50 ) gyro->CorrectionOrderCalc = 0;

    if ( gyro->CorrectionOrderCalc == 0 )
    {
        gyro->f1 = gyro->cf_Freq.BlockOut - corr_f0;
        gyro->f2 = gyro->f1*gyro->f1;
        gyro->f3 = gyro->f1*gyro->f2;
        gyro->f4 = gyro->f1*gyro->f3;
        gyro->f5 = gyro->f1*gyro->f4;
        gyro->f6 = gyro->f1*gyro->f5;
    }
    if ( gyro->CorrectionOrderCalc == 1 )
    {
        gyro->q1 = gyro->cf_Quad.BlockOut - corr_q0;
        gyro->q2 = gyro->q1*gyro->q1;
        gyro->q3 = gyro->q1*gyro->q2;
        gyro->q4 = gyro->q1*gyro->q3;
        gyro->q5 = gyro->q1*gyro->q4;
        gyro->q6 = gyro->q1*gyro->q5;
    }
    if ( gyro->CorrectionOrderCalc == 2 )
    {
        gyro->e1 = gyro->cf_Exci.BlockOut - corr_e0;
        gyro->e2 = gyro->e1*gyro->e1;
        gyro->e3 = gyro->e1*gyro->e2;
        gyro->e4 = gyro->e1*gyro->e3;
        gyro->e5 = gyro->e1*gyro->e4;
        gyro->e6 = gyro->e1*gyro->e5;
    }
    if ( gyro->CorrectionOrderCalc == 3 )
    {
        gyro->t1 = gyro->cf_Temp.BlockOut - corr_t0;
        gyro->t2 = gyro->t1*gyro->t1;
        gyro->t3 = gyro->t1*gyro->t2;
        gyro->t4 = gyro->t1*gyro->t3;
        gyro->t5 = gyro->t1*gyro->t4;
        gyro->t6 = gyro->t1*gyro->t5;
    }

    // **************************************************************************************
    if ( gyro->isMainSumInited == 0 ) return;

    // ------- Коррекции влияющие на СИСТЕМУ управления -------
    if ( gyro->CorrectionOrderCalc == 4 )
    {   // ------ Полосовик -------
        cos_freq              = -(float)2.0 * cosf(gyro->cf_Freq.BlockOut * TWO_PI_DISCRET_TIME);//
        gyro->fi_input_x.b[1] = cos_freq * gyro->filter_invertValue_x;
        gyro->fi_input_y.b[1] = cos_freq * gyro->filter_invertValue_y;
    }

    // **************************************************************************************
    if ( gyro->CorrectionOrderCalc == 5 && gyro->isXPhase_corr == 1 )
    {
        gyro->ExcitationPhase = corr_x_ph_a0 + corr_x_ph_a1 * gyro->f1 + corr_x_ph_a2 * gyro->f2;
    }
    // **************************************************************************************
    if ( gyro->CorrectionOrderCalc == 6 && gyro->isYPhase_corr == 1 )
    {
        gyro->CompensationPhase = gyro->Base_CompensationPhase + gyro->k_Omega * (corr_y_ph_a0 + corr_y_ph_a1*gyro->f1 + corr_y_ph_a2*gyro->f2);
    }


    // ------- ПОСТ Коррекции не влияющие на СИСТЕМУ управления -------
    // **************************************************************************************
    if ( gyro->CorrectionOrderCalc == 7 && gyro->isAlfaE_f_corr == 1 )
    {
        sc_argument  = corr_e_f0 + corr_e_f1*gyro->f1 + corr_e_f2*gyro->f2;

        gyro->corr_sin_alfa_e = sinf(sc_argument);
        gyro->corr_cos_alfa_e = cosf(sc_argument);
    }
    if ( gyro->CorrectionOrderCalc == 8 && gyro->isAlfaE_t_corr == 1 )
    {
        sc_argument  = corr_e_t0 + corr_e_t1*gyro->t1 + corr_e_t2*gyro->t2;

        gyro->corr_sin_alfa_e = sinf(sc_argument);
        gyro->corr_cos_alfa_e = cosf(sc_argument);
    }
    if ( gyro->CorrectionOrderCalc == 9 && gyro->isAlfaQ_f_corr == 1 )
    {
        sc_argument = corr_q_f0 + corr_q_f1*gyro->f1 + corr_q_f2*gyro->f2;

        gyro->corr_sin_alfa_q = sinf(sc_argument);
        gyro->corr_cos_alfa_q = cosf(sc_argument);
    }
    if ( gyro->CorrectionOrderCalc == 10 && gyro->isAlfaQ_t_corr == 1 )
    {
        sc_argument = corr_q_t0 + corr_q_t1*gyro->t1 + corr_q_t2*gyro->t2;

        gyro->corr_sin_alfa_q = sinf(sc_argument);
        gyro->corr_cos_alfa_q = cosf(sc_argument);
    }

    // **************************************************************************************
    if ( gyro->CorrectionOrderCalc == 11 && gyro->isStatic1_corr == 1 )
    {
        gyro->GyroOut_corr_st1_a =   corr_st1_f1*gyro->f1 + corr_st1_f2*gyro->f2
                                     + corr_st1_f3*gyro->f3 + corr_st1_f4*gyro->f4
                                     + corr_st1_f5*gyro->f5 + corr_st1_f6*gyro->f6;
    }
    if ( gyro->CorrectionOrderCalc == 12 && gyro->isStatic1_corr == 1 )
    {
        gyro->GyroOut_corr_st1_b =   corr_st1_e1*gyro->e1 + corr_st1_e2*gyro->e2
                                     + corr_st1_e3*gyro->e3 + corr_st1_e4*gyro->e4
                                     + corr_st1_e5*gyro->e5 + corr_st1_e6*gyro->e6;
    }
    if ( gyro->CorrectionOrderCalc == 13 && gyro->isStatic1_corr == 1 )
    {
        gyro->GyroOut_corr_st1_c =   corr_st1_q1*gyro->q1 + corr_st1_q2*gyro->q2
                                     + corr_st1_q3*gyro->q3 + corr_st1_q4*gyro->q4
                                     + corr_st1_q5*gyro->q5 + corr_st1_q6*gyro->q6;
    }
    if ( gyro->CorrectionOrderCalc == 14 && gyro->isStatic1_corr == 1 )
    {
        gyro->GyroOut_corr_st1 = corr_g0 + gyro->GyroOut_corr_st1_a + gyro->GyroOut_corr_st1_b + gyro->GyroOut_corr_st1_c
                                 + corr_st1_t1*gyro->t1 + corr_st1_t2*gyro->t2
                                 + corr_st1_t3*gyro->t3 + corr_st1_t4*gyro->t4
                                 + corr_st1_t5*gyro->t5 + corr_st1_t6*gyro->t6;
    }
    // **************************************************************************************
    if ( gyro->CorrectionOrderCalc == 15 && gyro->isStatic2_corr == 1 )
    {
        gyro->GyroOut_corr_st2_a =   corr_st2_f1*gyro->f1 + corr_st2_f2*gyro->f2
                                     + corr_st2_f3*gyro->f3 + corr_st2_f4*gyro->f4
                                     + corr_st2_f5*gyro->f5 + corr_st2_f6*gyro->f6;
    }
    if ( gyro->CorrectionOrderCalc == 16 && gyro->isStatic2_corr == 1 )
    {
        gyro->GyroOut_corr_st2_b =   corr_st2_e1*gyro->e1 + corr_st2_e2*gyro->e2
                                     + corr_st2_e3*gyro->e3 + corr_st2_e4*gyro->e4
                                     + corr_st2_e5*gyro->e5 + corr_st2_e6*gyro->e6;
    }
    if ( gyro->CorrectionOrderCalc == 17 && gyro->isStatic2_corr == 1 )
    {
        gyro->GyroOut_corr_st2_c =   corr_st2_q1*gyro->q1 + corr_st2_q2*gyro->q2
                                     + corr_st2_q3*gyro->q3 + corr_st2_q4*gyro->q4
                                     + corr_st2_q5*gyro->q5 + corr_st2_q6*gyro->q6;
    }
    if ( gyro->CorrectionOrderCalc == 18 && gyro->isStatic2_corr == 1 )
    {
        gyro->GyroOut_corr_st2 = corr_g1 + gyro->GyroOut_corr_st2_a + gyro->GyroOut_corr_st2_b + gyro->GyroOut_corr_st2_c
                                 + corr_st2_t1*gyro->t1 + corr_st2_t2*gyro->t2
                                 + corr_st2_t3*gyro->t3 + corr_st2_t4*gyro->t4
                                 + corr_st2_t5*gyro->t5 + corr_st2_t6*gyro->t6;
    }


    // **************************************************************************************
    if ( gyro->CorrectionOrderCalc == 14 && gyro->isDynamic_corr == 1 )
    {
        sc_argument       =   corr_mk1_f1 * gyro->f1 + corr_mk1_f2 * gyro->f2 + corr_mk1_f3 * gyro->f3
                              + corr_mk1_e1 * gyro->e1 + corr_mk1_e2 * gyro->e2 + corr_mk1_e3 * gyro->e3
                              + corr_mk1_q1 * gyro->q1 + corr_mk1_q2 * gyro->q2 + corr_mk1_q3 * gyro->q3
                              + corr_mk1_t1 * gyro->t1 + corr_mk1_t2 * gyro->t2 + corr_mk1_t3 * gyro->t3;
        gyro->GyroOut_MK1 = corr_mk0 / sc_argument;
    }

    // ***** 17 ******** Выход ГИРОСКОПА ********
    // ------ Альфа Е Коррекция ------
    gyro->Excitation_alfa_e = gyro->pi_am_2.BlockOut * gyro->corr_cos_alfa_e - gyro->GyroOutRaw       * gyro->corr_sin_alfa_e;
    gyro->GyroOut_alfa_e    = gyro->GyroOutRaw       * gyro->corr_cos_alfa_e + gyro->pi_am_2.BlockOut * gyro->corr_sin_alfa_e;

    // ------ Альфа Q Коррекция ------
    gyro->Quadrature_alfa_q = gyro->pi_si_2.BlockOut * gyro->corr_cos_alfa_q - gyro->GyroOut_alfa_e    * gyro->corr_sin_alfa_q;
    gyro->GyroOut_alfa_q    = gyro->GyroOut_alfa_e   * gyro->corr_cos_alfa_q + gyro->pi_si_2.BlockOut  * gyro->corr_sin_alfa_q;

    // ------ Остаточная коррекция (сюда должны входить все виды коррекции, статика1, динамика1, статика 2)------
    gyro->GyroOut_corr = (gyro->GyroOut_alfa_q - gyro->GyroOut_corr_st1) * gyro->GyroOut_MK1 - gyro->GyroOut_corr_st2;
}
Exemplo n.º 3
0
//*****************************************************************
// 
//*****************************************************************
void Run_Algo( TGyro *gyro ) 
{
    // ------ ДАННЫЕ В UART -------
    Setup_UART_data( gyro );

   // ----- Фильтрация входных сигнаов ------
    Input_Filtration_short( &gyro->fi_input_x , gyro->in_Ux );
    Input_Filtration_short( &gyro->fi_input_y , gyro->in_Uy );

    // ------ RMNK -----
    Run_Demod_RMNK( &gyro->rmnk, gyro->in_Ux, gyro->fi_input_x.BlockOut, gyro->fi_input_y.BlockOut );

    // ------- Демодуляция и Маштабирование ---
    Run_Demod( &gyro->fi_demod_c, gyro->fi_input_y.BlockOut * gyro->rmnk.x_base_sin );
    Run_Demod( &gyro->fi_demod_q, gyro->fi_input_y.BlockOut * gyro->rmnk.x_base_cos );

    // ----- Фильтрация параметра ---
    Run_Z3Coef( &gyro->fi_AmplX, gyro->rmnk.XAmpl );
    
   // ----- Регулирование ----
    Run_PiReg( &gyro->pi_am_1, gyro->fi_AmplX  .BlockOut );  Run_PiReg( &gyro->pi_am_2, -gyro->pi_am_1.BlockOut );
    //Run_PiReg( &gyro->pi_am_1, gyro->rmnk.XAmpl          );  Run_PiReg( &gyro->pi_am_2, -gyro->pi_am_1.BlockOut );
    Run_PiReg( &gyro->pi_om_1, gyro->fi_demod_c.BlockOut );  Run_PiReg( &gyro->pi_om_2, -gyro->pi_om_1.BlockOut );
    Run_PiReg( &gyro->pi_si_1, gyro->fi_demod_q.BlockOut );  Run_PiReg( &gyro->pi_si_2, -gyro->pi_si_1.BlockOut );

    // -------- Коррекция амплитуд -----
    if ( gyro->pi_am_2.BlockOut > (float) 9.5 ) gyro->pi_am_2.BlockOut = (float) 9.5;
    if ( gyro->pi_am_2.BlockOut < (float)-9.5 ) gyro->pi_am_2.BlockOut = (float)-9.5;
    if ( gyro->pi_om_2.BlockOut > (float) 9.5 ) gyro->pi_om_2.BlockOut = (float) 9.5;
    if ( gyro->pi_om_2.BlockOut < (float)-9.5 ) gyro->pi_om_2.BlockOut = (float)-9.5;
    if ( gyro->pi_si_2.BlockOut > (float) 9.5 ) gyro->pi_si_2.BlockOut = (float) 9.5;
    if ( gyro->pi_si_2.BlockOut < (float)-9.5 ) gyro->pi_si_2.BlockOut = (float)-9.5;

    // --------
    //gyro->X_Phase_Algo = gyro->ExcitationPhase   + gyro->K_XPhase * gyro->pi_XPhase.BlockOut;
    //gyro->Y_Phase_Algo = gyro->CompensationPhase + gyro->K_XPhase * gyro->pi_XPhase.BlockOut;

    gyro->X_Phase_Algo = gyro->ExcitationPhase + gyro->BPFPhase.Phase_rad;//   + gyro->K_XPhase * gyro->pi_XPhase.BlockOut;
    gyro->Y_Phase_Algo = gyro->CompensationPhase + gyro->BPFPhase.Phase_rad;

    // -------- Управляющие сигналы ------------
    gyro->sin_exc  = - sinf( gyro->rmnk.x_phi + gyro->X_Phase_Algo );
    gyro->sin_comp = - sinf( gyro->rmnk.x_phi + gyro->Y_Phase_Algo );
    gyro->cos_comp = - cosf( gyro->rmnk.x_phi + gyro->Y_Phase_Algo );

    gyro->GyroOutRaw = k_omega * gyro->pi_om_2.BlockOut;
    gyro->GyroOut    = gyro->GyroOutRaw;

    gyro->out_Ux     = gyro->pi_am_2.BlockOut * gyro->sin_exc;
    gyro->out_Uy     = gyro->pi_si_2.BlockOut * gyro->sin_comp;
    gyro->out_Uy    -= gyro->pi_om_2.BlockOut * gyro->cos_comp;
    gyro->out_Uy    *= gyro->isCompensationPresent; 

    // ------ Коеф передачи, только в конце, потомучто в начале схемы он добавляет шумы ---------
    if ( gyro->isKFilter_CORR == 1 ) gyro->out_Uy *= gyro->rmnk.KFilter; 

    Calc_Phase ( &gyro->XPhase  , gyro->rmnk.XPeriod, gyro->rmnk.XPeriod_invert, 0, gyro->sin_exc, gyro->in_Ux               );
    Calc_Phase ( &gyro->BPFPhase, gyro->rmnk.XPeriod, gyro->rmnk.XPeriod_invert, 0, gyro->in_Ux  , gyro->fi_input_x.BlockOut );
    if ( gyro->XPhase.isNewValuePresent == 1 && gyro->isAlgoCounter >= 4 && gyro->isPhaseCorrectionPresent == 1)
    {
        gyro->XPhase.isNewValuePresent = 0;
        gyro->pi_XPhase.BlockInput = gyro->XPhase.Phase_rad - gyro->ExcitationPhase;
        Run_PiReg( &gyro->pi_XPhase, gyro->pi_XPhase.BlockInput );
    }

    //----------- Разгон резонатора --------------------------
    gyro->AlgoCounter++;
    if (   gyro->AlgoCounter   >= 20000  ) gyro->isAlgoCounter = 2;
    if (   gyro->AlgoCounter   >= 30000  ) gyro->isAlgoCounter = 3;
    if (   gyro->AlgoCounter   >= 50000  ) gyro->isAlgoCounter = 4;
    if (   gyro->AlgoCounter   >= 500000 ) gyro->isAlgoCounter = 5;
/*

    if ( gyro->isAlgoCounter == 2 && gyro->isIntegCorrected == 0)
    {
        gyro->isIntegCorrected = 1;

        gyro->pi_am_1.Integral.a[0] = gyro->pi_am_1.Integral.a[0] * (float)20.0;
        gyro->pi_om_1.Integral.a[0] = gyro->pi_om_1.Integral.a[0] * (float)20.0;
        gyro->pi_si_1.Integral.a[0] = gyro->pi_si_1.Integral.a[0] * (float)20.0;

        gyro->pi_am_1.Integral.a[1] = gyro->pi_am_1.Integral.a[0];
        gyro->pi_om_1.Integral.a[1] = gyro->pi_om_1.Integral.a[0];
        gyro->pi_si_1.Integral.a[1] = gyro->pi_si_1.Integral.a[0];
    }

    if ( gyro->isAlgoCounter >= 5 && gyro->isIntegCorrected == 1)
    {
        gyro->isIntegCorrected = 2;

        gyro->pi_am_1.Integral.a[0] = gyro->pi_am_1.Integral.a[0] * (float)0.05;
        gyro->pi_om_1.Integral.a[0] = gyro->pi_om_1.Integral.a[0] * (float)0.05;
        gyro->pi_si_1.Integral.a[0] = gyro->pi_si_1.Integral.a[0] * (float)0.05;

        gyro->pi_am_1.Integral.a[1] = gyro->pi_am_1.Integral.a[0];
        gyro->pi_om_1.Integral.a[1] = gyro->pi_om_1.Integral.a[0];
        gyro->pi_si_1.Integral.a[1] = gyro->pi_si_1.Integral.a[0];
    }

*/

    // ------ ОТЛАДКА -----
    if ( gyro->DebugMode != 0 ) SetupAlgo( gyro );
    
    // ------ Debug -----

    if ( Debug.init_counter++ >= Debug.init_count ) Debug.isInited = 1;

    if ( Debug.isWork == 1 && Debug.isInited == 1 )
    {
        //Debug.param1[ Debug.work_counter ] = gyro->rmnk.XAmpl;
        //Debug.param2[ Debug.work_counter ] = gyro->fi_demod_c.BlockOut; //gyro->fi_input_x.BlockOut;//gyro->RMNK.phi;//mod_s2;//gyro->out_Uy;
        //Debug.param3[ Debug.work_counter ] = gyro->fi_demod_q.BlockOut;//;//gyro->RMNK.phi;//mod_s2;//gyro->out_Uy;

        Debug.param1[ Debug.work_counter ] = gyro->pi_am_2.BlockOut;
        Debug.param2[ Debug.work_counter ] = gyro->pi_om_2.BlockOut; //gyro->fi_input_x.BlockOut;//gyro->RMNK.phi;//mod_s2;//gyro->out_Uy;
        Debug.param3[ Debug.work_counter ] = gyro->pi_si_2.BlockOut;//;//gyro->RMNK.phi;//mod_s2;//gyro->out_Uy;

        if ( ++Debug.work_counter >= Debug.work_count )
        {
            Debug.isSleep      = 1;
            Debug.isWork       = 0;
            Debug.work_counter = 0;
        }
    }

} 
Exemplo n.º 4
0
// *****************************************************************
//
// *****************************************************************
void Run_Demod_RMNK( TRMNK *prmnk, float inX )
{
    float  HQx;
    float  xa2, xb2;
    float  k = 10000.0;

    // ----- 5.0 * TWO_PI * DISCRET_TIME = (float)0.0006283185307179586476925286766559
/*
    prmnk->XPhaseIncriment  =  k * prmnk->delta_phi + prmnk->pi_pll_x1.BlockOut + prmnk->c4;
    prmnk->XPhaseIncriment /=  k;

    prmnk->XFrequency       = prmnk->XPhaseIncriment *  TWO_PI_INVERT_ALGO_FREQUENCY;
    prmnk->x_phi  = prmnk->x_phi + prmnk->XPhaseIncriment; 
    if ( prmnk->x_phi >= TWO_PI ) prmnk->x_phi = prmnk->x_phi - TWO_PI;
*/


    prmnk->XPhaseIncriment = prmnk->delta_phi + (float)0.0006283185307179586476925286766559 * prmnk->pi_pll_x2.BlockOut + prmnk->c4;
    prmnk->XFrequency      = prmnk->XPhaseIncriment *  TWO_PI_INVERT_ALGO_FREQUENCY;
    prmnk->x_phi = prmnk->x_phi + prmnk->XPhaseIncriment; 
    if ( prmnk->x_phi >= TWO_PI ) prmnk->x_phi = prmnk->x_phi - TWO_PI;


    prmnk->x_base_sin = sinf( prmnk->x_phi );
    prmnk->x_base_cos = cosf( prmnk->x_phi ); 

    // --------------------------------------------
        HQx          = prmnk->Qx[0] + prmnk->x_base_sin*prmnk->Qx[1] + prmnk->x_base_cos*prmnk->Qx[2] - inX;
        prmnk->Qx[0] = prmnk->Qx[0] - prmnk->MjuX[0] *                     HQx;
        prmnk->Qx[1] = prmnk->Qx[1] - prmnk->MjuX[1] * prmnk->x_base_sin * HQx;
        prmnk->Qx[2] = prmnk->Qx[2] - prmnk->MjuX[2] * prmnk->x_base_cos * HQx;

        // ------ фильтрование КВАДРАТа ПУЧНОСТИ -----
        Run_Z2Coef( &prmnk->fi_Xa,  prmnk->Qx[1]*prmnk->Qx[1] + prmnk->Qx[2]*prmnk->Qx[2] );  

        // ------ фильтрованный КВАДРАТ ПУЧНОСТИ  -------
        prmnk->XAmpl = prmnk->fi_Xa.BlockOut;

        // ------ фильтрация -------
        Run_Z2Coef( &prmnk->fi_Xb,  prmnk->Qx[2] );

        // ------ Регулирование отфильтрованного параметра prmnk->Qx[2] -------
        Run_PiReg( &prmnk->pi_pll_x1,  prmnk->fi_Xb.BlockOut     );
        Run_PiReg( &prmnk->pi_pll_x2, -prmnk->pi_pll_x1.BlockOut );


/*
    prmnk->XPhaseIncriment = prmnk->delta_phi + (float)0.0006283185307179586476925286766559 * (prmnk->pi_pll_x2.BlockOut + prmnk->val) + prmnk->c4;
    //prmnk->XPhaseIncriment  =  k * prmnk->delta_phi + prmnk->pi_pll_x1.BlockOut + prmnk->c4;
    //prmnk->XPhaseIncriment /=  k;

    prmnk->XFrequency      = prmnk->XPhaseIncriment *  TWO_PI_INVERT_ALGO_FREQUENCY;
    prmnk->x_phi = prmnk->x_phi + prmnk->XPhaseIncriment; 
    if ( prmnk->x_phi >= TWO_PI ) prmnk->x_phi = prmnk->x_phi - TWO_PI;


    prmnk->x_base_sin = sinf( prmnk->x_phi );
    prmnk->x_base_cos = cosf( prmnk->x_phi ); 

    // --------------------------------------------
        HQx          = prmnk->Qx[0] + prmnk->x_base_sin*prmnk->Qx[1] + prmnk->x_base_cos*prmnk->Qx[2] - inX;
        prmnk->Qx[0] = prmnk->Qx[0] - prmnk->MjuX[0] *                     HQx;
        prmnk->Qx[1] = prmnk->Qx[1] - prmnk->MjuX[1] * prmnk->x_base_sin * HQx;
        prmnk->Qx[2] = prmnk->Qx[2] - prmnk->MjuX[2] * prmnk->x_base_cos * HQx;

        // ------ фильтрование КВАДРАТа ПУЧНОСТИ -----
        Run_Z2Coef( &prmnk->fi_Xa,  prmnk->Qx[1]*prmnk->Qx[1] + prmnk->Qx[2]*prmnk->Qx[2] );  

        // ------ фильтрованный КВАДРАТ ПУЧНОСТИ  -------
        prmnk->XAmpl = prmnk->fi_Xa.BlockOut;

        // ------ фильтрация -------
        Run_Z2Coef( &prmnk->fi_Xb,  prmnk->Qx[2] );

        // ------ Регулирование отфильтрованного параметра prmnk->Qx[2] -------
        Run_PiReg( &prmnk->pi_pll_x1,  prmnk->fi_Xb.BlockOut );
        //Run_PiReg( &prmnk->pi_pll_x2, -prmnk->pi_pll_x1.BlockOut );
        prmnk->pi_pll_x2.BlockOut = prmnk->pi_pll_x1.BlockOut;

        prmnk->Summ += prmnk->pi_pll_x1.BlockOut;
        if ( ++prmnk->Counter >= 500 )
        {
            prmnk->Summ *= (float)0.002;
            if ( prmnk->Summ < -5e-6 ) prmnk->val -= 3e-6;
            if ( prmnk->Summ >  5e-6 ) prmnk->val += 3e-6;

            prmnk->Counter = 0;
            prmnk->Summ = (float)0.0;
        }
*/
}
Exemplo n.º 5
0
//*****************************************************************
//
//*****************************************************************
void Run_Demod_RMNK( TRMNK *prmnk, float inX_raw, float inX, float inY )
{
    float  HQx_raw, HQx, HQy, HQyP;
    float  MjuX_raw[3], MjuX[3], MjuY[3], MjuYP[3];
    float  XPhaseIncriment, YPhaseIncriment;

    MjuX_raw[0] = (float)1e-5;
    MjuX_raw[1] = (float)0.005;
    MjuX_raw[2] = (float)0.005;

    MjuX[0] = (float)1e-5;
    MjuX[1] = (float)0.001;
    MjuX[2] = (float)0.001;

    MjuY[0] = (float)1e-4;
    MjuY[1] = (float)0.003;
    MjuY[2] = (float)0.003;

    //MjuYP[0] = (float)0.0001;
    //MjuYP[1] = (float)0.001; 
    //MjuYP[2] = (float)0.001;

    XPhaseIncriment = prmnk->delta_phi + prmnk->pi_pll_x2.BlockOut;
    prmnk->XPeriod_invert = XPhaseIncriment *  TWO_PI_INVERT;
    prmnk->XPeriod        = TWO_PI / XPhaseIncriment;
    prmnk->XFrequency     = prmnk->XPeriod_invert * ALGO_FREQUENCY;
    prmnk->x_phi          = prmnk->x_phi + XPhaseIncriment;
    if ( prmnk->x_phi >= TWO_PI ) prmnk->x_phi -= TWO_PI;
    prmnk->x_base_sin     = sinf(prmnk->x_phi);
    prmnk->x_base_cos     = cosf(prmnk->x_phi);
/*
    YPhaseIncriment = prmnk->delta_phi + prmnk->pi_pll_y.BlockOut;
    prmnk->YPeriod_invert = YPhaseIncriment *  TWO_PI_INVERT;
    prmnk->YPeriod        = TWO_PI / YPhaseIncriment;
    prmnk->YFrequency     = prmnk->YPeriod_invert * ALGO_FREQUENCY;
    prmnk->y_phi           = prmnk->y_phi + YPhaseIncriment;
    if ( prmnk->y_phi >= TWO_PI ) prmnk->y_phi -= TWO_PI;
    prmnk->y_base_sin = sinf(prmnk->y_phi);
    prmnk->y_base_cos = cosf(prmnk->y_phi);
*/
    // *****************************************************************
    // ******  Оценка амплитуды сигнала перед Полосовым фильтром   *****
    // *****************************************************************
    // ---------- Только для Оценки Коефиициента К --------
        HQx_raw          = prmnk->Qx_raw[0] + prmnk->x_base_sin*prmnk->Qx_raw[1] + prmnk->x_base_cos*prmnk->Qx_raw[2] - inX_raw;
        prmnk->Qx_raw[0] = prmnk->Qx_raw[0] - MjuX_raw[0] *                     HQx_raw;
        prmnk->Qx_raw[1] = prmnk->Qx_raw[1] - MjuX_raw[1] * prmnk->x_base_sin * HQx_raw;
        prmnk->Qx_raw[2] = prmnk->Qx_raw[2] - MjuX_raw[2] * prmnk->x_base_cos * HQx_raw;

        prmnk->XAmpl = sqrtf(prmnk->Qx_raw[1]*prmnk->Qx_raw[1] + prmnk->Qx_raw[2]*prmnk->Qx_raw[2]);
    
    // *****************************************************************
    // ******  Оценка фильтрованных параметров Канала X   **************
    // *****************************************************************
    // -------- СТРОЮ ПЛЛ по нему Возбуждение и компенсация ---------
        HQx          = prmnk->Qx[0] + prmnk->x_base_sin*prmnk->Qx[1] + prmnk->x_base_cos*prmnk->Qx[2] - inX;
        prmnk->Qx[0] = prmnk->Qx[0] - MjuX[0] *                     HQx;
        prmnk->Qx[1] = prmnk->Qx[1] - MjuX[1] * prmnk->x_base_sin * HQx;
        prmnk->Qx[2] = prmnk->Qx[2] - MjuX[2] * prmnk->x_base_cos * HQx;

        // ----- Построение ФАпча X -------
        Run_PiReg( &prmnk->pi_pll_x1,  prmnk->Qx[2]              );
        Run_PiReg( &prmnk->pi_pll_x2, -prmnk->pi_pll_x1.BlockOut );

        // ---- Коефициент передачи полосового фильтра ------
        //prmnk->KFilter = - prmnk->base_XAmpl / prmnk->Qx[1];
        prmnk->KFilter = - prmnk->XAmpl / prmnk->Qx[1];
        prmnk->XMean   =   prmnk->Qx[0];
        //prmnk->XAmpl   = - prmnk->Qx[1];


    // ******************************************************************
    // ******  Оценка фильтрованных параметров Канала Y    **************
    // ******************************************************************
        HQy          = prmnk->Qy[0] + prmnk->x_base_sin*prmnk->Qy[1] + prmnk->x_base_cos*prmnk->Qy[2] - inY;
        prmnk->Qy[0] = prmnk->Qy[0] - MjuY[0] *                     HQy;
        prmnk->Qy[1] = prmnk->Qy[1] - MjuY[1] * prmnk->x_base_sin * HQy;
        prmnk->Qy[2] = prmnk->Qy[2] - MjuY[2] * prmnk->x_base_cos * HQy;

        prmnk->YMean =  prmnk->Qy[0];
        //prmnk->YAmpl =  sqrtf( prmnk->Qy[1]*prmnk->Qy[1] + prmnk->Qy[2]*prmnk->Qy[2] );
        //prmnk->CAmpl = -prmnk->Qy[1];
        //prmnk->QAmpl = -prmnk->Qy[2];
        prmnk->YAmpl =  sqrtf( prmnk->Qy[1]*prmnk->Qy[1] + prmnk->Qy[2]*prmnk->Qy[2] ) * prmnk->KFilter;
        //prmnk->CAmpl = -prmnk->Qy[1] * prmnk->KFilter;
        //prmnk->QAmpl = -prmnk->Qy[2] * prmnk->KFilter;

    // ******************************************************************
    // ******  Оценка фильтрованных параметров Канала Y    **************
    // ******************************************************************
/*
        HQyP          = prmnk->QyP[0] + prmnk->y_base_sin*prmnk->QyP[1] + prmnk->y_base_cos*prmnk->QyP[2] - inY;
        prmnk->QyP[0] = prmnk->QyP[0] - MjuYP[0] *                     HQyP;
        prmnk->QyP[1] = prmnk->QyP[1] - MjuYP[1] * prmnk->y_base_sin * HQyP;
        prmnk->QyP[2] = prmnk->QyP[2] - MjuYP[2] * prmnk->y_base_cos * HQyP;

        // ----- Построение ФАпча X -------
        Run_PiReg( &prmnk->pi_pll_y, prmnk->QyP[2] );

        prmnk->YMean =  prmnk->Qy[0];
        prmnk->YAmpl =  sqrtf( prmnk->Qy[1]*prmnk->Qy[1] + prmnk->Qy[2]*prmnk->Qy[2] ) * prmnk->KFilter;
*/

//        prmnk->x_base_sin = - prmnk->x_base_sin;
//        prmnk->x_base_cos = - prmnk->x_base_cos;
}