MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/processing/TrackingPositionScrt.hh

133 lines
4.7 KiB
C++
Raw Normal View History

2024-06-07 11:12:56 +03:00
/*
* TrackingPositionScrt.h
*
* Created on: 26 янв. 2018 г.
* Author: titov
*/
#ifndef SOURCE_PROCESSING_TRACKINGPOSITIONSCRT_H_
#define SOURCE_PROCESSING_TRACKINGPOSITIONSCRT_H_
#include "../driver/IResolver.hh"
#include "../math/math_inc.hh"
namespace processing {
//class Observer_FirstOrder {
//private:
// float est_dx;
// float est_x;
//
// const float est_range;
//};
//!Класс обработки путевой информации из данных от резольвера.
/*!Модуль использует интерфейс резольвера для получения исходных данных.
* Исходными данными является квадратурный сигнал позиции.
* Восстанавливает скорость, позицию из квадратурного сигнала.
*/
class TrackingPositionScrt {
public:
typedef driver::IResolver TrackerInterface;
struct Setting {
float L1; //!<Коэффициент следящей системы, установить 1000.
float L2; //!<Коэффициент следящей системы, установить1000^2/2.
float ThetaNull; //!<Угол коммутации, рад.
unsigned long Np; //!<Количество пар полюсов двигателя.
float scrt_power_max; //!<Максимальное значение суммы квадратов для синус-косинусного вращающегося трансформатора.
float scrt_power_min; //!<Минимальное значение суммы квадратов для синус-косинусного вращающегося трансформатора.
float scrt_speed_max; //!<Максимальная скорость синус-косинусного вращающегося трансформатора, рад/с.
unsigned long Nr; //!<Количество пар полюсов резольвера.
bool isValid();
Setting() : L1(0.0f), L2(0.0f), ThetaNull(NAN), Np(0xFFFFu),
scrt_power_max(0.0f), scrt_power_min(0.0f), scrt_speed_max(0.0f), Nr(0xFFFFu) {}
};
private:
driver::IResolver & scrt;
//Модель датчика.
float est_sens_speed;
float est_sens_position_pi2;
float est_sens_turn;
float est_sens_error;
//todo: Вынести представления в отдельные модули.
//Представление в электрических координатах.
float est_theta;
float est_omega;
//Представление в физических координатах.
float est_position;
float est_speed;
unsigned int error_counter; //!<Счетчик ошибки.
private:
float _Ts;
//Данные расчета ошибки:
float _power_max; //!<Максимально-допустимая сумма квадратов сигналов СКВТ.
float _power_min; //todo Проверить почему здесь!
float _Tun; //!<Допустимое время без данных.
unsigned int _Nerr;
float prev_scrt_sin;
float prev_scrt_cos;
float prev_error;
//Настройки наблюдателя позиции.
float _L1Base;
float _L2Base;
float _L1Ts;
float _L2Ts;
//Настройки предстваления в электрических координатах.
float _ThetaZero;
float _Np_Nr;
//Настройки представления в физических координатах.
float _1_Nr;
float _pi2_Nr;
void bad_data_handler();
~TrackingPositionScrt() = default;
public:
TrackingPositionScrt( driver::IResolver & resolver );
void configure( const Setting & setting );
void setSampleTime( float Ts );
void process();
//!Функция позволяет получить текущую позицию.
const float & position() { return est_position; }
//!Функция позволяет получить текущую скорость.
const float & speed() { return est_speed; }
//!Функция позволяет получить текущий электрический угол.
const float & theta() { return est_theta; }
//!Функция позволяет получить текущий электрическую скорость.
const float & omega() { return est_omega; }
const float & pos_error() { return est_sens_error; }
bool isError() const { return error_counter == _Nerr; }
};
}
#endif /* SOURCE_PROCESSING_TRACKINGPOSITIONSCRT_H_ */