78 lines
1.8 KiB
C++
78 lines
1.8 KiB
C++
/*
|
||
* FieldCalculation.hh
|
||
*
|
||
* Created on: 16 мар. 2021 г.
|
||
* Author: titov
|
||
*/
|
||
|
||
#ifndef UMLIBRARY_PROCESSING_FIELDCALCULATION_HH_
|
||
#define UMLIBRARY_PROCESSING_FIELDCALCULATION_HH_
|
||
|
||
#include "../systemic/ISignal.hh"
|
||
#include "../systemic/IProcess.hh"
|
||
|
||
#include "../units/LogicalEntities.hpp"
|
||
#include "../units/PhysicalQuantities.hpp"
|
||
|
||
#include "../math/math_inc.hh"
|
||
|
||
namespace processing {
|
||
|
||
//!Модуль осуществляет вычисление позиции поля из позиции ротора.
|
||
class FieldCalculation : public systemic::IProcess {
|
||
|
||
float _Np;
|
||
float _ThetaZero;
|
||
|
||
systemic::ISignal & position;
|
||
systemic::ISignal & speed;
|
||
|
||
float est_theta;
|
||
float est_omega;
|
||
|
||
public:
|
||
//vector::ITechValue & getThetaNull();
|
||
FieldCalculation( systemic::ISignal & position, systemic::ISignal & speed );
|
||
|
||
struct Setting {
|
||
|
||
units::Quantity Np; //!<Количество пар полюсов.
|
||
units::ElectricalAngle ThetaZero; //!<Позиция электрического нуля.
|
||
|
||
Setting() : Np(0), ThetaZero(-11.0f) {}
|
||
bool isValid() {
|
||
|
||
using namespace std;
|
||
|
||
Setting non_valid;
|
||
|
||
if( not Np or Np > 128 )
|
||
Np = non_valid.Np;
|
||
|
||
if(
|
||
not isfinite(ThetaZero)
|
||
or ThetaZero <= - math::constants::pi2
|
||
or ThetaZero >= math::constants::pi2
|
||
)
|
||
ThetaZero = non_valid.ThetaZero;
|
||
|
||
return Np != non_valid.Np
|
||
and ThetaZero != non_valid.ThetaZero;
|
||
}
|
||
|
||
};
|
||
|
||
void configure( const Setting & config );
|
||
|
||
const float & theta() const;
|
||
const float & omega() const;
|
||
|
||
void process();
|
||
};
|
||
|
||
}
|
||
|
||
|
||
|
||
#endif /* UMLIBRARY_PROCESSING_FIELDCALCULATION_HH_ */
|