/*!\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_ */