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

121 lines
3.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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