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

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

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

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

215 lines
8.0 KiB
C

/*!
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_DPR_eCAP.h
\brief Ìîäóëü ðàñ÷¸òà ñêîðîñòè è ïîëîæåíèÿ ïî òð¸ì äàò÷èêàì íà ýëåìåíòàõ Õîëëà.
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
\version v 2.0 25/03/2016
*/
#ifndef V_DPR_ECAP_H
#define V_DPR_ECAP_H
#ifdef __cplusplus
extern "C"
{
#endif
struct SDPReCAPFLG1_BITS // bits
{
Uint16 AngleMode:
1; // 0 Ðåæèì ðàñ÷åòà óãëà: 0 - 6 ñåêòîðîâ, 1 - èíòåðïîëÿöèÿ
Uint16 SpeedMode:
1; // 1 Ðåæèì ðàñ÷åòà ñêîðîñòè: 0 - ïî êàæäîìó äàò÷èêó, 1 - ïî êàæäîé ìåòêå
Uint16 Dir:
1; // 2 Íàïðàâëåíèå äâèæåíèÿ: 0 - ïî ÷àñîâîé, 1 - ïðîòèâ.
Uint16 PrevDir:
1; // 3 Íàïðàâëåíèå äâèæåíèÿ: 0 - ïî ÷àñîâîé, 1 - ïðîòèâ.
Uint16 CAPnumber:
2; // 4-5 Íîìåð eCAP, ïî êîòîðîìó áûëî ïðåäûäóùåå ïðåðûâàíèå.
Uint16 ZeroFLG:
1; // 6 Ôëàã îáíóëåíèÿ ñêîðîñòè
Uint16 SpeedMinFLG:
1; // 7
Uint16 firstlaunch1:1; //!< 1 FLAG: ïåðâîå ïîïàäàíèå â ïðåðûâàíèå eCAP1.
Uint16 firstlaunch2:1; //!< 2 FLAG: ïåðâîå ïîïàäàíèå â ïðåðûâàíèå eCAP2.
Uint16 firstlaunch3:1; //!< 3 FLAG: ïåðâîå ïîïàäàíèå â ïðåðûâàíèå eCAP3.
Uint16 rsvd:
5; // 8-15 reserved;
};
union SDPReCAP_FLG1
{
Uint16 all;
struct SDPReCAPFLG1_BITS bit;
};
struct SDPReCAP
{
int16 enabled;
int16 initialized;
int16 HallCode; //Òåêóùèé êîä ïîëîæåíèÿ ïî äàò÷èêàì Õîëëà
Uint32 Ts; // Ïåðèîä äëÿ ðàñ÷¸òà èíòåðïîëèðîâàííîãî óãëà
Uint32 Tspeed; // Ïåðèîä äëÿ ðàñ÷¸ò ñêîðîñòè
Uint32 TsNom; // Ïåðèîä, ñîîòâåòñâóþùèé íîìèíàëüíîé ñêîðîñòè
Uint32 TsNomMilsec; // Ïåðèîä, ñîîòâåòñâóþùèé íîìèíàëüíîé ñêîðîñòè ïðè òàêòèðîâàíèè 1 ìñ
Uint32 PrevTs; // Ïðåäûäóùàÿ âåëè÷èíà ïåðèîäà äëÿ ðàñ÷¸òà óãëà.
_iq speed; // Ðàñ÷èòàííàÿ ñêîðîñòü
_iq speedMIN; // Óñòàâêà ìèíèìàëüíîé ñêîðîñòè
_iq speedMinREF; // Ñêîðîñòü, ñîîòâåòñòâóþùàÿ óñòàâêå äëÿ îáíóëåíèÿ ñêîðîñòè
_iq Angle; // Ðàñ÷èòàííûé èíòåðïîëèðîâàííûé óãîë
_iq Angle6; // Ðàñ÷èòàííûé äåêîäèðîâàííûé óãîë
_iq AnglePrev; // Ðàñ÷èòàííûé äåêîäèðîâàííûé óãîë ïðåäûäóùèé
Uint32 cnt; // Ñ÷¸ò÷èê ÷èñëà ïðåðûâàíèé ñ ìîìåíòà ïóñêà (äàëüøå 2 íå ñ÷èòàåò).
Uint32 cnt2; // Ñ÷¸ò÷èê ïðåðûâàíèé ñìîìåíòà ðåâåðñà.
Uint32 milsec; // Âðåìÿ â ìñ ñ ìîìåíòà ïðèõîäà ïðîøëîé ìåòêè
Uint32 milsecFIX; // Ïåðåñòèòàííàÿ óñòàâêà äëÿ îáíóëåíèÿ ñêîðîñòè
Uint32 milsecREF; // Óñòàâêà äëÿ îáíóëåíèÿ ñêîðîñòè
Uint32 milsecPrevREF; // Ïðåäûäóùåå çíà÷åíèå óñòàâêè äëÿ îáíóëåíèÿ ñêîðîñòè
Uint32 PrevTspeed; // Ïðåäûäóùàÿ âåëè÷èíà ïåðèîäà äëÿ ðàñ÷¸òà ñêîðîñòè
Uint32 PrevTspeed1; // Ïðåäûäóùàÿ âåëè÷èíà ïåðèîäà äëÿ ðàñ÷¸òà ñêîðîñòè ïî äàò÷èêó À.
Uint32 PrevTspeed2; // Ïðåäûäóùàÿ âåëè÷èíà ïåðèîäà äëÿ ðàñ÷¸òà ñêîðîñòè ïî äàò÷èêó B.
Uint32 PrevTspeed3; // Ïðåäûäóùàÿ âåëè÷èíà ïåðèîäà äëÿ ðàñ÷¸òà ñêîðîñòè ïî äàò÷èêó C.
int16 CAPCalcEna1;
int16 CAPCalcEna2;
int16 CAPCalcEna3;
int16 CAP_WrongEdgeCnt;
int16 CAP_WrongEdgeCnt1;
int16 CAP_WrongEdgeCnt2;
int16 CAP_WrongEdgeCnt3;
int16 CAP_WrongEdgeCntPrev;
Uint16 WrongCodeCounter;
Uint16 WrongCodeCounterPerSec;
Uint16 WrongCodeCounterLimitPerSec;
int32 AngleOffset;
int16 ErrorLevel;
int16 ErrorLevelCounter;
int16 ErrorLevelTimeCounterBig;
int16 ErrorLevelTimeCounter;
int16 SensorFault;
Uint16 UserDirection;//ïîëüçîâàòåëüñêàÿ èíâåðñèÿ íàïðàâëåíèÿ
float SimulatorOmega2IQ_factor;
union SDPReCAP_FLG1 DPReCAP_FLG1;
void (*Init)(volatile struct SDPReCAP*);
void (*AngleCalc)(volatile struct SDPReCAP*);
void (*Angle6Calc)(volatile struct SDPReCAP*);
void (*AngleErrorCalc)(volatile struct SDPReCAP*);
void (*SpeedCalc)(volatile struct SDPReCAP*);
void (*CAP1Calc)(volatile struct SDPReCAP*);
void (*CAP2Calc)(volatile struct SDPReCAP*);
void (*CAP3Calc)(volatile struct SDPReCAP*);
void (*HelpCalc)(volatile struct SDPReCAP*);
void (*slow_calc)(volatile struct SDPReCAP*);
void (*ms_calc)(volatile struct SDPReCAP*);
void (*calc_10k)(volatile struct SDPReCAP*);
};
typedef volatile struct SDPReCAP TDPReCAP;
/******************************************************************************
Èíèöèàëèçàöèÿ ñòðóêòóðû ïî óìîë÷àíèþ
******************************************************************************/
#define DPRECAP_DEFAULTS {\
.Init = DPReCAP_Init, \
.AngleCalc = DPReCAP_AngleCalc, \
.Angle6Calc = DPReCAP_Angle6Calc, \
.AngleErrorCalc = DPReCAP_AngleErrorCalc, \
.SpeedCalc = DPReCAP_SpeedCalc, \
.CAP1Calc = DPReCAP_CAP1Calc, \
.CAP2Calc = DPReCAP_CAP2Calc, \
.CAP3Calc = DPReCAP_CAP3Calc, \
.HelpCalc = DPReCAP_HelpCalc, \
.slow_calc = DPReCAP_SlowCalc, \
.ms_calc = DPReCAP_msCalc, \
.calc_10k = DPReCAP_calc_10k\
}
/******************************************************************************
Ïðîöåäóðà èíèöèàëèçàöèè.
******************************************************************************/
void DPReCAP_Init(TDPReCAP*);
/******************************************************************************
Ïðîöåäóðà ðàñ÷¸òà óãëà.
******************************************************************************/
void DPReCAP_Angle6Calc(TDPReCAP*);
/******************************************************************************
Ïðîöåäóðà âû÷èñëåíèÿ ôàêòà îøèáî÷íîãî èçìåíåíèÿ óãëà.
******************************************************************************/
void DPReCAP_AngleErrorCalc(TDPReCAP*);
/******************************************************************************
Ïðîöåäóðà ðàñ÷¸òà èíòåðïîëèðîâàííîãî óãëà.
******************************************************************************/
void DPReCAP_AngleCalc(TDPReCAP*);
/******************************************************************************
Ïðîöåäóðà ðàñ÷¸òà ñêîðîñòè.
******************************************************************************/
void DPReCAP_SpeedCalc(TDPReCAP*);
/******************************************************************************
Ðàñ÷¸ò ïðåðûâàíèÿ 1
******************************************************************************/
void DPReCAP_CAP1Calc(TDPReCAP*);
/******************************************************************************
Ðàñ÷¸ò ïðåðûâàíèÿ 2
******************************************************************************/
void DPReCAP_CAP2Calc(TDPReCAP*);
/******************************************************************************
Ðàñ÷¸ò ïðåðûâàíèÿ 3
******************************************************************************/
void DPReCAP_CAP3Calc(TDPReCAP*);
/******************************************************************************
Âñïîìîãàòåëüíûå ðàñ÷¸ò, îáùèé äëÿ âñåõ ïðåðûâàíèé
******************************************************************************/
void DPReCAP_HelpCalc(TDPReCAP*);
/******************************************************************************
Âñïîìîãàòåëüíûå ðàñ÷¸ò â ôîíå
******************************************************************************/
void DPReCAP_SlowCalc(TDPReCAP*);
/******************************************************************************
Ìèëëèñåêóíäíûé ðàñ÷åò
******************************************************************************/
void DPReCAP_msCalc(TDPReCAP*);
void DPReCAP_calc_10k(TDPReCAP* p);
#ifdef __cplusplus
}
#endif // extern "C"
#endif // V_DPR_ECAP_H