асинхронный двигатель и контроллер

Автор Dtolok, 26 Дек. 2015 в 00:34

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

on4ip

Забудьте вы про вход. Сравните показания клещей и датчика на фазе двигателя.
В жизни все не так, как на самом деле.

Dtolok


Dtolok

ковыряясь в программе обнаружил одну хрень - а именно EstimParm.qImr - периодически меняет свое значение ! ограничение в программе стоит на уровне минимума 2000. но в какой то момент происходит бросок до 24000! это значение Magnetizing current (as calculated from
measured values) - которое вычисляется. может это и есть моя проблема?

#ifdef USEIMRREF
        // Omeg2Estim=Iq/Imr/Tr when Reference Value of magnatising current is used
EstimParm.qOmeg2Estim= (int)(__builtin_mulss(ParkParm.qIq, MotorEstimParm.qRrInvTr)>>15);
#else

//*******************************
// Current Model
// Imr = 1/Tr * Intergal{ (Id-Imr).dt } when real value of magnetising current is used

        temp_int = (int)(ParkParm.qId - EstimParm.qImr);
EstimParm.qImrStateVar += __builtin_mulss(temp_int,MotorEstimParm.qInvTr) ;
EstimParm.qImr      = (int)(EstimParm.qImrStateVar>>15);

EstimParm.qIqInvTr2=__builtin_mulss(ParkParm.qIq, MotorEstimParm.qInvTr2);

/* limit the magnetizing current to guarantee stability */
if (EstimParm.qImr<2000)
        {
EstimParm.qImr=2000;
}

EstimParm.qOmeg2Estim = EstimParm.qIqInvTr2/EstimParm.qImr;

#endif


Добавлено 24 Июнь 2016 в 12:10

ParkParm.qId - вычисляется в
; MeasCompCurr

;Description:       
;  Read Channels 1 & 2 of ADC, scale them as signed fractional values
;  using qKa, qKb and put the results qIa and qIb of ParkParm.
;  Running average value of ADC-Ave is maintained and subtracted from
;  ADC value before scaling.
;
;  Specifically the offset is accumulated as a 32 bit signed integer       
;         iOffset += (ADC-Offset)
;  and is used to correct the raw ADC by
;         CorrADC = ADCBUFn - iOffset/2^16
;  which gives an offset time constant of ~ MeasurementPeriod*2^16
;
;  Do not call this routine until conversion is completed.
;
;  Scaling constant, qKa and qKb, must be set elsewhere such that
;         qIa = 2 * qKa * CorrADC1
;         qIb = 2 * qKb * CorrADC2
;  The factor of 2 is designed to allow qKa & qKb to be given in 1.15.
;
;
;Functional prototypes: 
;         void MeasCompCurr( void );
;         void InitMeasCompCurr( short iOffset_a, short iOffset_b );
;
;On Start:   Must call InitMeasCompCurr.
;
;On Entry:   MeasCurrParm structure must contain qKa & qKb. ADC channels 1 & 2
;            must contain signed fractional value.
;
;On Exit:    ParkParm will contain qIa & qIb.

по моему какой то параметр вываливается за пределы

on4ip

Imr это ток определяющий поток машины, он связан с током Id через модель поля ротора машины, которая в свою очередб представляет из себя апериодическое звено с постоянной времени Tr равной постоянной времени ротора
( Tr=Lr\Tr) где Lr=Lm+Lsigmar(Lm главная индуктивность машины Lsigma индуктивность рассеяния).
Собственно если на регулятор Id идет какоето задание и оно постоянно и регулятор его отрабатывает то Imr будет постоянным если ток Id прыгает то I mr через фильтр тоже измениться.
Поэтому причина скорее в броске тока либо в броске оценки постоянной времени ротора.
Вы же говорили что работатете в разомкнутом U\F там все выше названное не имеет смысла никакого.
А ну и еще Imr должно быть ограничено с низу чтоб обеспечить устойчивость.
В жизни все не так, как на самом деле.

Dtolok

мотор работает в разомкнутом цикле - только последовательность вычислений та же хоть в разомкнутом хоть в замкнутом - кроме корректировки по ПИ регуляторам

           MeasCompCurr2();/* get the current from ADC bufs */       
            ClarkePark();   /* Clarke and Park */               
            Estim();        /* estimate speed & angle */           
            DoControl();    // Calculate control values - расчет по открытому или закрытому контуру происходят здесь!!!!

            if (!uGF.bit.OpenLoop) SincosParm.qAngle=EstimParm.qRho;
            else SincosParm.qAngle=ParkParm.qAngle;
           
           
            SinCos();
            ParkParm.qSin=SincosParm.qSin;
            ParkParm.qCos=SincosParm.qCos;

            InvPark();   

            CalcRefVec();// Calculate Vr1,Vr2,Vr3 from qValpha, qVbeta           
             CalcSVGen();// Calculate and set PWM duty cycles from Vr1,Vr2,Vr3


вот это подпрограмма

// Executes one PI itteration for each of the three loops Id,Iq,Speed
void DoControl( void )
{
short i;

    ReadADC0( &ReadADCParm );// Assume ADC channel 0 has raw A/D value in signed fractional form from speed pot
    CtrlParm.qVelRef = ReadADCParm.qADValue>>3;// reference speed is read by ADC (max=0x7FC0/8=4088)
    if( uGF.bit.OpenLoop )
      {
           // OPENLOOP:  force rotating angle,Vd,Vq

        if( uGF.bit.ChangeMode )
            {         
            uGF.bit.ChangeMode = 0;// just changed to openloop
            CtrlParm.qVqRef = 0;// VqRef & VdRef not used
            CtrlParm.qVdRef = 0;
            }

        OpenLoopParm.qVelMech = CtrlParm.qVelRef;

        // calc rotational angle of rotor flux in 1.15 format

        ParkParm.qVq = 0;

        if( OpenLoopParm.qVelMech >= 0 )i = OpenLoopParm.qVelMech;           
        else i = -OpenLoopParm.qVelMech;
           
        uWork = i <<3;
       
        /* limit high the voltage, for deadtime counteract */
        if( uWork > 0x5a82 )//
            uWork = 0x5a82;
        /* limit low the voltage, for compensate stator voltage drop */
        if( uWork < 0x0500)
            uWork = 0x0500;

        ParkParm.qVd = uWork;
       
        /* generate the angle */
        OpenLoop();
        ParkParm.qAngle = OpenLoopParm.qAngFlux;
     } // end open loop
    else // Closed Loop Vector Control
        {
        if( uGF.bit.ChangeMode )
        {
            // just changed from openloop
            uGF.bit.ChangeMode = 0;
        }

        // Calculate qVdRef from field weakening
        FdWeakening();
           
               
        // Check to see if new velocity information is available by comparing
        // the number of interrupts per velocity calculation against the
        // number of velocity count samples taken.  If new velocity info
        // is available, calculate the new velocity value and execute
        // the speed control loop.
        if(speed_loop_cnt > SPEED_LOOP_CNT)
        {
speed_loop_cnt = 0;

#ifndef TORQUE_MODE
            PIParmQref.qInRef  = CtrlParm.qVelRef;
PIParmQref.qInMeas = EstimParm.qVelEstim;
            CalcPI(&PIParmQref);
            CtrlParm.qVqRef    = PIParmQref.qOut;
#endif
        }
        else
        {
            speed_loop_cnt ++;
}
       
        // If the application is running in torque mode, the velocity
        // control loop is bypassed.  The velocity reference value, read
        // from the potentiometer, is used directly as the torque
        // reference, VqRef.

#ifdef TORQUE_MODE
        CtrlParm.qVqRef = CtrlParm.qVelRef * 4;
#endif

       
        // PI control for Q
        PIParmQ.qInMeas = ParkParm.qIq;
        PIParmQ.qInRef  = CtrlParm.qVqRef;
        CalcPI(&PIParmQ);
        ParkParm.qVq    = PIParmQ.qOut;
       

        // PI control for D
        PIParmD.qInMeas = ParkParm.qId;
        PIParmD.qInRef  = CtrlParm.qVdRef;
        CalcPI(&PIParmD);
        ParkParm.qVd    = PIParmD.qOut;

        }


}


Добавлено 24 Июнь 2016 в 12:27

ParkParm.qVd - в открытом контуре напрямую связан с регулятором скорости

on4ip

Вы не так меня поняли. Вы пытаетесь запустить векторную систему, она должна быть замкнута по положению ротора. У вас настройки не пойми куда и какая то каша пока.
Используйте режим U\F констаната там нет никакиъ регуляторов и прочего. Там задание по компонентам Alfa и Beta и ШИМ
В таком режиме система будет определена жесткостью двигателя и будет стабильна если ее не насиловать рывками.
В таком случае вы сможете сравнить адкватность датчиков тока и измерений системы.
Если с ними все в порядке то нужно настраивать сам векторный контур


Добавлено 24 Июнь 2016 в 12:35

Ну да можно использовать и регуляторы тока но тогда встает вопрос в их устойчивости, что тоже в вашем случае может быть проблемным.
В жизни все не так, как на самом деле.

Dtolok

а какое при постоянном токе должно быть значение ParkParm qIa & qIb т.е. оно же как то меняется и тоже не должно выходить за пределы? по моему у меня проблемы с расчетом именно этих параметров

on4ip

А разве это не фазные токи А и В?
В жизни все не так, как на самом деле.

Dtolok

они вычисляются по фазным токам! но мне кажется как то странно!
вот их расчет (условный)
;  Read Channels 1 & 2 of ADC, scale them as signed fractional values
;  using qKa, qKb and put the results qIa and qIb of ParkParm.
;  Running average value of ADC-Ave is maintained and subtracted from
;  ADC value before scaling.
;
;  Specifically the offset is accumulated as a 32 bit signed integer       
;         iOffset += (ADC-Offset)
;  and is used to correct the raw ADC by
;         CorrADC = ADCBUFn - iOffset/2^16
;  which gives an offset time constant of ~ MeasurementPeriod*2^16
;
;  Do not call this routine until conversion is completed.
;
;  Scaling constant, qKa and qKb, must be set elsewhere such that
;         qIa = 2 * qKa * CorrADC1
;         qIb = 2 * qKb * CorrADC2
;  The factor of 2 is designed to allow qKa & qKb to be given in 1.15.
;
;
;Functional prototypes: 
;         void MeasCompCurr( void );
;         void InitMeasCompCurr( short iOffset_a, short iOffset_b );
;
;On Start:   Must call InitMeasCompCurr.
;
;On Entry:   MeasCurrParm structure must contain qKa & qKb. ADC channels 1 & 2
;            must contain signed fractional value.
;
;On Exit:    ParkParm will contain qIa & qIb.

Добавлено 24 Июн 2016 в 12:42:49

меня смущает вот это
Specifically the offset is accumulated as a 32 bit signed integer       
;         iOffset += (ADC-Offset)
;  and is used to correct the raw ADC by
;         CorrADC = ADCBUFn - iOffset/2^16

Добавлено 24 Июнь 2016 в 12:44

что это за маштабирование?? зачем оно нужно?

Dtolok

можно без включения двигателя просмотреть параметры напряжения - задавая ток с датчиков?

Dtolok

провел эксперимент -вручную задавал ток от датчиков - получается в открытом контуре  -  ParkParm will contain qIa & qIb - не имеют значение???

Dtolok

в общем подошел к вопросу кардинально - выкинул из программы все что не касается разомкнутого цикла! как оказалось программы всего да ничего для работы с  U/F .

on4ip

В жизни все не так, как на самом деле.

Dtolok

да все то же! прошерстил микрочиповский апноут - они 20 раз проверяют превышение тока по датчику во время шим прежде чем выдать ошибку ! и на скалярке ставят датчик по DC шине - там пульсации меньше . так что порекомендуете - проверку фазных датчиков или перейти на датчик по DC шине?

Добавлено 25 Июн 2016 в 10:09:32


tempI1 = ADC1BUF1;  if (tempI1 < 0) tempI1 = - tempI1;   
    tempI2 = ADC1BUF2;  if (tempI2 < 0) tempI2 = - tempI2;               
    if ( tempI1 > IErr || tempI2 > IErr )
        {
            PTCON = 0x0000; LATB  = LATB & 0x03FF;// Disable PWM for center aligned operation       
            uGF.bit.RunMotor = 0;       
            uGF.bit.flag_IErr = 1;                                             
            uGF.bit.flag_START =0;                     
         }   

что то происходит в этом куске кода! смотрел датчики во время работы - нет явных помех ... при работе даже на маленьких оборотах (ток на клещах 10А) - через время происходит выход по превышению tempI > IErr

Добавлено 25 Июнь 2016 в 10:11

модуль в импульсе держит 150А - может все таки проверять на максимальные для датчика 100А - и только тогда отрубать мотор? или все таки добавить проверку 20 (может меньше) периодов на превышение номинальных для модуля 75А?

Dtolok

в общем сделал - 10 проверок PWM при 20кГц - 1мкс номер прокатил! но немного не рассчитал с охлаждением. 12в вентилятор 80х80 явно маловат. буду менять на 220в - посмотрю что с этого выйдет. в следующий раз корпус сделаю по просторней..

on4ip

10 проверок при 20 кгц это 500 мкс, за это время ключику плохо может стать. У меня защита это 1 таки щим или иногда пол такта. Вы криво решили проблему м потенциально опасно.
В жизни все не так, как на самом деле.

Dtolok

так это же такты шим а не количество  1/20000 * 10 = 0,0005с - я сделал на 10 проверок - поправьте где не прав

Dtolok

а не подскажете - как в открытом контуре ток уменьшить? 

Добавлено 26 Июн 2016 в 19:17:33

только напряжением?  ток зависит от скважности ?

Добавлено 26 Июн 2016 в 19:20:06

быстро нагревается радиатор - может конечно его размеры не соответствуют мощности частотника - размер 24см х 18 см и высота 7 см  + 2 вентилятора по 35м3/ч - после 5 минут работы на полную мощность  датчик температуры  по фаулт начинает выдавать перегрев.

Добавлено 26 Июнь 2016 в 19:20

при этом двигатель практически не нагрелся.. еле теплый