motorcontroldemo_035/Vinclude/V_SSI_Encoder.h
Dmitry Shpak a99491f9b8 Основные обновления в данном коммите:
- проект переведён на VectorIDE v1.3

В целях экономии памяти удалены:
 - модуль управления светодиодами
 - модуль ШИМ для двигателей SRD
 - модуль часов реального времени
 - режим привода для измерения задержки меджу сигналами ШИМ и измерениями токов

Добавлены следующие модули:
 - проект переведён на VectorIDE v1.3
 - модуль SPI для абсолютного ДПР
 - модуль управление реле для заряда ЗПТ
 - модуль дискретных вводов-выводов
 - модуль управления вентилятором Одноплатного Инвертора
 - модуль тормозного резистора Одноплатного Инвертора

Прочие изменения:
 - оптимизирована инициализация регистров периферии
 - удалено множество неиспользуемых переменных
 - разрешение работы всех GPIO перенесено в функцию "PeripheralClockEnable"
 - добавлен счётчик индексной метки энкодера
 - исправлен сброс прерываний модуля захвата CAP
 - переработан режим задания постоянного тока статора
- исправлены прочие мелкие ошибки в разных модулях
2021-12-01 13:54:14 +03:00

126 lines
4.6 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.

/*!
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
\file V_SSI_Encoder.h
\brief Модуль оценки скорости и положения при помощи цифрового энкодера, работающего по интерфейсу SSI (см. TSSI_Encoder)
\author ООО "НПФ Вектор". http://motorcontrol.ru
\version v 1.0 25/04/2016
\defgroup V_SSI_Encoder Модуль оценки скорости и положения при помощи SSI Encoder (см. TSSI_Encoder)
\addtogroup V_SSI_Encoder
@{*/
#include "V_IQmath.h"
#include "filter.h"
#ifndef V_SSI_ENCODER_H
#define V_SSI_ENCODER_H
// Разрешение энкодера
#define SSI_ENC_RESOLUTION 12
// Из-за особенностей схемы, будет приниматься на 1 бит больше, чем надо,
// поэтому старший будем обнулять этой маской
#define SSI_ENC_DATA_MASK ((1 << SSI_ENC_RESOLUTION) - 1)
#ifdef __cplusplus
extern "C" {
#endif
/*! \class TSSI_Encoder
\brief Модуль обработки энкодера, работающего по SSI (упрощенный SPI). А именно для датчика HENGSTLER absolute encoder AC 58.
Класс \a TSSI_Encoder, основанный на структуре SSI_Encoder,
является модулем для определения углового положения и скорости ротора
двигателя по данным от энкодера, работающего по SSI.
Датчик предполагается подключать на разъем J8 платы из комплекта DRV8301-HC-EVM.
Вот только микросхему гальванической развязки (U5) Texas туда поставили почему-то такой стороной, что микроконтролер
работает как slave стройство. Чтобы сделать его мастером, нужно поставить другую аналогичную микросхему, или...
перевернуть U5 вверх ногами, поставив маркировкой вниз, лапками к верху :)
*/
//! см. TSSI_Encoder
struct S_SSI_Encoder {
Uint32 resol; //!<INPUT: разрешение датчика в метках/оборот;
float resol_inv; //!<обратная величина к разрешению датчика resol
Uint16 pole_pairs; //!<INPUT: число пар полюсов;
Uint16 rotation_dir; //!<INPUT: направление вращения
float speed_nom; //!<INPUT: номинальная скорость в об/мин;
_iq speed_elec; //!<OUTPUT: электрическая скорость в Q24(относительные единицы)
_iq theta_elec; //!<OUTPUT: электрический угол в Q24(относительные единицы)
Uint16 Poscnt_res; //!<Механическ.угол в метках;
Uint16 Poscnt_resPrev; //!<Механическ.угол в метках предыдущее значение;
_iq theta_mech; //!<Механический угол;
_iq prevThetaMech; //!<Механический угол предыдущее значение;
_iq theta_el_tmp; //!<TEMPORARY: электрический угол;
_iq theta_mech_filtered; //!<Механический угол фильтрованный;
_iq theta_mech_filterK; //!<Коэффициент фильтра мех. угла;
_iq AngleOffset;//!< Смещение электрического угла в градусах
int16 RevolutionCounter; // Количество механических оборотов;
int16 Poscnt_resContinouosInt8;//!<Механическ.угол в метках c учетом кол-ва оборотов (переменная 8 разрядов отсекается)
int16 Poscnt_resContinouosInt;//!<Механическ.угол в метках c учетом кол-ва оборотов (переменная 16 разрядов)
long Poscnt_resContinouosLong;//!<Механическ.угол в метках c учетом кол-ва оборотов (переменная 32 разрядов)
_iq theta_mechContinouos; //!<Механический угол в градусах абсолютный;
_iq theta_elecContinouos; //!<Электрический угол в градусах абсолютный;
void (*init)(volatile struct S_SSI_Encoder*);
void (*calc)(volatile struct S_SSI_Encoder*);
void (*read)(volatile struct S_SSI_Encoder*);
};
typedef volatile struct S_SSI_Encoder TSSI_Encoder;
//! Инициализатор по-умолчанию.
#define SSI_ENCODER_DEFAULTS {.init = SSI_Encoder_init,\
.calc = SSI_Encoder_Calc,\
.read = SSI_Encoder_Read,\
}
//! \memberof TSSI_Encoder
void SSI_Encoder_init(TSSI_Encoder*);
//! \memberof TSSI_Encoder
void SSI_Encoder_Calc(TSSI_Encoder*);
//! \memberof TSSI_Encoder
void SSI_Encoder_Read(TSSI_Encoder*);
#ifdef __cplusplus
}
#endif
#endif
/*@}*/