121 lines
3.2 KiB
C++
121 lines
3.2 KiB
C++
/*!\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_ */
|