MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/driver/chipset/Amc1210Analizer.hh

121 lines
3.9 KiB
C++
Raw Permalink Normal View History

2024-06-07 11:12:56 +03:00
/*!\file
* \brief Файл содержит модуль обработки сигналов микросхемы AMC1210.
*/
/*
* Amc1210Analizer.h
*
* Created on: 16 мар. 2018 г.
* Author: titov
*/
#ifndef SOURCE_DRIVER_AMC1210ANALIZER_H_
#define SOURCE_DRIVER_AMC1210ANALIZER_H_
#include "../../driver/IResolver.hh"
namespace driver { namespace detail {
//!Класс анализирует сигналы от Amc1210.
/*!Класс анализирует и исправляет артефакты обработки и взаимодествия с amc1210.
*
*/
class Amc1210Analizer : public IResolver {
public:
//!Структура настроек класса.
struct Setting {
float max_frequency; //!<Максимальная частота вращения СКВТ, электрическая, Гц.
float max_amplitude; //!<Максимальная амплитуда сигналов СКВТ, в первичных единицах.
float max_value; //!<Максимально-допустимое значения сигнала по каналу СКВТ, в первичных единицах.
float max_noise; //!<Максимально-допустимое значение шума по каналу СКВТ, в первичных единицах.
Setting();
bool isValid();
};
private:
struct Quad {
float sin;
float cos;
Quad() = default;
Quad( float s, float c ) : sin(s), cos(c) {}
Quad operator-( const Quad & b ) { return Quad( sin - b.sin, cos - b.cos ); }
bool operator==( const Quad & b ) { return sin == b.sin && cos == b.cos; }
} code, raw, prev, old, prev_delta;
IResolver & amc_scrt;
//!Обработка ошибки выдачи данных от amc1210 при переходе через ноль.
//!Ошибка заключается в следующем:
//!При переходе через 0 из положительных значений в отрицательные можем
//!получить код значения близкий к 0x7FFF, аналогично при переходе из отрицательных значений.
struct ZeroCrossingCorrection {
float max_delta;
float max_value;
Quad correct( const Quad & current, const Quad & previous ) const;
} zero_crossing;
//!Обработка ошибки выдачи данных от amc1210.
//!Ошибка заключается в следующем:
//!Данные по каналам обновляются независимо и есть шанс получить повтроное значение.
struct NonUpdateValues {
float min_delta;
float max_delta;
Quad correct( const Quad & current, const Quad & current_delta, const Quad & previous_delta ) const;
} non_update;
//!Проверка сигналов на недопустимые значения.
struct Overflow {
float max_value;
bool validate( Quad & current );
} overflow;
//!Проверка сигналов на резкый одиночный выброс.
struct Spike {
float max_delta;
bool validate( Quad & current, const Quad & current_delta, const Quad & old );
} spike;
bool valid_signal;
bool failure_amc1210;
float max_speed; //!<
unsigned int count_error;
static const unsigned int max_error = 160;
public:
Amc1210Analizer( driver::IResolver & scrt_amc1210 );
bool configure( Setting & config );
float getSinChannel() const;
float getCosChannel() const;
float getSquareSumChannel() const;
void setSampleTime( float Ts );
const bool & isValidData() { return valid_signal; }
const bool & isFailure() { return failure_amc1210; }
void process();
};
}}
#endif /* SOURCE_DRIVER_AMC1210ANALIZER_H_ */