a99491f9b8
- проект переведён на VectorIDE v1.3 В целях экономии памяти удалены: - модуль управления светодиодами - модуль ШИМ для двигателей SRD - модуль часов реального времени - режим привода для измерения задержки меджу сигналами ШИМ и измерениями токов Добавлены следующие модули: - проект переведён на VectorIDE v1.3 - модуль SPI для абсолютного ДПР - модуль управление реле для заряда ЗПТ - модуль дискретных вводов-выводов - модуль управления вентилятором Одноплатного Инвертора - модуль тормозного резистора Одноплатного Инвертора Прочие изменения: - оптимизирована инициализация регистров периферии - удалено множество неиспользуемых переменных - разрешение работы всех GPIO перенесено в функцию "PeripheralClockEnable" - добавлен счётчик индексной метки энкодера - исправлен сброс прерываний модуля захвата CAP - переработан режим задания постоянного тока статора - исправлены прочие мелкие ошибки в разных модулях
215 lines
8.0 KiB
C
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
|