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