Compare commits
30 Commits
51b862fbb7
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
13ac8950fc | ||
|
|
b5f1bb72d7 | ||
|
|
38eb087efc | ||
|
|
a413b954a8 | ||
|
|
d3c2b8a7b1 | ||
|
|
b47fe883ff | ||
|
|
87849674ab | ||
|
|
a2bc323649 | ||
|
|
1830087d6e | ||
|
|
eaa8079e99 | ||
|
|
53c1376fa0 | ||
|
|
0c06d07f4e | ||
|
|
14d0f6401c | ||
|
|
342380adf7 | ||
| 31e2a7368a | |||
| be7cfd1eeb | |||
|
|
be64bbf5d2 | ||
|
|
15774d179b | ||
|
|
7181f678f7 | ||
|
|
0cba8cda8a | ||
|
|
b0c9cb058c | ||
|
|
ae2887acfe | ||
| 3f33a4110b | |||
|
|
f77838e41e | ||
|
|
10e7859af7 | ||
|
|
24b6295935 | ||
|
|
a5704ae4be | ||
|
|
13825e068c | ||
|
|
7f6932631e | ||
|
|
8326ea8a8c |
115
README.md
115
README.md
@@ -1,2 +1,117 @@
|
||||
# Diod_Test
|
||||
|
||||
## Управление тестером
|
||||
Тест может запускаться по кнопке или по коилу №2 `StartTest`.
|
||||
Режим тестирования (прямое/обратное включение) выставляется в двух коилах:
|
||||
- 0: `ForwardTest` - тест диода в прямом включении (напряжение при прямом вкючении)
|
||||
- 1: `ReverseTest` - тест диода в обратном включении (скачок напряжения при обратном вкючении)
|
||||
Если включены оба, то будет тест скачка напряжения при переходе от прямого подлключения к обратному.
|
||||
|
||||
Можно переключать отдельные ключи по коилам №3-6:
|
||||
- 3: `KeyForwardHiTest` - включение и отключение ключа верхнего плеча фазы А (прямое включение)
|
||||
- 4: `KeyForwardLoTest` - включение и отключение ключа нижнего плеча фазы А (прямое включение)
|
||||
- 5: `KeyReverseHiTest` - включение и отключение ключа верхнего плеча фазы Б (обратное включение)
|
||||
- 6: `KeyReverseLoTest` - включение и отключение ключа нижнего плеча фазы Б (обратное включение)
|
||||
|
||||
Результаты измерений при разных включениях записываются в input регистры №0-1:
|
||||
- 0: `ForwardVoltage` - измеренное напряжение при прямом включении
|
||||
- 1: `ReversePeakVoltage` - максимальный скачок напряжения при обратном включении
|
||||
|
||||
## Настройка таймингов
|
||||
Тайминги выставляются в holding регистрах №0-4:
|
||||
- 0: `TimeForForward` - время на которое диод включается в прямом направлении (мс или мкс)
|
||||
- 1: `TimeForReverse` - время на которое диод включается в обратном направлении (мс или мкс)
|
||||
- 2: `TimeBeforeTest` - время которое выжидается перед началом тестирования (мс или мкс)
|
||||
- 3: `TimeDeadtime` - время между переключениями фаз (мс или мкс)
|
||||
- 4: `TimeBeforePeak` - время между включением АЦП и подключением обратного напряжения (мс или мкс)
|
||||
|
||||
В коилах №16-19, можно выставить флаги - включить миллисекундную задержку вместо микросекундной для соответствующего тайминга:
|
||||
- 16: `msTimeForForward_enable`
|
||||
- 17: `msTimeForReverse_enable`
|
||||
- 18: `msTimeBeforeTest_enable`
|
||||
- 19: `msTimeDeadtime_enable`
|
||||
- 20: `msTimeBeforePeak_enable`
|
||||
|
||||
## Настройка АЦП
|
||||
Настройки АЦП выставляются в holding регистрах №5-9:
|
||||
- 5: `Adc_PulseWidth` - ожидаемая длительность импульса в отчетах ацп.
|
||||
На основе этого параметра берется выборка по которой расчитывается среднее значение пик (пик +-Adc_PulseWidth/2)
|
||||
- 6: `Adc_PulseSign` - полярность скачка напряжения при обратном включении
|
||||
- 7: `Adc_CalibrValue` - калибровочное значение ацп
|
||||
- 8: `Adc_ZeroValue` - нулевое значение ацп
|
||||
- 9: `Adc_U_Calibr` - калибровочное напряжение ацп
|
||||
|
||||
Из этого рассчитывается шаг АЦП: `Adc_U_Calibr/(Adc_CalibrValue - Adc_ZeroValue)`
|
||||
|
||||
|
||||
# Тестирование
|
||||
## Тест в прямом подключении (`TESTER_TestDiode_Forward`)
|
||||
- ожидается задержка, перед началом работы `ticks_before_test`
|
||||
- включается АЦП в континуес режиме
|
||||
- диод подключается в прямом направлении на заданное время `ticks_for_forward`.
|
||||
- считывается АЦП и накапливаются заданное количество для расчета среднего. и так по кругу пока диод подключен
|
||||
- после таймаута отключается напряжение и останавливается АЦП
|
||||
|
||||
По итогу сохраняется напряжение прямого включения диода `htest->DiodeForwardVolt`.
|
||||
|
||||
## Тест в обратном подключении (`TESTER_TestDiode_Reverse`)
|
||||
- ожидается задержка, перед началом работы `ticks_before_test`
|
||||
- включается АЦП в дма режиме
|
||||
- ожидается задержка, перед предполагаемым скачком `ticks_before_peak`
|
||||
- диод подключается в обратном направлении на заданное время `ticks_for_reverse`, и отключается
|
||||
- после дожидается окончание заполнения буфера ДМА и обрабатывается: находится минимальный/максимальный пик и среднее напряжение в том районе
|
||||
|
||||
По итогу сохраняется скачок напряжение при обратном включении диода `htest->DiodeReversePeakVolt`.
|
||||
|
||||
## Тест перехода из прямого подключении в обратное (`TESTER_TestDiode_SwitchConnection`)
|
||||
- ожидается задержка, перед началом работы `ticks_before_test`
|
||||
- диод подключается в прямом направлении на заданное время `ticks_for_forward`
|
||||
- после истечения задержки сохраняется прямое напражение на диоде
|
||||
- диод отключается от питания и выжидается мертвое время `ticks_deadtime`
|
||||
- включается АЦП в дма режиме
|
||||
- ожидается задержка, перед предполагаемым скачком `ticks_before_peak`
|
||||
- диод подключается в обратном направлении на заданное время `ticks_for_reverse`
|
||||
- дожидается окончание заполнения буфера ДМА и обрабатывается: находится минимальный/максимальный пик и среднее напряжение в том районе
|
||||
|
||||
По итогу сохраняется напряжение прямого включения диода `htest->DiodeForwardVolt` и скачок при обратном `htest->DiodeReversePeakVolt`.
|
||||
|
||||
|
||||
|
||||
# Внутренняя настройка
|
||||
В начале программы в регистрах модбас выставляются дефолтные настройки из tester_config.h (`TESTER_Set_Default_Settings`)
|
||||
После эти настройки подтягиваются в структуры тестера, через отдельную функцию (`TESTER_UpdateSettings`). Она вызывается перед каждым тестом.
|
||||
## tester_config.h
|
||||
Содержит дефолтные настройки для таймингов (`TESTER_SW_TIMINGS_CONFIG`):
|
||||
- количество тиков и дефайн для включения миллисекундной разных задержек.
|
||||
|
||||
для светодиода и кнопки (`TESTER_INTERFACE_CONFIG`):
|
||||
- состояния пина для включения и выключения светодиода
|
||||
- порт и пин светодиода
|
||||
- частоты моргания для разных режимов работы
|
||||
- состояния пина при нажатой и отжатой кнопки
|
||||
- порт и пин кнопки
|
||||
- задержка для выжидания дребезга
|
||||
|
||||
для управления ключами (`TESTER_PHASE_SW_CONFIG`):
|
||||
- `USE_HAL_GPIO_FUNCTIONS` - использовать HAL_GPIO-функции. Без неё переключается быстрее
|
||||
- `RECONNECT_WITHOUT_DEADTIME` - отключить дедтайм при переключении. Если отключить еще и USE_HAL_GPIO_FUNCTIONS, то переключатся фазы будут почти синхронно (быстрее десятков мкс). Хз надо ли такое, но возможность есть
|
||||
- порт и пины для двух ключей обратного подключения диода (порт общий для двух ключей)
|
||||
- порт и пины для двух ключей обратного подключения диода (порт общий для двух ключей)
|
||||
|
||||
для АЦП (`TESTER_ADC_CONFIG`):
|
||||
- размер dma буффера (`ADC_BUFF_SIZE, ADC_DMA_BUFF_SIZE`)
|
||||
- калибровочное напряжение АЦП (`ADC_U_CALIBR`)
|
||||
- значение АЦП при калибровочном напряжении (`ADC_VALUE_CALIBR`)
|
||||
- значение АЦП при нулевом напряжении (`ADC_VALUE_ZERO`)
|
||||
- таймаут на чтение АЦП (`ADC_READ_TIMEOUT_MS`)
|
||||
- ожидаемая длина импульса в отсчетах АЦП (`TESTER_ADC_PULES_EXPETCED_WIDTH`)
|
||||
Из этого рассчитывается шаг АЦП: `Adc_U_Calibr/(Adc_CalibrValue - Adc_ZeroValue)`
|
||||
|
||||
## Структуры для настроек
|
||||
Настройки для таймингов записываются в структуру `SwTimings`, которая находится в `htest`/`hTestDiode (глобально)`, а она уже в главной структуре проекта `TESTER`.
|
||||
|
||||
Настройки светодиода и кнопки записываются в структуры `leds.LED1` и `SwStart`. Они находятся в структуре проекта `TESTER`
|
||||
|
||||
Настройки для портов и пинов ключей записываются в структуры `SwPhaseForward` и `SwPhaseReverse`, которые находится в `htest`/`hTestDiode (глобально)`, а она уже в главной структуре проекта `TESTER`.
|
||||
|
||||
Настройки для АЦП записыватся в структуру `TESTER.htest->adc->chAdc.s` (`ADC_ParamsTypeDef`).
|
||||
BIN
TERMINAL/TEST_DIOD.vi
Normal file
BIN
TERMINAL/TEST_DIOD.vi
Normal file
Binary file not shown.
3
TERMINAL/proj_term.aliases
Normal file
3
TERMINAL/proj_term.aliases
Normal file
@@ -0,0 +1,3 @@
|
||||
[My Computer]
|
||||
My Computer = "10.0.85.2"
|
||||
|
||||
3
TERMINAL/proj_term.lvlps
Normal file
3
TERMINAL/proj_term.lvlps
Normal file
@@ -0,0 +1,3 @@
|
||||
[ProjectWindow_Data]
|
||||
ProjectExplorer.ClassicPosition[String] = "193,1137,1207,2095"
|
||||
|
||||
23
TERMINAL/proj_term.lvproj
Normal file
23
TERMINAL/proj_term.lvproj
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<Project Type="Project" LVVersion="19008000">
|
||||
<Item Name="My Computer" Type="My Computer">
|
||||
<Property Name="server.app.propertiesEnabled" Type="Bool">true</Property>
|
||||
<Property Name="server.control.propertiesEnabled" Type="Bool">true</Property>
|
||||
<Property Name="server.tcp.enabled" Type="Bool">false</Property>
|
||||
<Property Name="server.tcp.port" Type="Int">0</Property>
|
||||
<Property Name="server.tcp.serviceName" Type="Str">My Computer/VI Server</Property>
|
||||
<Property Name="server.tcp.serviceName.default" Type="Str">My Computer/VI Server</Property>
|
||||
<Property Name="server.vi.callsEnabled" Type="Bool">true</Property>
|
||||
<Property Name="server.vi.propertiesEnabled" Type="Bool">true</Property>
|
||||
<Property Name="specify.custom.address" Type="Bool">false</Property>
|
||||
<Item Name="TEST_DIOD.vi" Type="VI" URL="../TEST_DIOD.vi"/>
|
||||
<Item Name="Dependencies" Type="Dependencies">
|
||||
<Item Name="vi.lib" Type="Folder">
|
||||
<Item Name="Error Cluster From Error Code.vi" Type="VI" URL="/<vilib>/Utility/error.llb/Error Cluster From Error Code.vi"/>
|
||||
<Item Name="MB Master.lvlib" Type="Library" URL="/<vilib>/Plasmionique/MB Master/MB Master.lvlib"/>
|
||||
<Item Name="MB_VISA_Lock.lvlib" Type="Library" URL="/<vilib>/Plasmionique/MB Master/MB_VISA_Lock/MB_VISA_Lock.lvlib"/>
|
||||
</Item>
|
||||
</Item>
|
||||
<Item Name="Build Specifications" Type="Build"/>
|
||||
</Item>
|
||||
</Project>
|
||||
@@ -57,6 +57,34 @@ void Error_Handler(void);
|
||||
/* USER CODE END EFP */
|
||||
|
||||
/* Private defines -----------------------------------------------------------*/
|
||||
#define PhaseAHiResponse_Pin GPIO_PIN_3
|
||||
#define PhaseAHiResponse_GPIO_Port GPIOA
|
||||
#define PhaseAHiResponse_EXTI_IRQn EXTI3_IRQn
|
||||
#define PhaseALoResponse_Pin GPIO_PIN_4
|
||||
#define PhaseALoResponse_GPIO_Port GPIOA
|
||||
#define PhaseALoResponse_EXTI_IRQn EXTI4_IRQn
|
||||
#define PhaseBHiResponse_Pin GPIO_PIN_5
|
||||
#define PhaseBHiResponse_GPIO_Port GPIOA
|
||||
#define PhaseBHiResponse_EXTI_IRQn EXTI9_5_IRQn
|
||||
#define PhaseBLoResponse_Pin GPIO_PIN_6
|
||||
#define PhaseBLoResponse_GPIO_Port GPIOA
|
||||
#define PhaseBLoResponse_EXTI_IRQn EXTI9_5_IRQn
|
||||
#define PhaseAHi_Pin GPIO_PIN_0
|
||||
#define PhaseAHi_GPIO_Port GPIOB
|
||||
#define PhaseALo_Pin GPIO_PIN_1
|
||||
#define PhaseALo_GPIO_Port GPIOB
|
||||
#define PhaseBHi_Pin GPIO_PIN_10
|
||||
#define PhaseBHi_GPIO_Port GPIOB
|
||||
#define PhaseBLo_Pin GPIO_PIN_11
|
||||
#define PhaseBLo_GPIO_Port GPIOB
|
||||
#define PhaseAHiSignal_Pin GPIO_PIN_12
|
||||
#define PhaseAHiSignal_GPIO_Port GPIOB
|
||||
#define PhaseALoSignal_Pin GPIO_PIN_13
|
||||
#define PhaseALoSignal_GPIO_Port GPIOB
|
||||
#define PhaseBHiSignal_Pin GPIO_PIN_14
|
||||
#define PhaseBHiSignal_GPIO_Port GPIOB
|
||||
#define PhaseBLoSignal_Pin GPIO_PIN_15
|
||||
#define PhaseBLoSignal_GPIO_Port GPIOB
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
|
||||
|
||||
@@ -55,7 +55,10 @@ void SVC_Handler(void);
|
||||
void DebugMon_Handler(void);
|
||||
void PendSV_Handler(void);
|
||||
void SysTick_Handler(void);
|
||||
void EXTI3_IRQHandler(void);
|
||||
void EXTI4_IRQHandler(void);
|
||||
void DMA1_Channel1_IRQHandler(void);
|
||||
void EXTI9_5_IRQHandler(void);
|
||||
void TIM2_IRQHandler(void);
|
||||
void TIM3_IRQHandler(void);
|
||||
void USART1_IRQHandler(void);
|
||||
|
||||
@@ -18,18 +18,26 @@
|
||||
@{
|
||||
*/
|
||||
|
||||
#define MODBUS_UART_NUMB 3 ///< Номер используемого UART, по нему выставляется дефайн USED_MB_UART = USARTx
|
||||
#define MODBUS_SPEED 115200 ///< Скорость UART для модбас
|
||||
#define MODBUS_GPIOX GPIOB ///< Порт для UART RX/TX
|
||||
#define MODBUS_GPIO_PIN_RX GPIO_PIN_11 ///< Пин для UART RX
|
||||
#define MODBUS_GPIO_PIN_TX GPIO_PIN_10 ///< Пин для UART TX
|
||||
#define MODBUS_VENDOR_NAME "NIO-12"
|
||||
#define MODBUS_PRODUCT_CODE "12345"
|
||||
#define MODBUS_REVISION "Ver. 1.0"
|
||||
#define MODBUS_VENDOR_URL "https://git.arktika.cyou/Andrey/Diod_Test"
|
||||
#define MODBUS_PRODUCT_NAME "Diode Tester"
|
||||
#define MODBUS_MODEL_NAME "STM32F103"
|
||||
#define MODBUS_USER_APPLICATION_NAME "diode_tester"
|
||||
|
||||
#define MODBUS_TIM_NUMB 7 ///< number of used tim, accord to this define sets define USED_MB_TIM = TIMx
|
||||
#define MODBUS_TIM_AHB_FREQ 72 ///< TIM AHB Bus Freq
|
||||
//#define MODBUS_UART_NUMB 1 ///< Номер используемого UART, по нему выставляется дефайн USED_MB_UART = USARTx
|
||||
#define MODBUS_SPEED 115200 ///< Скорость UART для модбас
|
||||
//#define MODBUS_GPIOX GPIOA ///< Порт для UART RX/TX
|
||||
//#define MODBUS_GPIO_PIN_RX GPIO_PIN_9 ///< Пин для UART RX
|
||||
//#define MODBUS_GPIO_PIN_TX GPIO_PIN_10 ///< Пин для UART TX
|
||||
|
||||
//#define MODBUS_TIM_NUMB 2 ///< number of used tim, accord to this define sets define USED_MB_TIM = TIMx
|
||||
//#define MODBUS_TIM_AHB_FREQ 72 ///< TIM AHB Bus Freq
|
||||
|
||||
// defines for modbus behaviour
|
||||
#define MODBUS_DEVICE_ID 1 ///< девайс текущего устройства
|
||||
#define MODBUS_MAX_TIMEOUT 5000 ///< максимальнйы тайтаут MB is ms
|
||||
//#define MODBUS_MAX_TIMEOUT 500 ///< максимальнйы тайтаут MB is ms
|
||||
|
||||
|
||||
#define RS_UART_Init MX_USART1_UART_Init
|
||||
@@ -38,79 +46,16 @@
|
||||
#define RS_TIM_DeInit HAL_TIM_Base_MspDeInit
|
||||
#define rs_huart huart1
|
||||
#define rs_htim htim2
|
||||
|
||||
|
||||
/**
|
||||
* @brief Поменять комманды 0x03 и 0x04 местами (для LabView терминалки от двигателей)
|
||||
* @details Терминалка от двигателей использует для чтения регистров комманду R_HOLD_REGS вместо R_IN_REGS
|
||||
* Поэтому чтобы считывать Input Regs - надо поменять их местами.
|
||||
*/
|
||||
//#define MODBUS_SWITCH_COMMAND_R_IN_REGS_AND_R_HOLD_REGS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////---CALC DEFINES---//////////////////////////
|
||||
|
||||
/* set USART_TypeDef for choosen numb of usart */
|
||||
#if (MODBUS_UART_NUMB == 1)
|
||||
#define USED_MODBUS_UART USART1
|
||||
#define USE_USART1
|
||||
#elif (MODBUS_UART_NUMB == 2)
|
||||
#define USED_MODBUS_UART USART2
|
||||
#define USE_USART2
|
||||
#elif (MODBUS_UART_NUMB == 3)
|
||||
#define USED_MODBUS_UART USART3
|
||||
#define USE_USART3
|
||||
#elif (MODBUS_UART_NUMB == 4)
|
||||
#define USED_MODBUS_UART UART4
|
||||
#define USE_UART4
|
||||
#elif (MODBUS_UART_NUMB == 5)
|
||||
#define USED_MODBUS_UART UART5
|
||||
#define USE_UART6
|
||||
#elif (MODBUS_UART_NUMB == 6)
|
||||
#define USED_MODBUS_UART USART6
|
||||
#define USE_USART6
|
||||
#endif
|
||||
|
||||
#if (MODBUS_TIM_NUMB == 1)
|
||||
#define USED_MODBUS_TIM TIM1
|
||||
#define USE_TIM1
|
||||
#elif (MODBUS_TIM_NUMB == 2)
|
||||
#define USED_MODBUS_TIM TIM2
|
||||
#define USE_TIM2
|
||||
#elif (MODBUS_TIM_NUMB == 3)
|
||||
#define USED_MODBUS_TIM TIM3
|
||||
#define USE_TIM3
|
||||
#elif (MODBUS_TIM_NUMB == 4)
|
||||
#define USED_MODBUS_TIM TIM4
|
||||
#define USE_TIM4
|
||||
#elif (MODBUS_TIM_NUMB == 5)
|
||||
#define USED_MODBUS_TIM TIM5
|
||||
#define USE_TIM5
|
||||
#elif (MODBUS_TIM_NUMB == 6)
|
||||
#define USED_MODBUS_TIM TIM6
|
||||
#define USE_TIM6
|
||||
#elif (MODBUS_TIM_NUMB == 7)
|
||||
#define USED_MODBUS_TIM TIM7
|
||||
#define USE_TIM7
|
||||
#elif (MODBUS_TIM_NUMB == 8)
|
||||
#define USED_MODBUS_TIM TIM8
|
||||
#define USE_TIM8
|
||||
#elif (MODBUS_TIM_NUMB == 9)
|
||||
#define USED_MODBUS_TIM TIM9
|
||||
#define USE_TIM9
|
||||
#elif (MODBUS_TIM_NUMB == 10)
|
||||
#define USED_MODBUS_TIM TIM10
|
||||
#define USE_TIM10
|
||||
#elif (MODBUS_TIM_NUMB == 11)
|
||||
#define USED_MODBUS_TIM TIM11
|
||||
#define USE_TIM11
|
||||
#elif (MODBUS_TIM_NUMB == 12)
|
||||
#define USED_MODBUS_TIM TIM12
|
||||
#define USE_TIM12
|
||||
#elif (MODBUS_TIM_NUMB == 13)
|
||||
#define USED_MODBUS_TIM TIM13
|
||||
#define USE_TIM13
|
||||
#elif (MODBUS_TIM_NUMB == 14)
|
||||
#define USED_MODBUS_TIM TIM14
|
||||
#define USE_TIM14
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/** MODBUS_CONFIG
|
||||
* @}
|
||||
*/
|
||||
|
||||
@@ -93,6 +93,7 @@ extern TIM_HandleTypeDef rs_htim;
|
||||
RS_HandleTypeDef hmodbus1;
|
||||
|
||||
/* DEFINE REGISTERS/COILS */
|
||||
MB_DeviceIdentificationTypeDef MB_INFO;
|
||||
MB_DataStructureTypeDef MB_DATA;
|
||||
RS_MsgTypeDef MODBUS_MSG;
|
||||
|
||||
@@ -109,6 +110,7 @@ uint32_t numb_scide = 10;
|
||||
*/
|
||||
void MODBUS_FirstInit(void)
|
||||
{
|
||||
MB_DevoceInentificationInit();
|
||||
//-----------SETUP MODBUS-------------
|
||||
// set up UART for modbus
|
||||
#ifdef INCLUDE_GENERAL_PERIPH_LIBS
|
||||
@@ -126,7 +128,6 @@ void MODBUS_FirstInit(void)
|
||||
#endif
|
||||
// set up modbus: MB_RX_Size_NotConst and Timeout enable
|
||||
hmodbus1.ID = MODBUS_DEVICE_ID;
|
||||
hmodbus1.sRS_Timeout = MODBUS_MAX_TIMEOUT;
|
||||
hmodbus1.sRS_Mode = SLAVE_ALWAYS_WAIT;
|
||||
hmodbus1.sRS_RX_Size_Mode = RS_RX_Size_NotConst;
|
||||
|
||||
@@ -262,13 +263,8 @@ MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, u
|
||||
|
||||
if(RegisterType == RegisterType_Holding)
|
||||
{
|
||||
// Устаки для напряжений ТЭ: предупреждения аварии
|
||||
if(MB_Check_Address_For_Arr(Addr, Qnt, R_SETPOINTS_ADDR, R_SETPOINTS_QNT) == NO_ERRORS)
|
||||
{
|
||||
*pRegs = MB_Set_Register_Ptr(&MB_DATA.HoldRegs, Addr); // начало регистров хранения/входных
|
||||
}
|
||||
// Устаки для настройки МЗКТЭ: запрет опроса и настройки общения (MODBUS/UART)
|
||||
else if(MB_Check_Address_For_Arr(Addr, Qnt, R_SETTINGS_ADDR, R_SETTINGS_QNT) == NO_ERRORS)
|
||||
// Устаки для тестера
|
||||
if(MB_Check_Address_For_Arr(Addr, Qnt, R_SETTINGS_ADDR, R_SETTINGS_QNT) == NO_ERRORS)
|
||||
{
|
||||
*pRegs = MB_Set_Register_Ptr(&MB_DATA.HoldRegs, Addr); // начало регистров хранения/входных
|
||||
}
|
||||
@@ -280,13 +276,8 @@ MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, u
|
||||
}
|
||||
else if(RegisterType == RegisterType_Input)
|
||||
{
|
||||
// Напряжения на ТЭ
|
||||
if(MB_Check_Address_For_Arr(Addr, Qnt, R_TE_VOLTAGE_ADDR, R_TE_VOLTAGE_QNT) == NO_ERRORS)
|
||||
{
|
||||
*pRegs = MB_Set_Register_Ptr(&MB_DATA.InRegs, Addr); // начало регистров хранения/входных
|
||||
}
|
||||
// Статус регистр МЗКТЭ
|
||||
else if(MB_Check_Address_For_Arr(Addr, Qnt, R_STATUS_REG_ADDR, R_STATUS_REG_QNT) == NO_ERRORS)
|
||||
// Измеренные параметры диода
|
||||
if(MB_Check_Address_For_Arr(Addr, Qnt, R_MEASURED_ADDR, R_MEASURED_QNT) == NO_ERRORS)
|
||||
{
|
||||
*pRegs = MB_Set_Register_Ptr(&MB_DATA.InRegs, Addr); // начало регистров хранения/входных
|
||||
}
|
||||
@@ -323,10 +314,14 @@ MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint
|
||||
return ILLEGAL_DATA_VALUE; // return exception code
|
||||
}
|
||||
|
||||
// peripheral control coils
|
||||
if(MB_Check_Address_For_Arr(Addr, Qnt, C_TE_EXCLUDE_ADDR, C_TE_EXCLUDE_QNT) == NO_ERRORS)
|
||||
// tester settings coils
|
||||
if(MB_Check_Address_For_Arr(Addr, Qnt, C_SETTINGS_ADDR, C_SETTINGS_QNT) == NO_ERRORS)
|
||||
{
|
||||
*pCoils = MB_Set_Coil_Reg_Ptr(&MB_DATA.Coils, Addr-C_TE_EXCLUDE_ADDR);
|
||||
*pCoils = MB_Set_Coil_Reg_Ptr(&MB_DATA.Coils, Addr);
|
||||
}// tester control coils
|
||||
else if(MB_Check_Address_For_Arr(Addr, Qnt, C_CONTROL_ADDR, C_CONTROL_QNT) == NO_ERRORS)
|
||||
{
|
||||
*pCoils = MB_Set_Coil_Reg_Ptr(&MB_DATA.Coils, Addr);
|
||||
}
|
||||
// if address doesnt match any array - return illegal data address response
|
||||
else
|
||||
@@ -596,6 +591,54 @@ uint8_t MB_Write_Miltuple_Regs(RS_MsgTypeDef *modbus_msg)
|
||||
return 1;
|
||||
}
|
||||
|
||||
void MB_WriteObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj)
|
||||
{
|
||||
mbdata[(*ind)++] = obj->length;
|
||||
for (int i = 0; i < obj->length; i++)
|
||||
{
|
||||
mbdata[(*ind)++] = obj->name[i];
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief Proccess command Read Device Identification (43/14 - 0x2B/0E).
|
||||
* @param modbus_msg - указатель на структуру собщения modbus.
|
||||
* @return fMessageHandled - статус о результате обработки комманды.
|
||||
* @details Обработка команды Write Single Register.
|
||||
*/
|
||||
uint8_t MB_Read_Device_Identification(RS_MsgTypeDef *modbus_msg)
|
||||
{
|
||||
char *mbdata = (char *)modbus_msg->DATA;
|
||||
unsigned ind = 0;
|
||||
switch(modbus_msg->DevId.ReadDevId)
|
||||
{
|
||||
case MB_BASIC_IDENTIFICATION:
|
||||
mbdata[ind++] = 0x00;
|
||||
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.VendorName);
|
||||
mbdata[ind++] = 0x01;
|
||||
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.ProductCode);
|
||||
mbdata[ind++] = 0x02;
|
||||
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.Revision);
|
||||
modbus_msg->DevId.NumbOfObj = 3;
|
||||
break;
|
||||
case MB_REGULAR_IDENTIFICATION:
|
||||
mbdata[ind++] = 0x03;
|
||||
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.VendorUrl);
|
||||
mbdata[ind++] = 0x04;
|
||||
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.ProductName);
|
||||
mbdata[ind++] = 0x05;
|
||||
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.ModelName);
|
||||
mbdata[ind++] = 0x06;
|
||||
MB_WriteObjectToMessage(mbdata, &ind, &MB_INFO.UserApplicationName);
|
||||
modbus_msg->DevId.NumbOfObj = 4;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
modbus_msg->ByteCnt = ind;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Respond accord to received message.
|
||||
@@ -668,6 +711,11 @@ RS_StatusTypeDef RS_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_ms
|
||||
}
|
||||
break;
|
||||
|
||||
case MB_R_DEVICE_INFO:
|
||||
hmodbus->f.MessageHandled = MB_Read_Device_Identification(hmodbus->pMessagePtr);
|
||||
break;
|
||||
|
||||
|
||||
/* unknown func code */
|
||||
default: modbus_msg->Except_Code = 0x01; /* set exception code: illegal function */
|
||||
}
|
||||
@@ -722,28 +770,60 @@ RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *mo
|
||||
|
||||
if (modbus_msg->Func_Code < ERR_VALUES_START) // if no error occur
|
||||
{
|
||||
// set size of received data
|
||||
if (modbus_msg->ByteCnt <= DATA_SIZE*2) // if ByteCnt less than DATA_SIZE
|
||||
modbus_uart_buff[ind++] = modbus_msg->ByteCnt;
|
||||
else // otherwise return data_size err
|
||||
// fill modbus header
|
||||
if(modbus_msg->Func_Code == MB_R_DEVICE_INFO) // devide identification header
|
||||
{
|
||||
TrackerCnt_Err(hmodbus->rs_err);
|
||||
return RS_COLLECT_MSG_ERR;
|
||||
modbus_uart_buff[ind++] = modbus_msg->DevId.MEI_Type;
|
||||
modbus_uart_buff[ind++] = modbus_msg->DevId.ReadDevId;
|
||||
modbus_uart_buff[ind++] = modbus_msg->DevId.Conformity;
|
||||
modbus_uart_buff[ind++] = modbus_msg->DevId.MoreFollows;
|
||||
modbus_uart_buff[ind++] = modbus_msg->DevId.NextObjId;
|
||||
modbus_uart_buff[ind++] = modbus_msg->DevId.NumbOfObj;
|
||||
|
||||
if (modbus_msg->ByteCnt > DATA_SIZE*2) // if ByteCnt less than DATA_SIZE
|
||||
{
|
||||
TrackerCnt_Err(hmodbus->rs_err);
|
||||
return RS_COLLECT_MSG_ERR;
|
||||
}
|
||||
|
||||
|
||||
//---------------DATA----------------
|
||||
//-----------[data bytes]------------
|
||||
uint8_t *tmp_data_addr = (uint8_t *)modbus_msg->DATA;
|
||||
for(int i = 0; i < modbus_msg->ByteCnt; i++) // filling buffer with data
|
||||
{ // set data
|
||||
modbus_uart_buff[ind++] = *tmp_data_addr;
|
||||
tmp_data_addr++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//---------------DATA----------------
|
||||
//-----------[data bytes]------------
|
||||
uint16_t *tmp_data_addr = (uint16_t *)modbus_msg->DATA;
|
||||
for(int i = 0; i < modbus_msg->ByteCnt; i++) // filling buffer with data
|
||||
{ // set data
|
||||
if (i%2 == 0) // HI byte
|
||||
modbus_uart_buff[ind++] = (*tmp_data_addr)>>8;
|
||||
else // LO byte
|
||||
{
|
||||
modbus_uart_buff[ind++] = *tmp_data_addr;
|
||||
tmp_data_addr++;
|
||||
}
|
||||
}
|
||||
else // modbus data header
|
||||
{
|
||||
// set size of received data
|
||||
if (modbus_msg->ByteCnt <= DATA_SIZE*2) // if ByteCnt less than DATA_SIZE
|
||||
modbus_uart_buff[ind++] = modbus_msg->ByteCnt;
|
||||
else // otherwise return data_size err
|
||||
{
|
||||
TrackerCnt_Err(hmodbus->rs_err);
|
||||
return RS_COLLECT_MSG_ERR;
|
||||
}
|
||||
|
||||
//---------------DATA----------------
|
||||
//-----------[data bytes]------------
|
||||
uint16_t *tmp_data_addr = (uint16_t *)modbus_msg->DATA;
|
||||
for(int i = 0; i < modbus_msg->ByteCnt; i++) // filling buffer with data
|
||||
{ // set data
|
||||
if (i%2 == 0) // HI byte
|
||||
modbus_uart_buff[ind++] = (*tmp_data_addr)>>8;
|
||||
else // LO byte
|
||||
{
|
||||
modbus_uart_buff[ind++] = *tmp_data_addr;
|
||||
tmp_data_addr++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
else // if some error occur
|
||||
{ // send expection code
|
||||
@@ -783,9 +863,17 @@ RS_StatusTypeDef RS_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modb
|
||||
if(modbus_msg->MbAddr != hmodbus->ID)
|
||||
return RS_SKIP;
|
||||
|
||||
// get dat or err response
|
||||
// get func code
|
||||
modbus_msg->Func_Code = modbus_uart_buff[ind++];
|
||||
|
||||
if(modbus_msg->Func_Code == MB_R_DEVICE_INFO) // if it device identification request
|
||||
{
|
||||
modbus_msg->DevId.MEI_Type = modbus_uart_buff[ind++];
|
||||
modbus_msg->DevId.ReadDevId = modbus_uart_buff[ind++];
|
||||
modbus_msg->DevId.NextObjId = modbus_uart_buff[ind++];
|
||||
modbus_msg->ByteCnt = 0;
|
||||
}
|
||||
else // if its classic modbus request
|
||||
{
|
||||
// get address from CMD
|
||||
modbus_msg->Addr = modbus_uart_buff[ind++] << 8;
|
||||
modbus_msg->Addr |= modbus_uart_buff[ind++];
|
||||
@@ -793,7 +881,7 @@ RS_StatusTypeDef RS_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modb
|
||||
// get address from CMD
|
||||
modbus_msg->Qnt = modbus_uart_buff[ind++] << 8;
|
||||
modbus_msg->Qnt |= modbus_uart_buff[ind++];
|
||||
|
||||
}
|
||||
if(hmodbus->f.RX_Half == 0) // if all message received
|
||||
{
|
||||
//---------------DATA----------------
|
||||
@@ -863,10 +951,12 @@ RS_StatusTypeDef RS_Define_Size_of_RX_Message(RS_HandleTypeDef *hmodbus, uint32_
|
||||
if(MB_RES == RS_SKIP) // if message not for us
|
||||
return MB_RES; // return
|
||||
|
||||
|
||||
if ((hmodbus->pMessagePtr->Func_Code & ~ERR_VALUES_START) < 0x0F)
|
||||
{
|
||||
hmodbus->pMessagePtr->ByteCnt = 0;
|
||||
*rx_data_size = 1;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -874,6 +964,13 @@ RS_StatusTypeDef RS_Define_Size_of_RX_Message(RS_HandleTypeDef *hmodbus, uint32_
|
||||
// +1 because that defines is size, not ind.
|
||||
*rx_data_size = hmodbus->pMessagePtr->ByteCnt + 2;
|
||||
}
|
||||
|
||||
|
||||
if(hmodbus->pMessagePtr->Func_Code == MB_R_DEVICE_INFO)
|
||||
{
|
||||
*rx_data_size = 0;
|
||||
}
|
||||
|
||||
hmodbus->RS_Message_Size = RX_FIRST_PART_SIZE + *rx_data_size; // size of whole message
|
||||
return RS_OK;
|
||||
}
|
||||
@@ -882,57 +979,25 @@ RS_StatusTypeDef RS_Define_Size_of_RX_Message(RS_HandleTypeDef *hmodbus, uint32_
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
//-------------------------HANDLERS FUNCTION-------------------------
|
||||
#if (MODBUS_UART_NUMB == 1) // choose handler for UART
|
||||
void USART1_IRQHandler(void)
|
||||
#elif (MODBUS_UART_NUMB == 2)
|
||||
void USART2_IRQHandler(void)
|
||||
#elif (MODBUS_UART_NUMB == 3)
|
||||
void USART3_IRQHandler(void)
|
||||
#elif (MODBUS_UART_NUMB == 4)
|
||||
void USART4_IRQHandler(void)
|
||||
#elif (MODBUS_UART_NUMB == 5)
|
||||
void USART5_IRQHandler(void)
|
||||
#elif (MODBUS_UART_NUMB == 6)
|
||||
void USART6_IRQHandler(void)
|
||||
#endif
|
||||
{
|
||||
Trace_MB_UART_Enter();
|
||||
RS_UART_Handler(&hmodbus1);
|
||||
Trace_MB_UART_Exit();
|
||||
}
|
||||
#if (MODBUS_TIM_NUMB == 1) || (MODBUS_TIM_NUMB == 10) // choose handler for TIM
|
||||
void TIM1_UP_TIM10_IRQHandler(void)
|
||||
#elif (MODBUS_TIM_NUMB == 2)
|
||||
void TIM2_IRQHandler(void)
|
||||
#elif (MODBUS_TIM_NUMB == 3)
|
||||
void TIM3_IRQHandler(void)
|
||||
#elif (MODBUS_TIM_NUMB == 4)
|
||||
void TIM4_IRQHandler(void)
|
||||
#elif (MODBUS_TIM_NUMB == 5)
|
||||
void TIM5_IRQHandler(void)
|
||||
#elif (MODBUS_TIM_NUMB == 6)
|
||||
void TIM6_DAC_IRQHandler(void)
|
||||
#elif (MODBUS_TIM_NUMB == 7)
|
||||
void TIM7_IRQHandler(void)
|
||||
#elif (MODBUS_TIM_NUMB == 8) || (MODBUS_TIM_NUMB == 13)
|
||||
void TIM8_UP_TIM13_IRQHandler(void)
|
||||
#elif (MODBUS_TIM_NUMB == 1) || (MODBUS_TIM_NUMB == 9)
|
||||
void TIM1_BRK_TIM9_IRQHandler(void)
|
||||
#elif (MODBUS_TIM_NUMB == 1) || (MODBUS_TIM_NUMB == 11)
|
||||
void TIM1_TRG_COM_TIM11_IRQHandler(void)
|
||||
#elif (MODBUS_TIM_NUMB == 8) || (MODBUS_TIM_NUMB == 12)
|
||||
void TIM8_BRK_TIM12_IRQHandler(void)
|
||||
#elif (MODBUS_TIM_NUMB == 8) || (MODBUS_TIM_NUMB == 14)
|
||||
void TIM8_TRG_COM_TIM14_IRQHandler(void)
|
||||
#endif
|
||||
{
|
||||
Trace_MB_TIM_Enter();
|
||||
RS_TIM_Handler(&hmodbus1);
|
||||
Trace_MB_TIM_Exit();
|
||||
void MB_DevoceInentificationInit(void)
|
||||
{
|
||||
MB_INFO.VendorName.name = MODBUS_VENDOR_NAME;
|
||||
MB_INFO.ProductCode.name = MODBUS_PRODUCT_CODE;
|
||||
MB_INFO.Revision.name = MODBUS_REVISION;
|
||||
MB_INFO.VendorUrl.name = MODBUS_VENDOR_URL;
|
||||
MB_INFO.ProductName.name = MODBUS_PRODUCT_NAME;
|
||||
MB_INFO.ModelName.name = MODBUS_MODEL_NAME;
|
||||
MB_INFO.UserApplicationName.name = MODBUS_USER_APPLICATION_NAME;
|
||||
|
||||
|
||||
MB_INFO.VendorName.length = sizeof(MODBUS_VENDOR_NAME);
|
||||
MB_INFO.ProductCode.length = sizeof(MODBUS_PRODUCT_CODE);
|
||||
MB_INFO.Revision.length = sizeof(MODBUS_REVISION);
|
||||
MB_INFO.VendorUrl.length = sizeof(MODBUS_VENDOR_URL);
|
||||
MB_INFO.ProductName.length = sizeof(MODBUS_PRODUCT_NAME);
|
||||
MB_INFO.ModelName.length = sizeof(MODBUS_MODEL_NAME);
|
||||
MB_INFO.UserApplicationName.length = sizeof(MODBUS_USER_APPLICATION_NAME);
|
||||
}
|
||||
|
||||
//-------------------------HANDLERS FUNCTION-------------------------
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
@@ -54,11 +54,11 @@ first receive info part of message, than defines size of rest message*/
|
||||
typedef enum //MB_ExceptionTypeDef
|
||||
{
|
||||
// reading
|
||||
NO_ERRORS = 0x00, ///< no errors
|
||||
ILLEGAL_FUNCTION = 0x01, ///< Принятый код функции не может быть обработан
|
||||
ILLEGAL_DATA_ADDRESS = 0x02, ///< Адрес данных, указанный в запросе, недоступен
|
||||
ILLEGAL_DATA_VALUE = 0x03, ///< Значение, содержащееся в поле данных запроса, является недопустимой величиной
|
||||
SLAVE_DEVICE_FAILURE = 0x04, ///< Невосстанавливаемая ошибка имела место, пока ведомое устройство пыталось выполнить затребованное действие
|
||||
NO_ERRORS = 0x00, ///< no errors
|
||||
ILLEGAL_FUNCTION = 0x01, ///< Принятый код функции не может быть обработан
|
||||
ILLEGAL_DATA_ADDRESS = 0x02, ///< Адрес данных, указанный в запросе, недоступен
|
||||
ILLEGAL_DATA_VALUE = 0x03, ///< Значение, содержащееся в поле данных запроса, является недопустимой величиной
|
||||
SLAVE_DEVICE_FAILURE = 0x04, ///< Невосстанавливаемая ошибка имела место, пока ведомое устройство пыталось выполнить затребованное действие
|
||||
// ACKNOWLEDGE = 0x05, ///< idk
|
||||
// SLAVE_DEVICE_BUSY = 0x06, ///< idk
|
||||
// MEMORY_PARITY_ERROR = 0x08, ///< idk
|
||||
@@ -70,41 +70,73 @@ typedef enum //MB_FunctonTypeDef
|
||||
{
|
||||
/* COMMANDS */
|
||||
// reading
|
||||
MB_R_COILS = 0x01, ///< Чтение битовых ячеек
|
||||
MB_R_DISC_IN = 0x02, ///< Чтение дискретных входов
|
||||
#ifndef TESTER_MODBUS_SWITCH_COMMAND_R_IN_REGS_AND_R_HOLD_REGS
|
||||
MB_R_HOLD_REGS = 0x03, ///< Чтение входных регистров
|
||||
MB_R_IN_REGS = 0x04, ///< Чтение регистров хранения
|
||||
MB_R_COILS = 0x01, ///< Чтение битовых ячеек
|
||||
MB_R_DISC_IN = 0x02, ///< Чтение дискретных входов
|
||||
#ifndef MODBUS_SWITCH_COMMAND_R_IN_REGS_AND_R_HOLD_REGS
|
||||
MB_R_HOLD_REGS = 0x03, ///< Чтение входных регистров
|
||||
MB_R_IN_REGS = 0x04, ///< Чтение регистров хранения
|
||||
#else
|
||||
MB_R_HOLD_REGS = 0x04, ///< Чтение входных регистров
|
||||
MB_R_IN_REGS = 0x03, ///< Чтение регистров хранения
|
||||
MB_R_HOLD_REGS = 0x04, ///< Чтение входных регистров
|
||||
MB_R_IN_REGS = 0x03, ///< Чтение регистров хранения
|
||||
#endif
|
||||
|
||||
// writting
|
||||
MB_W_COIL = 0x05, ///< Запись битовой ячейки
|
||||
MB_W_HOLD_REG = 0x06, ///< Запись одиночного регистра
|
||||
MB_W_COILS = 0x0F, ///< Запись нескольких битовых ячеек
|
||||
MB_W_HOLD_REGS = 0x10, ///< Запись нескольких регистров
|
||||
MB_W_COIL = 0x05, ///< Запись битовой ячейки
|
||||
MB_W_HOLD_REG = 0x06, ///< Запись одиночного регистра
|
||||
MB_W_COILS = 0x0F, ///< Запись нескольких битовых ячеек
|
||||
MB_W_HOLD_REGS = 0x10, ///< Запись нескольких регистров
|
||||
|
||||
MB_R_DEVICE_INFO = 0x2B, ///< Чтения информации об устройстве
|
||||
|
||||
/* ERRORS */
|
||||
// error reading
|
||||
MB_ERR_R_COILS = MB_R_COILS + ERR_VALUES_START, ///< Ошибка чтения битовых ячеек
|
||||
MB_ERR_R_DISC_IN = MB_R_DISC_IN + ERR_VALUES_START, ///< Ошибка чтения дискретных входов
|
||||
MB_ERR_R_IN_REGS = MB_R_IN_REGS + ERR_VALUES_START, ///< Ошибка чтения регистров хранения
|
||||
MB_ERR_R_HOLD_REGS = MB_R_HOLD_REGS + ERR_VALUES_START, ///< Ошибка чтения входных регистров
|
||||
MB_ERR_R_COILS = MB_R_COILS + ERR_VALUES_START, ///< Ошибка чтения битовых ячеек
|
||||
MB_ERR_R_DISC_IN = MB_R_DISC_IN + ERR_VALUES_START, ///< Ошибка чтения дискретных входов
|
||||
MB_ERR_R_IN_REGS = MB_R_IN_REGS + ERR_VALUES_START, ///< Ошибка чтения регистров хранения
|
||||
MB_ERR_R_HOLD_REGS = MB_R_HOLD_REGS + ERR_VALUES_START, ///< Ошибка чтения входных регистров
|
||||
|
||||
// error writting
|
||||
MB_ERR_W_COIL = MB_W_COIL + ERR_VALUES_START, ///< Ошибка записи битовой ячейки
|
||||
MB_ERR_W_HOLD_REG = MB_W_HOLD_REG + ERR_VALUES_START, ///< Ошибка записи одиночного регистра
|
||||
MB_ERR_W_COILS = MB_W_COILS + ERR_VALUES_START, ///< Ошибка записи нескольких битовых ячеек
|
||||
MB_ERR_W_HOLD_REGS = MB_W_HOLD_REGS + ERR_VALUES_START, ///< Ошибка записи нескольких регистров
|
||||
MB_ERR_W_COIL = MB_W_COIL + ERR_VALUES_START, ///< Ошибка записи битовой ячейки
|
||||
MB_ERR_W_HOLD_REG = MB_W_HOLD_REG + ERR_VALUES_START, ///< Ошибка записи одиночного регистра
|
||||
MB_ERR_W_COILS = MB_W_COILS + ERR_VALUES_START, ///< Ошибка записи нескольких битовых ячеек
|
||||
MB_ERR_W_HOLD_REGS = MB_W_HOLD_REGS + ERR_VALUES_START, ///< Ошибка записи нескольких регистров
|
||||
}MB_FunctonTypeDef;
|
||||
|
||||
/** @brief Structure for MEI func codes */
|
||||
typedef enum //MB_FunctonTypeDef
|
||||
{
|
||||
MEI_DEVICE_IDENTIFICATION = 0x0E,
|
||||
}MB_MEITypeDef;
|
||||
|
||||
/** @brief Structure for MEI func codes */
|
||||
typedef enum //MB_FunctonTypeDef
|
||||
{
|
||||
MB_BASIC_IDENTIFICATION = 0x01,
|
||||
MB_REGULAR_IDENTIFICATION = 0x02,
|
||||
|
||||
|
||||
/* ERRORS */
|
||||
MB_ERR_BASIC_IDENTIFICATION = MB_BASIC_IDENTIFICATION + ERR_VALUES_START,
|
||||
MB_ERR_REGULAR_IDENTIFICATION = MB_REGULAR_IDENTIFICATION + ERR_VALUES_START,
|
||||
}MB_ConformityTypeDef;
|
||||
|
||||
/** @brief Structure for decive identification message type */
|
||||
typedef struct
|
||||
{
|
||||
MB_MEITypeDef MEI_Type; ///< MEI Type assigned number for Device Identification Interface
|
||||
MB_ConformityTypeDef ReadDevId;
|
||||
MB_ConformityTypeDef Conformity;
|
||||
uint8_t MoreFollows; ///< in this library always a zero
|
||||
uint8_t NextObjId;
|
||||
uint8_t NumbOfObj;
|
||||
}MB_DevIdMsgTypeDef;
|
||||
|
||||
/** @brief Structure for modbus messsage */
|
||||
typedef struct // RS_MsgTypeDef
|
||||
{
|
||||
uint8_t MbAddr; ///< Modbus Slave Address
|
||||
MB_FunctonTypeDef Func_Code; ///< Modbus Function Code
|
||||
MB_DevIdMsgTypeDef DevId; ///< Read Device Identification Header struct
|
||||
uint16_t Addr; ///< Modbus Address of data
|
||||
uint16_t Qnt; ///< Quantity of modbus data
|
||||
uint8_t ByteCnt; ///< Quantity of bytes of data in message to transmit/receive
|
||||
|
||||
@@ -37,7 +37,8 @@
|
||||
*/
|
||||
typedef struct //MB_DataInRegsTypeDef
|
||||
{
|
||||
unsigned DUMMY;
|
||||
uint16_t ForwardVoltage;
|
||||
uint16_t ReversePeakVoltage;
|
||||
}MB_DataInRegsTypeDef;
|
||||
|
||||
|
||||
@@ -46,23 +47,27 @@ typedef struct //MB_DataInRegsTypeDef
|
||||
*/
|
||||
typedef struct //MB_DataInRegsTypeDef
|
||||
{
|
||||
unsigned DUMMY;
|
||||
uint16_t TimeForForward;
|
||||
uint16_t TimeForReverse;
|
||||
uint16_t TimeBeforeTest;
|
||||
uint16_t TimeDeadtime;
|
||||
uint16_t TimeBeforePeak;
|
||||
|
||||
uint16_t Adc_PulseWidth;
|
||||
uint16_t Adc_PulseSign;
|
||||
uint16_t Adc_CalibrValue;
|
||||
uint16_t Adc_ZeroValue;
|
||||
uint16_t Adc_U_Calibr;
|
||||
}MB_DataHoldRegsTypeDef;
|
||||
|
||||
|
||||
// DEFINES FOR INPUT REGISTERS ARRAYS
|
||||
#define R_TE_VOLTAGE_ADDR 0
|
||||
#define R_TE_VOLTAGE_QNT 85
|
||||
|
||||
#define R_STATUS_REG_ADDR 85
|
||||
#define R_STATUS_REG_QNT 1
|
||||
#define R_MEASURED_ADDR 0
|
||||
#define R_MEASURED_QNT 2
|
||||
|
||||
// DEFINES FOR HOLDING REGISTERS ARRAYS
|
||||
#define R_SETPOINTS_ADDR 0
|
||||
#define R_SETPOINTS_QNT 170
|
||||
|
||||
#define R_SETTINGS_ADDR 170
|
||||
#define R_SETTINGS_QNT 5
|
||||
#define R_SETTINGS_ADDR 0
|
||||
#define R_SETTINGS_QNT 10
|
||||
|
||||
|
||||
// DEFINES FOR REGISTERS LOCAL ADDRESSES
|
||||
@@ -95,12 +100,32 @@ typedef struct //MB_DataInRegsTypeDef
|
||||
*/
|
||||
typedef struct //MB_DataCoilsTypeDef
|
||||
{
|
||||
unsigned DUMMY;
|
||||
/* reg 1 - control */
|
||||
unsigned ForwardTest:1;
|
||||
unsigned ReverseTest:1;
|
||||
unsigned StartTest:1;
|
||||
unsigned KeyForwardHiTest:1;
|
||||
unsigned KeyForwardLoTest:1;
|
||||
unsigned KeyReverseHiTest:1;
|
||||
unsigned KeyReverseLoTest:1;
|
||||
|
||||
unsigned reserved:9;
|
||||
|
||||
/* reg 2 - settings */
|
||||
unsigned msTimeForForward_enable:1;
|
||||
unsigned msTimeForReverse_enable:1;
|
||||
unsigned msTimeBeforeTest_enable:1;
|
||||
unsigned msTimeDeadtime_enable:1;
|
||||
unsigned msTimeBeforePeak_enable:1;
|
||||
unsigned reserved2:11;
|
||||
}MB_DataCoilsTypeDef;
|
||||
|
||||
// DEFINES FOR COIL ARRAYS
|
||||
#define C_TE_EXCLUDE_ADDR 0
|
||||
#define C_TE_EXCLUDE_QNT 85
|
||||
#define C_CONTROL_ADDR 0
|
||||
#define C_CONTROL_QNT 7
|
||||
|
||||
#define C_SETTINGS_ADDR 16
|
||||
#define C_SETTINGS_QNT 5
|
||||
|
||||
/** MODBUS_DATA_COILS_DEFINES
|
||||
* @}
|
||||
@@ -124,40 +149,25 @@ typedef struct // tester modbus data
|
||||
extern MB_DataStructureTypeDef MB_DATA;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned length;
|
||||
char *name;
|
||||
}MB_DeviceObjectTypeDef;
|
||||
typedef struct
|
||||
{
|
||||
MB_DeviceObjectTypeDef VendorName;
|
||||
MB_DeviceObjectTypeDef ProductCode;
|
||||
MB_DeviceObjectTypeDef Revision;
|
||||
MB_DeviceObjectTypeDef VendorUrl;
|
||||
MB_DeviceObjectTypeDef ProductName;
|
||||
MB_DeviceObjectTypeDef ModelName;
|
||||
MB_DeviceObjectTypeDef UserApplicationName;
|
||||
}MB_DeviceIdentificationTypeDef;
|
||||
void MB_DevoceInentificationInit(void);
|
||||
|
||||
|
||||
#endif //_MODBUS_DATA_H_
|
||||
|
||||
/////////////////////////////////////////////////////////////
|
||||
///////////////////////TEMP/OUTDATE/OTHER////////////////////
|
||||
|
||||
//typedef enum //MB_TESTERCommandsTypeDef
|
||||
//{
|
||||
// StandartMode = 0x00, ///< Стандартная работа
|
||||
// Opros_TE_Disable = 0x01, ///< Запрет опроса ТЭ (активен только обмен с ЛСУ ЭС, ТЭ не контролируются)
|
||||
//}MB_TESTERCommandsTypeDef;
|
||||
|
||||
///**
|
||||
// * @brief Состояние МЗКТЭ
|
||||
// */
|
||||
//typedef enum //MB_TESTERErrStatusTypeDef
|
||||
//{
|
||||
// TESTER_OK = 0x0, ///< МЗКТЭ функционирует нормально. Идет опрос ТЭ.
|
||||
// NonCritical_Err = 0x1, ///< Неисправность МЗКТЭ, при которой МЗКТЭ может выполнять свои основные функции (некоторые программные ошибки из @ref MB_TESTERTrackerTypeDef).
|
||||
// Critical_Err = 0x2, ///< Неисправность МЗКТЭ, при которой выполнение основных функций не представляется возможным (ошибки 1-3 и некоторые программные ошибки из @ref MB_TESTERTrackerTypeDef)
|
||||
//
|
||||
//}MB_TESTERErrStatusTypeDef;
|
||||
//typedef enum
|
||||
//{
|
||||
// TE_No_Err = 0x0, ///< Напряжения на всех ТЭ выше аварийных порогов, задаваемых уставками «Авария»
|
||||
// TE_Err = 0x1, ///< Напряжение на одном или нескольких ТЭ достигло или ниже аварийного порога, задаваемого уставкой «Авария»
|
||||
//}MB_TEErrActiveTypeDef;
|
||||
//typedef enum
|
||||
//{
|
||||
// TE_No_Warn = 0x0, ///< Напряжения на всех ТЭ выше предупредительных порогов, задаваемых уставкой «Предупреждение»
|
||||
// TE_Warn = 0x1, ///< Напряжение на одном или нескольких ТЭ достигло или ниже предупредительного порога, задаваемого уставкой «Предупреждение»
|
||||
//}MB_TEWarnActiveTypeDef;
|
||||
//typedef enum
|
||||
//{
|
||||
// OprosTE_Enable = 0x0, ///< Опрос ТЭ разрешен
|
||||
// OprosTE_Disable = 0x1, ///< Опрос ТЭ запрещен (см. регистр хранения 170)
|
||||
//}MB_OprosTETypeDef;
|
||||
///////////////////////TEMP/OUTDATE/OTHER////////////////////
|
||||
@@ -186,7 +186,7 @@ RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huart, TIM_H
|
||||
UART_Base_Init(suart);
|
||||
hRS->huart = &suart->huart;
|
||||
#else
|
||||
RS_UART_Init();
|
||||
// RS_UART_Init();
|
||||
hRS->huart = huart;
|
||||
#endif
|
||||
|
||||
@@ -206,7 +206,7 @@ RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huart, TIM_H
|
||||
hRS->htim = &stim->htim;
|
||||
}
|
||||
#else
|
||||
RS_TIM_Init();
|
||||
// RS_TIM_Init();
|
||||
hRS->htim = htim;
|
||||
#endif
|
||||
|
||||
@@ -250,8 +250,6 @@ HAL_StatusTypeDef RS_ReInit_UART(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huar
|
||||
UART_MspDeInit(&suart->huart);
|
||||
|
||||
RS_RES = UART_Base_Init(suart);
|
||||
|
||||
RS_RES = RS_UART_Init()
|
||||
|
||||
#else
|
||||
// // check is settings are valid
|
||||
@@ -390,18 +388,38 @@ RS_StatusTypeDef RS_UART_RxCpltCallback(RS_HandleTypeDef *hRS)
|
||||
{ // First receive part of message, then define size of rest of message, and start receive it
|
||||
hRS->f.RX_Half = 1;
|
||||
//---------------FIND DATA SIZE-----------------
|
||||
uint32_t NuRS_of_Rest_Bytes = 0;
|
||||
uint32_t NuRS_of_Rest_Bytes = 0xFFFF;
|
||||
RS_RES = RS_Define_Size_of_RX_Message(hRS, &NuRS_of_Rest_Bytes);
|
||||
|
||||
|
||||
// if there is no bytes to receive OR we need to skip this message - restart receive
|
||||
if ((NuRS_of_Rest_Bytes == 0) || (RS_RES == RS_SKIP))
|
||||
// if we need to skip this message - restart receive
|
||||
if(RS_RES == RS_SKIP || NuRS_of_Rest_Bytes == 0xFFFF)
|
||||
{
|
||||
TrackerCnt_Err(hRS->rs_err);
|
||||
RS_Abort(hRS, ABORT_RX);
|
||||
RS_RES = RS_Handle_Receive_Start(hRS, hRS->pMessagePtr);
|
||||
return RS_RES;
|
||||
}
|
||||
|
||||
// if there is no bytes to receive
|
||||
if(NuRS_of_Rest_Bytes == 0)
|
||||
{
|
||||
hRS->f.RX_Half = 0;
|
||||
|
||||
//---------PROCESS DATA & ENDING RECEIVING--------
|
||||
RS_Set_RX_End(hRS);
|
||||
|
||||
if(hRS->sRS_Timeout) // if timeout setted
|
||||
HAL_TIM_Base_Stop_IT(hRS->htim); // stop timeout
|
||||
|
||||
// parse received data
|
||||
RS_RES = RS_Parse_Message(hRS, hRS->pMessagePtr, hRS->pBufferPtr); // parse message
|
||||
|
||||
// RESPONSE
|
||||
RS_RES = RS_Response(hRS, hRS->pMessagePtr);
|
||||
return RS_RES;
|
||||
}
|
||||
|
||||
|
||||
//-------------START UART RECEIVE---------------
|
||||
uart_res = HAL_UART_Receive_IT(hRS->huart, (hRS->pBufferPtr + RX_FIRST_PART_SIZE), NuRS_of_Rest_Bytes);
|
||||
|
||||
128
diode_tester/Core/MyLibs/general_gpio.c
Normal file
128
diode_tester/Core/MyLibs/general_gpio.c
Normal file
@@ -0,0 +1,128 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file general_gpio.c
|
||||
* @brief Модуль для инициализации портов.
|
||||
**************************************************************************
|
||||
@verbatim
|
||||
//-------------------Функции-------------------//
|
||||
Functions: users
|
||||
- GPIO_Clock_Enable Инициализация тактирования порта
|
||||
@endverbatim
|
||||
***************************************************************************/
|
||||
#include "general_gpio.h"
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
//------------------------GPIO INIT FUNCTIONS------------------------
|
||||
|
||||
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx)
|
||||
{
|
||||
HAL_StatusTypeDef status = HAL_OK;
|
||||
// choose port for enable clock
|
||||
if (GPIOx==GPIOA)
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
else if (GPIOx==GPIOB)
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
else if (GPIOx==GPIOC)
|
||||
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||
#ifdef GPIOD
|
||||
else if (GPIOx==GPIOD)
|
||||
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||
#endif
|
||||
#ifdef GPIOE
|
||||
else if (GPIOx==GPIOE)
|
||||
__HAL_RCC_GPIOE_CLK_ENABLE();
|
||||
#endif
|
||||
else
|
||||
status = HAL_ERROR;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
//------------------------GPIO INIT FUNCTIONS------------------------
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
//------------------------GPIO LED FUNCTIONS-------------------------
|
||||
|
||||
/**
|
||||
* @brief Включить светодиод
|
||||
*/
|
||||
void GPIO_LED_On(GPIO_LEDTypeDef *led)
|
||||
{
|
||||
led->state = LED_IS_ON;
|
||||
HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, LED_ON);
|
||||
}
|
||||
/**
|
||||
* @brief Выключить светодиод
|
||||
*/
|
||||
void GPIO_LED_Off(GPIO_LEDTypeDef *led)
|
||||
{
|
||||
led->state = LED_IS_OFF;
|
||||
HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, LED_OFF);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Активировать моргание светодиодом
|
||||
*/
|
||||
void GPIO_LED_Blink_Start(GPIO_LEDTypeDef *led, uint32_t period)
|
||||
{
|
||||
led->state = LED_IS_BLINKING;
|
||||
led->LED_Period = period;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Моргание светодиодом
|
||||
*/
|
||||
void GPIO_LED_Blink_Handle(GPIO_LEDTypeDef *led)
|
||||
{
|
||||
if(led->state == LED_IS_BLINKING)
|
||||
{
|
||||
uint32_t tickcurrent = HAL_GetTick();
|
||||
if((tickcurrent - led->tickprev) > led->LED_Period)
|
||||
{
|
||||
HAL_GPIO_TogglePin(led->LED_Port, led->LED_Pin);
|
||||
led->tickprev = tickcurrent;
|
||||
}
|
||||
}
|
||||
}
|
||||
//------------------------GPIO LED FUNCTIONS-------------------------
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
//------------------------GPIO SW FUNCTIONS-------------------------
|
||||
|
||||
/**
|
||||
* @brief Считать состоянии кнопки запуска
|
||||
*/
|
||||
uint8_t GPIO_Read_Swich(GPIO_SwitchTypeDef *sw)
|
||||
{
|
||||
|
||||
if(HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == SW_ON)
|
||||
{
|
||||
sw->Sw_PrevState = 1;
|
||||
|
||||
if(sw->tickprev == 0)
|
||||
sw->tickprev = HAL_GetTick();
|
||||
|
||||
if((HAL_GetTick() - sw->tickprev) > sw->Sw_FilterDelay)
|
||||
{
|
||||
if(HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == SW_ON)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
sw->tickprev = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sw->Sw_PrevState = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
//------------------------GPIO SW FUNCTIONS-------------------------
|
||||
//-------------------------------------------------------------------
|
||||
72
diode_tester/Core/MyLibs/general_gpio.h
Normal file
72
diode_tester/Core/MyLibs/general_gpio.h
Normal file
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file general_gpio.h
|
||||
* @brief Заголовочный файл для модуля инициализации портов.
|
||||
*************************************************************************/
|
||||
#ifndef __GPIO_GENERAL_H_
|
||||
#define __GPIO_GENERAL_H_
|
||||
|
||||
#include "mylibs_defs.h"
|
||||
|
||||
|
||||
#define SPI_Alternate_Mapping(INSTANCE) ((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \
|
||||
(((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \
|
||||
(((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \
|
||||
(((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \
|
||||
(0))
|
||||
|
||||
|
||||
#define TIM_Alternate_Mapping(INSTANCE) ((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \
|
||||
(((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \
|
||||
(((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \
|
||||
(((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \
|
||||
(0))
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LED_IS_OFF = 0,
|
||||
LED_IS_ON = 1,
|
||||
LED_IS_BLINKING = 2,
|
||||
LED_IS_FADING = 3,
|
||||
}GPIO_LEDStateTypeDef;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GPIO_LEDStateTypeDef state;
|
||||
|
||||
GPIO_TypeDef *LED_Port;
|
||||
uint32_t LED_Pin;
|
||||
|
||||
uint32_t LED_Period;
|
||||
uint32_t tickprev;
|
||||
}GPIO_LEDTypeDef;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GPIO_TypeDef *Sw_Port;
|
||||
uint32_t Sw_Pin;
|
||||
|
||||
uint32_t Sw_PrevState;
|
||||
uint32_t Sw_FilterDelay;
|
||||
uint32_t tickprev;
|
||||
}GPIO_SwitchTypeDef;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
||||
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx);
|
||||
|
||||
/* Считать состоянии кнопки запуска */
|
||||
uint8_t GPIO_Read_Swich(GPIO_SwitchTypeDef *swstart);
|
||||
/* Включить светодиод */
|
||||
void GPIO_LED_On(GPIO_LEDTypeDef *led);
|
||||
/* Выключить светодиод */
|
||||
void GPIO_LED_Off(GPIO_LEDTypeDef *led);
|
||||
/* Активировать моргание светодиодом */
|
||||
void GPIO_LED_Blink_Start(GPIO_LEDTypeDef *led, uint32_t period);
|
||||
/* Моргание светодиодом */
|
||||
void GPIO_LED_Blink_Handle(GPIO_LEDTypeDef *led);
|
||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
||||
|
||||
|
||||
#endif // __GPIO_GENERAL_H_
|
||||
@@ -56,7 +56,7 @@ extern void Error_Handler(void);
|
||||
#ifdef FREERTOS_DELAY
|
||||
#define msDelay(_ms_) osDelay(_ms_)
|
||||
#else
|
||||
#define msDelay(_ms_) HAL_Delay(_ms_)
|
||||
#define msDelay(_ms_) if(_ms_ != 0) HAL_Delay(_ms_-1)
|
||||
#endif
|
||||
|
||||
/** DELAYS_DEFINES
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
|
||||
#include "main.h"
|
||||
#include "modbus_data.h"
|
||||
#include "general_gpio.h"
|
||||
|
||||
/** @brief Struct for trackers for Measure */
|
||||
/** @brief Struct for trackers for RS */
|
||||
|
||||
@@ -98,7 +98,7 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
|
||||
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
|
||||
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
|
||||
hdma_adc1.Init.Mode = DMA_CIRCULAR;
|
||||
hdma_adc1.Init.Mode = DMA_NORMAL;
|
||||
hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
|
||||
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
|
||||
{
|
||||
|
||||
@@ -48,10 +48,15 @@ void MX_GPIO_Init(void)
|
||||
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(GPIOB, PhaseAHi_Pin|PhaseALo_Pin|PhaseBHi_Pin|PhaseBLo_Pin
|
||||
|PhaseAHiSignal_Pin|PhaseALoSignal_Pin|PhaseBHiSignal_Pin|PhaseBLoSignal_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin : PC13 */
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_13;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
@@ -59,6 +64,37 @@ void MX_GPIO_Init(void)
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : PC14 */
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_14;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : PAPin PAPin PAPin PAPin */
|
||||
GPIO_InitStruct.Pin = PhaseAHiResponse_Pin|PhaseALoResponse_Pin|PhaseBHiResponse_Pin|PhaseBLoResponse_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : PBPin PBPin PBPin PBPin
|
||||
PBPin PBPin PBPin PBPin */
|
||||
GPIO_InitStruct.Pin = PhaseAHi_Pin|PhaseALo_Pin|PhaseBHi_Pin|PhaseBLo_Pin
|
||||
|PhaseAHiSignal_Pin|PhaseALoSignal_Pin|PhaseBHiSignal_Pin|PhaseBLoSignal_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/* EXTI interrupt init*/
|
||||
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
|
||||
|
||||
HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
|
||||
|
||||
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
|
||||
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
#include "rs_message.h"
|
||||
#include "tester_adc_func.h"
|
||||
#include "tester_main.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
@@ -103,23 +103,17 @@ int main(void)
|
||||
/* USER CODE BEGIN 2 */
|
||||
// HAL_ADC_Start_DMA(&hadc1, (uint32_t *)buff, ADC_BUFF_SIZE);
|
||||
// HAL_TIM_Base_Start_IT(&htim3);
|
||||
TESTER_ADC_StructInit(&tester_adc);
|
||||
TESTER_Init(&TESTER);
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Infinite loop */
|
||||
/* USER CODE BEGIN WHILE */
|
||||
TESTER_pre_while(&TESTER);
|
||||
while (1)
|
||||
{
|
||||
if(delay_en)
|
||||
msDelay(delay);
|
||||
// HAL_UART_Transmit(&huart1, (uint8_t *)"axaxa", 5, 100);
|
||||
TESTER_main_delay(&TESTER);
|
||||
TESTER_main_while(&TESTER);
|
||||
|
||||
ADC_DMA_StartRead(&tester_adc);
|
||||
for(int i = 0; i < before_pulse_delay; i++);
|
||||
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 1);
|
||||
for(int i = 0; i < pulse_delay; i++);
|
||||
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0);
|
||||
ADC_DMA_ReadWhileDMA(&tester_adc, 1000);
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
/* USER CODE BEGIN 3 */
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#include "stm32f1xx_it.h"
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
#include "tester_adc_func.h"
|
||||
#include "tester_main.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
@@ -188,7 +188,7 @@ void PendSV_Handler(void)
|
||||
void SysTick_Handler(void)
|
||||
{
|
||||
/* USER CODE BEGIN SysTick_IRQn 0 */
|
||||
|
||||
TESTER_InterfaceHandle(&TESTER);
|
||||
/* USER CODE END SysTick_IRQn 0 */
|
||||
HAL_IncTick();
|
||||
/* USER CODE BEGIN SysTick_IRQn 1 */
|
||||
@@ -203,6 +203,42 @@ void SysTick_Handler(void)
|
||||
/* please refer to the startup file (startup_stm32f1xx.s). */
|
||||
/******************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief This function handles EXTI line3 interrupt.
|
||||
*/
|
||||
void EXTI3_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN EXTI3_IRQn 0 */
|
||||
__disable_irq();
|
||||
|
||||
HAL_GPIO_TogglePin(PhaseAHiSignal_GPIO_Port, PhaseAHiSignal_Pin);
|
||||
|
||||
__enable_irq();
|
||||
/* USER CODE END EXTI3_IRQn 0 */
|
||||
HAL_GPIO_EXTI_IRQHandler(PhaseAHiResponse_Pin);
|
||||
/* USER CODE BEGIN EXTI3_IRQn 1 */
|
||||
|
||||
/* USER CODE END EXTI3_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles EXTI line4 interrupt.
|
||||
*/
|
||||
void EXTI4_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN EXTI4_IRQn 0 */
|
||||
__disable_irq();
|
||||
|
||||
HAL_GPIO_TogglePin(PhaseALoSignal_GPIO_Port, PhaseALoSignal_Pin);
|
||||
|
||||
__enable_irq();
|
||||
/* USER CODE END EXTI4_IRQn 0 */
|
||||
HAL_GPIO_EXTI_IRQHandler(PhaseALoResponse_Pin);
|
||||
/* USER CODE BEGIN EXTI4_IRQn 1 */
|
||||
|
||||
/* USER CODE END EXTI4_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA1 channel1 global interrupt.
|
||||
*/
|
||||
@@ -217,13 +253,38 @@ void DMA1_Channel1_IRQHandler(void)
|
||||
/* USER CODE END DMA1_Channel1_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles EXTI line[9:5] interrupts.
|
||||
*/
|
||||
void EXTI9_5_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN EXTI9_5_IRQn 0 */
|
||||
__disable_irq();
|
||||
|
||||
if (__HAL_GPIO_EXTI_GET_IT(PhaseBHiResponse_Pin) != 0x00u)
|
||||
HAL_GPIO_TogglePin(PhaseBHiSignal_GPIO_Port, PhaseBHiSignal_Pin);
|
||||
if (__HAL_GPIO_EXTI_GET_IT(PhaseBLoResponse_Pin) != 0x00u)
|
||||
HAL_GPIO_TogglePin(PhaseBLoSignal_GPIO_Port, PhaseBLoSignal_Pin);
|
||||
|
||||
__enable_irq();
|
||||
/* USER CODE END EXTI9_5_IRQn 0 */
|
||||
HAL_GPIO_EXTI_IRQHandler(PhaseBHiResponse_Pin);
|
||||
HAL_GPIO_EXTI_IRQHandler(PhaseBLoResponse_Pin);
|
||||
/* USER CODE BEGIN EXTI9_5_IRQn 1 */
|
||||
|
||||
/* USER CODE END EXTI9_5_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles TIM2 global interrupt.
|
||||
*/
|
||||
void TIM2_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN TIM2_IRQn 0 */
|
||||
|
||||
Trace_MB_TIM_Enter();
|
||||
RS_TIM_Handler(&hmodbus1);
|
||||
Trace_MB_TIM_Exit();
|
||||
return;
|
||||
/* USER CODE END TIM2_IRQn 0 */
|
||||
HAL_TIM_IRQHandler(&htim2);
|
||||
/* USER CODE BEGIN TIM2_IRQn 1 */
|
||||
@@ -237,7 +298,7 @@ void TIM2_IRQHandler(void)
|
||||
void TIM3_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN TIM3_IRQn 0 */
|
||||
HAL_NVIC_ClearPendingIRQ(TIM3_IRQn);
|
||||
|
||||
/* USER CODE END TIM3_IRQn 0 */
|
||||
HAL_TIM_IRQHandler(&htim3);
|
||||
/* USER CODE BEGIN TIM3_IRQn 1 */
|
||||
@@ -251,7 +312,10 @@ void TIM3_IRQHandler(void)
|
||||
void USART1_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN USART1_IRQn 0 */
|
||||
|
||||
Trace_MB_UART_Enter();
|
||||
RS_UART_Handler(&hmodbus1);
|
||||
Trace_MB_UART_Exit();
|
||||
return;
|
||||
/* USER CODE END USART1_IRQn 0 */
|
||||
HAL_UART_IRQHandler(&huart1);
|
||||
/* USER CODE BEGIN USART1_IRQn 1 */
|
||||
|
||||
@@ -82,9 +82,9 @@ void MX_TIM3_Init(void)
|
||||
|
||||
/* USER CODE END TIM3_Init 1 */
|
||||
htim3.Instance = TIM3;
|
||||
htim3.Init.Prescaler = 0;
|
||||
htim3.Init.Prescaler = 72-1;
|
||||
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
htim3.Init.Period = 8999;
|
||||
htim3.Init.Period = 65535;
|
||||
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
|
||||
|
||||
@@ -77,26 +77,24 @@ void TESTER_ADC_StructInit(TESTER_ADCTypeDef *adc)
|
||||
{
|
||||
ClearStruct(*adc);
|
||||
adc->hadc = &hadc1;
|
||||
adc->chAdc.pulse_width = 4;
|
||||
adc->filter.array_size = FOSTER_STUDENT_N;
|
||||
adc->chAdc.ChMask = ADC_MEASURE_CHANNEL_0;
|
||||
|
||||
#ifdef FOSTER_STUDENT_USER_T_CRITICAL
|
||||
adc->filter.t_critical = FOSTER_STUDENT_USER_T_CRITICAL;
|
||||
#else
|
||||
adc->filter.precise_table_ind = 2;
|
||||
#endif
|
||||
// adc->DMA_HalfBuff = ADC_DMA_HalfBuff;
|
||||
// adc->DMA_Buff = ADC_DMA_Buff;
|
||||
}
|
||||
|
||||
void TESTER_ADC_UpdateSettings(TESTER_ADCTypeDef *adc, MB_DataStructureTypeDef *mbdata)
|
||||
{
|
||||
adc->chAdc.s.ADC_calibr = mbdata->HoldRegs.Adc_CalibrValue;
|
||||
adc->chAdc.s.ADC_zero = mbdata->HoldRegs.Adc_ZeroValue;
|
||||
adc->chAdc.s.expected_pulse_sign = mbdata->HoldRegs.Adc_PulseSign;
|
||||
adc->chAdc.s.pulse_width = mbdata->HoldRegs.Adc_PulseWidth;
|
||||
|
||||
adc->chAdc.s.U_step = ((float)mbdata->HoldRegs.Adc_U_Calibr/1000)/(adc->chAdc.s.ADC_calibr - adc->chAdc.s.ADC_zero);
|
||||
}
|
||||
|
||||
HAL_StatusTypeDef ADC_DMA_StartRead(TESTER_ADCTypeDef *adc)
|
||||
{
|
||||
HAL_StatusTypeDef res;
|
||||
|
||||
/* Очистка буферов каналов */
|
||||
ClearStruct(adc->chAdc.ADC_Buff);
|
||||
if(adc->f.adc_running)
|
||||
return HAL_BUSY;
|
||||
|
||||
/* Очистка флага какая половина DMA уже готова */
|
||||
adc->f.dmaBufferHalfDone = 0; // никакая, данные DMA пока не готовы в принципе
|
||||
@@ -146,7 +144,7 @@ void ADC_DMA_Fuel_Cell_Reset(TESTER_ADCChannelTypeDef *adc_fc)
|
||||
adc_fc->ADC_Filtered = 0;
|
||||
adc_fc->ADC_Max = 0;
|
||||
adc_fc->ADC_Min = 0;
|
||||
adc_fc->max_value_ind = 0;
|
||||
adc_fc->pulse_peak_ind = 0;
|
||||
adc_fc->state = 0;
|
||||
}
|
||||
|
||||
@@ -162,96 +160,8 @@ void ADC_DMA_Channels_Prepare(TESTER_ADCChannelTypeDef *adc_fuel_cells, uint8_t
|
||||
}
|
||||
}
|
||||
|
||||
//uint8_t FosterStudent(TESTER_ADCChannelTypeDef *adc_fc, TESTER_ADCFilterTypeDef *Filter, uint32_t ind)
|
||||
//{
|
||||
//#ifndef FOSTER_STUDENT_USER_T_CRITICAL
|
||||
// uint32_t t_critical[] = FOSTER_STUDENT_T_CRITICALS;
|
||||
//#endif //FOSTER_STUDENT_USER_T_CRITICAL
|
||||
// uint8_t res = 0;
|
||||
//
|
||||
// uint8_t m = 0;
|
||||
// uint8_t l = 0;
|
||||
//
|
||||
// uint16_t max = adc_fc->ADC_Buff[ind];
|
||||
// uint16_t min = adc_fc->ADC_Buff[ind];
|
||||
//
|
||||
// int16_t d_sum = 0;
|
||||
// uint32_t t;
|
||||
//
|
||||
// uint16_t arr_size;
|
||||
// if(ind < Filter->array_size)
|
||||
// return 0xFF;
|
||||
//
|
||||
// for(int i = ind; i > ind - Filter->array_size; i--)
|
||||
// {
|
||||
//
|
||||
// if(adc_fc->ADC_Buff[i] > max)
|
||||
// {
|
||||
// max = adc_fc->ADC_Buff[i];
|
||||
// m = 1;
|
||||
// }
|
||||
// else
|
||||
// m = 0;
|
||||
// if(adc_fc->ADC_Buff[i] < min)
|
||||
// {
|
||||
// min = adc_fc->ADC_Buff[i];
|
||||
// l = 1;
|
||||
// }
|
||||
// else
|
||||
// l = 0;
|
||||
// d_sum += (m-l);
|
||||
// }
|
||||
//
|
||||
//#define fixed_base 1000
|
||||
// if(d_sum < 0)
|
||||
// d_sum = -d_sum;
|
||||
// t = d_sum*fixed_base*fixed_base/FOSTER_STUDENT_MSE;
|
||||
//
|
||||
// Filter->t_current = t;
|
||||
//#ifndef FOSTER_STUDENT_USER_T_CRITICAL
|
||||
// Filter->t_critical = t_critical[Filter->precise_table_ind];
|
||||
//#endif //FOSTER_STUDENT_USER_T_CRITICAL
|
||||
//
|
||||
//
|
||||
// if(Filter->t_current > Filter->t_critical)
|
||||
// {
|
||||
// res = 1;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// res = 0;
|
||||
// }
|
||||
//
|
||||
//
|
||||
//
|
||||
// return res;
|
||||
//}
|
||||
|
||||
|
||||
void ADC_DMA_WaitForStableVoltage(TESTER_ADCChannelTypeDef *adc_fc, TESTER_ADCFilterTypeDef *Filter, uint32_t ind)
|
||||
{
|
||||
// if(FosterStudent(adc_fc, Filter, ind) == 0)
|
||||
// {
|
||||
// /* Сохраняем индекс еще стабильного напряжения */
|
||||
// adc_fc->stable_start_ind = ind - Filter->array_size/2;
|
||||
// /* Переключение на стабильное напряжение найдено */
|
||||
// adc_fc->state = WAIT_FOR_DROP;
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
void ADC_DMA_WaitForDropVoltage(TESTER_ADCChannelTypeDef *adc_fc, TESTER_ADCFilterTypeDef *Filter, uint32_t ind)
|
||||
{
|
||||
// if(FosterStudent(adc_fc, Filter, ind) == 1)
|
||||
// {
|
||||
// /* Сохраняем индекс еще стабильного напряжения */
|
||||
// adc_fc->stable_end_ind = ind-Filter->array_size/2;
|
||||
// /* Переключение на стабильное напряжение найдено */
|
||||
// adc_fc->state = STABLE_FOUND;
|
||||
// }
|
||||
}
|
||||
|
||||
void ADC_DMA_CalcStabilized(TESTER_ADCChannelTypeDef *adc_fc)
|
||||
void ADC_DMA_ProcessBufferForPeak(TESTER_ADCChannelTypeDef *adc_fc)
|
||||
{
|
||||
uint16_t tmp_val = 0;
|
||||
uint32_t val_sum = 0;
|
||||
@@ -267,80 +177,45 @@ void ADC_DMA_CalcStabilized(TESTER_ADCChannelTypeDef *adc_fc)
|
||||
if(tmp_val > adc_fc->ADC_Max)
|
||||
{
|
||||
adc_fc->ADC_Max = tmp_val;
|
||||
adc_fc->max_value_ind = i;
|
||||
|
||||
if(adc_fc->s.expected_pulse_sign == 0)
|
||||
adc_fc->pulse_peak_ind = i;
|
||||
}
|
||||
|
||||
/* Обновление минимального значения */
|
||||
if(tmp_val < adc_fc->ADC_Min)
|
||||
{
|
||||
adc_fc->ADC_Min = tmp_val;
|
||||
adc_fc->pulse_peak_ind = i;
|
||||
|
||||
if(adc_fc->s.expected_pulse_sign == 1)
|
||||
adc_fc->pulse_peak_ind = i;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Расчет среднего значения в пике */
|
||||
for(int i = (adc_fc->max_value_ind - adc_fc->pulse_width)/2; i < (adc_fc->max_value_ind + adc_fc->pulse_width/2); i++)
|
||||
for(int i = (adc_fc->pulse_peak_ind - adc_fc->s.pulse_width/2); i < (adc_fc->pulse_peak_ind + adc_fc->s.pulse_width/2); i++)
|
||||
{
|
||||
tmp_val = adc_fc->ADC_Buff[i];
|
||||
/* Накопление значений для расчета среднего */
|
||||
val_sum += tmp_val;
|
||||
}
|
||||
adc_fc->ADC_Filtered = val_sum/(adc_fc->pulse_width);
|
||||
adc_fc->ADC_Filtered = val_sum/(adc_fc->s.pulse_width);
|
||||
|
||||
}
|
||||
|
||||
void ADC_DMA_ProcessSingleBuffer(TESTER_ADCChannelTypeDef *adc_fc)
|
||||
{
|
||||
adc_fc->U_Current = adc_fc->s.U_step*adc_fc->ADC_Filtered;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void ADC_DMA_ProcessBuffer(TESTER_ADCTypeDef *adc)
|
||||
{
|
||||
ADC_DMA_ProcessSingleBuffer(&adc->chAdc);
|
||||
}
|
||||
|
||||
void ADC_DMA_BufferHandler(TESTER_ADCChannelTypeDef *adc_fc, TESTER_ADCFilterTypeDef *Filter, uint32_t ind)
|
||||
{
|
||||
// switch(adc_fc->state)
|
||||
// {
|
||||
// /* Канал не проверяется */
|
||||
// case NOT_CHECKING:
|
||||
// break;
|
||||
//
|
||||
// /* Пока на каналах не зарядится кондер */
|
||||
// case WAIT_FOR_STABLE:
|
||||
//// ADC_DMA_WaitForStableVoltage(adc_fc, Filter, ind);
|
||||
// break;
|
||||
//
|
||||
// /* Проверка пока на первом канале не начнет разряжаться кондер */
|
||||
// case WAIT_FOR_DROP:
|
||||
//// ADC_DMA_WaitForDropVoltage(adc_fc, Filter, ind);
|
||||
// break;
|
||||
//
|
||||
// /* Стабильное напряжение найдено */
|
||||
// case STABLE_FOUND:
|
||||
// /* Стабильное напряжение НЕ найдено */
|
||||
// case STABLE_NOT_FOUND:
|
||||
// /* Конец стабильного напряжения НЕ найден */
|
||||
// case DROP_NOT_FOUND:
|
||||
// break;
|
||||
//
|
||||
//
|
||||
// /* Если состояние неопределенное */
|
||||
// default:
|
||||
// adc_fc->state = NOT_CHECKING;
|
||||
// break;
|
||||
//
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Считывать АЦП до тех пор, пока буфер DMA не заполнится и не будет обработан
|
||||
* @brief Считать буфер DMA и найти в нем пик (скачок напряжения)
|
||||
* @details Основа функции взята из МЗКТЭ. Здесь немного неоптимизированная:
|
||||
* в while(1) просто ждеться когда DMA не будет заполнен,
|
||||
* потом можно будет сделать какую-то обработку пока он заполняется, чтобы не простаивать.
|
||||
*/
|
||||
HAL_StatusTypeDef ADC_DMA_ReadWhileDMA(TESTER_ADCTypeDef *adc, uint32_t Timeout)
|
||||
HAL_StatusTypeDef ADC_DMA_ReadForPeak(TESTER_ADCTypeDef *adc, uint32_t Timeout)
|
||||
{
|
||||
uint32_t tickstart = HAL_GetTick();
|
||||
|
||||
@@ -365,7 +240,7 @@ HAL_StatusTypeDef ADC_DMA_ReadWhileDMA(TESTER_ADCTypeDef *adc, uint32_t Timeout)
|
||||
uint16_t filter_halfend = ADC_BUFF_SIZE/2;
|
||||
uint16_t filter_end = ADC_BUFF_SIZE;
|
||||
uint8_t run_adc_check = 0;
|
||||
uint8_t expected_dmaBufferHalf = 1;
|
||||
uint8_t expected_dmaBufferHalf = 2;
|
||||
|
||||
/* Обработка АЦП */
|
||||
while(1)
|
||||
@@ -398,12 +273,12 @@ HAL_StatusTypeDef ADC_DMA_ReadWhileDMA(TESTER_ADCTypeDef *adc, uint32_t Timeout)
|
||||
if(run_adc_check)
|
||||
{
|
||||
/* Вызов обработчиков буфера DMA для каждого канала, если он выбран */
|
||||
ADC_DMA_BufferHandler(&adc->chAdc, &adc->filter, adc_buff_ind);
|
||||
// ADC_DMA_BufferHandler(&adc->chAdc, &adc->filter, adc_buff_ind);
|
||||
|
||||
|
||||
|
||||
/* Переход на следующие во времени значения каналов АЦП */
|
||||
adc_buff_ind++;
|
||||
// adc_buff_ind++;
|
||||
/* если это первая половина DMA буфера */
|
||||
if(expected_dmaBufferHalf == 1)
|
||||
{
|
||||
@@ -428,15 +303,15 @@ HAL_StatusTypeDef ADC_DMA_ReadWhileDMA(TESTER_ADCTypeDef *adc, uint32_t Timeout)
|
||||
printf_adc_processing(": wait for processing complete...");
|
||||
}
|
||||
|
||||
if(adc_buff_ind > filter_end) // Проверка первой половины закончена
|
||||
{
|
||||
// if(adc_buff_ind > filter_end) // Проверка первой половины закончена
|
||||
// {
|
||||
adc_buff_ind = 0; // Выставляем индекс на первую половину
|
||||
run_adc_check = 0; // Сбрасываем флаг проверки каналов
|
||||
expected_dmaBufferHalf = 1; // Устанавливаем ожидание готовности первой половины данных DMA буфера
|
||||
|
||||
printf_adc_processing("\n%d: ADC Processing DMA complete", uwTick);
|
||||
break;
|
||||
}
|
||||
// }
|
||||
}
|
||||
/* если это "никакая" половина DMA буфера */
|
||||
else
|
||||
@@ -451,7 +326,36 @@ HAL_StatusTypeDef ADC_DMA_ReadWhileDMA(TESTER_ADCTypeDef *adc, uint32_t Timeout)
|
||||
}
|
||||
}
|
||||
|
||||
ADC_DMA_CalcStabilized(&adc->chAdc);
|
||||
ADC_DMA_ProcessBufferForPeak(&adc->chAdc);
|
||||
|
||||
return HAL_OK;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Считывать АЦП, который работает в континуес режиме
|
||||
*/
|
||||
HAL_StatusTypeDef ADC_ReadContinuous(TESTER_ADCTypeDef *adc, uint32_t buff_size, uint32_t tickstart, uint32_t timeout)
|
||||
{
|
||||
HAL_StatusTypeDef res = HAL_OK;
|
||||
uint16_t val_sum = 0;
|
||||
if(buff_size == 0)
|
||||
return HAL_ERROR;
|
||||
int i = 0;
|
||||
for(i = 0; i < buff_size; i++)
|
||||
{
|
||||
if(HAL_GetTick() - tickstart > timeout)
|
||||
{
|
||||
res = HAL_TIMEOUT;
|
||||
return res;
|
||||
}
|
||||
|
||||
HAL_ADC_PollForConversion(adc->hadc, 1);
|
||||
adc->chAdc.ADC_Buff[i] = HAL_ADC_GetValue(adc->hadc);
|
||||
val_sum += adc->chAdc.ADC_Buff[i];
|
||||
}
|
||||
|
||||
adc->chAdc.ADC_Filtered = val_sum/(i);
|
||||
adc->chAdc.U_Current = adc->chAdc.s.U_step*adc->chAdc.ADC_Filtered;
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -13,40 +13,6 @@
|
||||
|
||||
#include "mylibs_include.h"
|
||||
|
||||
#define ADC_MEASURE_CHANNEL_0_Pos 0x00
|
||||
#define ADC_MEASURE_CHANNEL_1_Pos 0x01
|
||||
#define ADC_MEASURE_CHANNEL_2_Pos 0x02
|
||||
#define ADC_MEASURE_CHANNEL_3_Pos 0x03
|
||||
|
||||
#define ADC_MEASURE_CHANNEL_0 (0x01 << ADC_MEASURE_CHANNEL_0_Pos)
|
||||
#define ADC_MEASURE_CHANNEL_1 (0x01 << ADC_MEASURE_CHANNEL_1_Pos)
|
||||
#define ADC_MEASURE_CHANNEL_2 (0x01 << ADC_MEASURE_CHANNEL_2_Pos)
|
||||
#define ADC_MEASURE_CHANNEL_3 (0x01 << ADC_MEASURE_CHANNEL_3_Pos)
|
||||
#define ADC_CH_IGNORE NULL // должно быть NULL!!!
|
||||
|
||||
#define Measure_Get_Channel(_chPtr_) (_chPtr_)->Tadc->chAdc
|
||||
#define Measure_Get_Voltage(_chPtr_) ((_chPtr_)->Tadc->chAdc->U_Current)
|
||||
#define Measure_Get_Zero(_chPtr_) ((_chPtr_)->Tadc->chAdc->refADC_zero)
|
||||
#define Measure_Get_Calibr(_chPtr_) ((_chPtr_)->Tadc->chAdc->refADC_calibr)
|
||||
#define Measure_Get_VoltStep(_chPtr_) ((_chPtr_)->Tadc->chAdc->refU_step)
|
||||
#define Measure_Get_Filtered(_chPtr_) ((_chPtr_)->Tadc->chAdc->ADC_Filtered)
|
||||
|
||||
#define Measure_Calc_CalibrDiff(_chPtr_) abs((int)Measure_Get_Calibr(_chPtr_) - Measure_Get_Zero(_chPtr_))
|
||||
#define Measure_Calc_FilterDiff(_chPtr_) abs((int)Measure_Get_Filtered(_chPtr_) - Measure_Get_Zero(_chPtr_))
|
||||
#define Measure_Calc_Voltage(_chPtr_) ((float)Measure_Calc_FilterDiff(_chPtr_)*Measure_Get_VoltStep(_chPtr_))
|
||||
|
||||
//#define ADC_GetChannel(_AdcChPtr_) (_AdcChPtr_)->Tadc->chAdc
|
||||
////#define Measure_Get_Voltage(_AdcChPtr_) ((_AdcChPtr_)->Tadc->chAdc->U_Current)
|
||||
////#define Measure_Get_Zero(_AdcChPtr_) ((_AdcChPtr_)->Tadc->chAdc->refADC_zero)
|
||||
////#define Measure_Get_Calibr(_AdcChPtr_) ((_AdcChPtr_)->Tadc->chAdc->refADC_calibr)
|
||||
////#define Measure_Get_VoltStep(_AdcChPtr_) ((_AdcChPtr_)->Tadc->chAdc->refU_step)
|
||||
////#define Measure_Get_Filtered(_AdcChPtr_) ((_AdcChPtr_)->Tadc->chAdc->ADC_Filtered)
|
||||
|
||||
//#define Channel_Calc_Diff(_AdcChPtr_, _value_) ((int)(_value_) - (_AdcChPtr_)->refADC_zero)
|
||||
//#define Channel_Calc_CalibrValue(_AdcChPtr_) (abs(Channel_Calc_Diff((_AdcChPtr_), (_AdcChPtr_)->refADC_calibr)) )
|
||||
//#define Channel_Calc_AdcValue(_AdcChPtr_) (abs(Channel_Calc_Diff((_AdcChPtr_), (_AdcChPtr_)->ADC_Filtered)) )
|
||||
//#define Channel_Calc_Voltage(_AdcChPtr_) ((float)Channel_Calc_AdcValue(_AdcChPtr_)*(_AdcChPtr_)->refU_step)
|
||||
|
||||
typedef uint16_t ADC_BuffTypeDef[ADC_BUFF_SIZE];
|
||||
|
||||
typedef enum
|
||||
@@ -59,54 +25,42 @@ typedef enum
|
||||
ADC_DONE = 5,
|
||||
}ADC_ChannelState;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t ADC_zero;
|
||||
uint16_t ADC_calibr;
|
||||
float U_step;
|
||||
unsigned pulse_width;
|
||||
unsigned expected_pulse_sign;
|
||||
}ADC_ParamsTypeDef;
|
||||
typedef struct
|
||||
{
|
||||
ADC_BuffTypeDef ADC_Buff;
|
||||
uint16_t ADC_Filtered;
|
||||
float U_Current;
|
||||
|
||||
|
||||
|
||||
|
||||
/* Parameter for calc voltage */
|
||||
uint16_t refADC_zero;
|
||||
uint16_t refADC_calibr;
|
||||
float refU_step;
|
||||
uint16_t ADC_Filtered;
|
||||
ADC_BuffTypeDef ADC_Buff;
|
||||
|
||||
uint16_t ADC_Max;
|
||||
uint16_t ADC_Min;
|
||||
|
||||
unsigned pulse_width;
|
||||
unsigned max_value_ind;
|
||||
unsigned pulse_peak_ind;
|
||||
|
||||
|
||||
/* Parameter for calc voltage */
|
||||
ADC_ParamsTypeDef s;
|
||||
|
||||
|
||||
|
||||
uint8_t ChMask;
|
||||
ADC_ChannelState state;
|
||||
|
||||
ADCChannel_TrackerTypeDef adc_ch_err;
|
||||
}TESTER_ADCChannelTypeDef;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int32_t t_current;
|
||||
int32_t t_critical;
|
||||
|
||||
#ifdef FOSTER_STUDENT_USER_T_CRITICAL
|
||||
#else
|
||||
uint8_t precise_table_ind;
|
||||
#endif
|
||||
uint16_t array_size;
|
||||
|
||||
}TESTER_ADCFilterTypeDef;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
TESTER_ADCChannelTypeDef chAdc;
|
||||
|
||||
ADC_HandleTypeDef *hadc;
|
||||
|
||||
TESTER_ADCFilterTypeDef filter;
|
||||
// TESTER_ADCFilterTypeDef filter;
|
||||
|
||||
struct
|
||||
{
|
||||
@@ -126,13 +80,16 @@ extern uint16_t ADC_DMA_HalfBuff[ADC_DMA_BUFF_SIZE/2];
|
||||
|
||||
void TESTER_ADC_StructInit(TESTER_ADCTypeDef *adc);
|
||||
|
||||
void TESTER_ADC_UpdateSettings(TESTER_ADCTypeDef *adc, MB_DataStructureTypeDef *mbdata);
|
||||
void ADC_DMA_Handler(TESTER_ADCTypeDef *adc);
|
||||
|
||||
void ADC_DMA_ProcessBuffer(TESTER_ADCTypeDef *adc);
|
||||
void ADC_DMA_ProcessBufferForPeak(TESTER_ADCChannelTypeDef *adc_fc);
|
||||
void ADC_DMA_Channels_Prepare(TESTER_ADCChannelTypeDef *adc_fuel_cells, uint8_t MaskForChannels, uint8_t state);
|
||||
HAL_StatusTypeDef ADC_DMA_StartRead(TESTER_ADCTypeDef *adc);
|
||||
HAL_StatusTypeDef ADC_DMA_ReadWhileDMA(TESTER_ADCTypeDef *adc, uint32_t Timeout);
|
||||
|
||||
/* Считать буфер DMA и найти в нем пик (скачок напряжения) */
|
||||
HAL_StatusTypeDef ADC_DMA_ReadForPeak(TESTER_ADCTypeDef *adc, uint32_t Timeout);
|
||||
/* Считывать АЦП, который работает в континуес режиме */
|
||||
HAL_StatusTypeDef ADC_ReadContinuous(TESTER_ADCTypeDef *adc, uint32_t buff_size, uint32_t tickstart, uint32_t timeout);
|
||||
|
||||
#ifndef printf_adc_result
|
||||
#define printf_adc_result(...)
|
||||
|
||||
@@ -12,48 +12,142 @@
|
||||
#define _TESTER_CONFIG_H_
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup TESTER_SW_TIMINGS_CONFIG Configs for switching timings
|
||||
* @ingroup TESTER_CONFIGS
|
||||
* @brief Конфигурации таймингов для ключей питания
|
||||
@{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Задержка (миллисекундная) для положительного напряжения ПО УМОЛЧАНИЮ
|
||||
* @details Задержка миллисекундная или микросекундная @ref TIME_BEFORE_TEST_MS_DELAY
|
||||
*/
|
||||
#define DEF_TIME_FOR_FORWARD 100
|
||||
#define DEF_TIME_FOR_FORWARD_MS_DELAY 1 ///< включение миллисекундной задержки для @ref DEF_TIME_FOR_FORWARD по умолчанию
|
||||
|
||||
/**
|
||||
* @brief Задержка перед окончанием тестирования (отключение питания) ПО УМОЛЧАНИЮ
|
||||
* @details Задержка миллисекундная или микросекундная @ref TIME_FOR_REVERSE_MS_DELAY
|
||||
*/
|
||||
#define DEF_TIME_FOR_REVERSE 200
|
||||
#define DEF_TIME_FOR_REVERSE_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_FOR_REVERSE
|
||||
|
||||
/**
|
||||
* @brief Задержка перед началом тестирования ПО УМОЛЧАНИЮ
|
||||
* @details Задержка миллисекундная или микросекундная @ref TIME_BEFORE_TEST_MS_DELAY
|
||||
*/
|
||||
#define DEF_TIME_BEFORE_TEST 500
|
||||
#define DEF_TIME_BEFORE_TEST_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_TEST по умолчанию
|
||||
|
||||
/**
|
||||
* @brief Задержка для дедтайма ПО УМОЛЧАНИЮ
|
||||
* @details Задержка миллисекундная или микросекундная @ref DEF_DEADTIME_MS_DELAY
|
||||
*/
|
||||
#define DEF_DEADTIME 0
|
||||
#define DEF_DEADTIME_MS_DELAY 0 ///< включение миллисекундной задержки для @ref DEF_DEADTIME по умолчанию
|
||||
|
||||
/**
|
||||
* @brief Задержка между включением АЦП и предполагаемым скачком напряжения ПО УМОЛЧАНИЮ
|
||||
* @details Задержка нужна, чтобы точно поймать его в буфере АЦП.
|
||||
*
|
||||
* Задержка миллисекундная или микросекундная @ref TIME_BEFORE_TEST_MS_DELAY
|
||||
* @note Но если миллисекундная, то скорее всего скачок не попадет в буфер АЦП.
|
||||
* Поэтому желательно только микросекундная (@ref TIME_BEFORE_PEAK_MS_DELAY = 0)
|
||||
*/
|
||||
#define DEF_TIME_BEFORE_PEAK 5
|
||||
#define DEF_TIME_BEFORE_PEAK_MS_DELAY 0 ///< включение миллисекундной задержки для @ref TIME_BEFORE_PEAK
|
||||
|
||||
/** TESTER_SW_TIMINGS_CONFIG
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup TESTER_INTERFACE_CONFIG Configs for interface of tester
|
||||
* @ingroup TESTER_CONFIGS
|
||||
* @brief Конфигурации для интерфейса тестера
|
||||
@{
|
||||
*/
|
||||
|
||||
/* Дефайны для светодиодов */
|
||||
/* Состояния включенного и выключенного светодиода */
|
||||
#define LED_ON 0 ///< Состояние включенного светодиода
|
||||
#define LED_OFF 1 ///< Состояние выключенного светодиода
|
||||
|
||||
#define LED1_Port GPIOC ///< Порт светодиода (при перенастройке надо также перенастроить через cube)
|
||||
#define LED1_Pin GPIO_PIN_13 ///< Пин светодиода (при перенастройке надо также перенастроить через cube)
|
||||
|
||||
/* Периоды моргания светодиода */
|
||||
#define LED_FORWARD_DIODE_PERIOD 250 ///< Моргание для индикации подключенного положительного напряжения
|
||||
#define LED_REVERSE_DIODE_PERIOD 25 ///< Моргание для индикации подключенного отрицательного напряжения
|
||||
#define LED_BLINK_AS_ON 5 ///< Моргание незаметное для глаза (светодиод просто включен)
|
||||
|
||||
|
||||
/* Дефайны для кнопки */
|
||||
/* Состояния нажатой и отжатой кнопки */
|
||||
#define SW_ON 0 ///< Состояние нажатой кнопки
|
||||
#define SW_OFF 1 ///< Состояние отжатой кнопки
|
||||
|
||||
/* Пин кнопки при перенастройке надо также перенастроить через cube) */
|
||||
#define SWITCH_START_Port GPIOC ///< Порт кнокпи старта (при перенастройке надо также перенастроить через cube)
|
||||
#define SWITCH_START_Pin GPIO_PIN_14 ///< Пин кнокпи старта (при перенастройке надо также перенастроить через cube)
|
||||
|
||||
/* Задержка для компенсации дребезга (в миллисекундах) */
|
||||
#define SWITCH_ANTI_DREBEZG_DELAY 50 ///< Время которое выжидается для окончания дребезга
|
||||
|
||||
/** TESTER_INTERFACE_CONFIG
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup TESTER_PHASE_SW_CONFIG Configs for switches for phases
|
||||
* @ingroup TESTER_CONFIGS
|
||||
* @brief Конфигурации для ключей фаз
|
||||
@{
|
||||
*/
|
||||
//#define USE_HAL_GPIO_FUNCTIONS ///< По этому дефайну для переключения пинов будут использоваться HAL_GPIO функции
|
||||
#define RECONNECT_WITHOUT_DEADTIME ///< По этому дефайну дедтайм отключается. Если отключить и USE_HAL_GPIO_FUNCTIONS, то переключатся фазы будут почти синхронно (160 нс)
|
||||
|
||||
/* Состояния ключей для подключения и откючения питания */
|
||||
#define PHASE_CONNECT 1 ///< Ключ замкнут подключено в данном состоянии пина
|
||||
#define PHASE_DISCONNECT 0 ///< Ключ разомкнут отключено в данном состоянии пина
|
||||
|
||||
/* Ключи для прямого включения диода */
|
||||
/* (при перенастройке надо также перенастроить через cube) */
|
||||
#define SWITCH_PHASES_Port GPIOB ///< Порт пина первого ключа для прямого включения диода
|
||||
#define SWITCH_PHASE_A_POS_Pin GPIO_PIN_0 ///< Пин первого ключа для прямого включения диода
|
||||
#define SWITCH_PHASE_B_NEG_Pin GPIO_PIN_1 ///< Пин второго ключа для прямого включения диода
|
||||
|
||||
|
||||
/* Ключи для обратного включения диода */
|
||||
/* (при перенастройке надо также перенастроить через cube) */
|
||||
#define SWITCH_PHASE_A_NEG_Pin GPIO_PIN_10 ///< Пин первого ключа для обратного включения диода
|
||||
#define SWITCH_PHASE_B_POS_Pin GPIO_PIN_11 ///< Пин первого ключа для обратного включения диода
|
||||
|
||||
/** TESTER_PHASE_SW_CONFIG
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup TESTER_ADC_CONFIG Configs for ADC
|
||||
* @ingroup TESTER_CONFIGS
|
||||
* @brief Конфигурации для АЦП
|
||||
@{
|
||||
*/
|
||||
#define TESTER_ADC_PULSE_EXPETCED_WIDTH 4 ///< Предполагаемая длительность пика в отчетах ацп
|
||||
#define TESTER_ADC_PULSE_SIGN 0 ///< Полярность импульса 0 - положительная, 1 - отрицательая
|
||||
|
||||
#define ADC_BUFF_SIZE (500) ///< Размер буфера АЦП
|
||||
#define ADC_DMA_BUFF_SIZE (ADC_BUFF_SIZE*4) ///< Размер буфера ДМА (4 канала)
|
||||
#define ADC_BUFF_SIZE (200) ///< Размер буфера АЦП
|
||||
#define ADC_DMA_BUFF_SIZE (ADC_BUFF_SIZE) ///< Размер буфера ДМА (1 канал)
|
||||
|
||||
#define ADC_U_CALIBR ((float)1.1) ///< Напряжение, которое подается при калибровке
|
||||
#define ADC_U_CALIBR ((float)3.0) ///< Калибровочное напряжение
|
||||
#define ADC_VALUE_CALIBR (0xFFF) ///< Значение АЦП при калибровочном напряжении @ref ADC_U_CALIBR
|
||||
#define ADC_VALUE_ZERO (0) ///< Значение АЦП при нулевом напряжении
|
||||
|
||||
#define ADC_READ_TIMEOUT_MS 20 ///< Таймаут на ожидание разрядки конденсатора
|
||||
#define ADC_ZERO_WAIT_TIMEOUS_MS 100 ///< Таймаут на ожидание нуля (при калибровке)
|
||||
#define ADC_READ_TIMEOUT_MS 20 ///< Таймаут на ожидание разрядки конденсатора
|
||||
|
||||
#define FOSTER_STUDENT_N 40 ///< Выборка для определения начала разрядки конденсатора
|
||||
#define FOSTER_STUDENT_MSE 2561 /*!< @brief Среднеквадратическая ошибка для выборки размером FOSTER_STUDENT_N, умноженная на 1000
|
||||
@details Выражение для СКО: sqrt(2*ln(N) - 0,8456)
|
||||
URL: https://old.stgau.ru/company/personal/user/7750/files/lib/%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20%D0%BF%D1%80%D0%BE%D0%B3%D0%BD%D0%BE%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D1%82%D0%B5%D0%BC%D0%B0%201.pdf
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Критическое значение Стьюдента
|
||||
* @details Используется для определения разрядки конденсатора.
|
||||
* Записывается в единицах*1000
|
||||
* @note Если закомментировать, то будет использоваться таблица указанная в @ref FOSTER_STUDENT_T_CRITICALS
|
||||
с индексом, указанным в @ref precise_table_ind
|
||||
*/
|
||||
#define FOSTER_STUDENT_USER_T_CRITICAL 1600//2650//2500
|
||||
/**
|
||||
* @brief Критическое значение Стьюдента для калибровки
|
||||
* @details Используется для определения разрядки конденсатора при калибровке.
|
||||
* Записывается в единицах*1000
|
||||
* @note Если закомментировать, то будет использоваться значение указанное в @ref FOSTER_STUDENT_USER_T_CRITICAL
|
||||
*/
|
||||
//#define FOSTER_STUDENT_USER_T_CRITICAL_CALIBR 2600//2650//2500
|
||||
/**
|
||||
* @brief Таблица критических значений Стьюдента с разной погрешностью
|
||||
* @details Используется для определения разрядки конденсатора при закомментированном
|
||||
* @ref FOSTER_STUDENT_USER_T_CRITICAL
|
||||
*/
|
||||
#define FOSTER_STUDENT_T_CRITICALS {257, 688, 1328, 1729, 2093, 2539}
|
||||
/** TESTER_ADC_CONFIG
|
||||
* @}
|
||||
*/
|
||||
|
||||
253
diode_tester/Core/Tester_main/tester_func.c
Normal file
253
diode_tester/Core/Tester_main/tester_func.c
Normal file
@@ -0,0 +1,253 @@
|
||||
#include "tester_func.h"
|
||||
|
||||
TESTER_TestHandleTypeDef hTestDiode;
|
||||
|
||||
/**s
|
||||
* @brief Инициализация хендла тестера диодов
|
||||
*/
|
||||
void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest, TESTER_LEDsTypeDef *leds)
|
||||
{
|
||||
/* Настройка структуры АЦП */
|
||||
htest->adc = &tester_adc;
|
||||
htest->leds = leds;
|
||||
TESTER_ADC_StructInit(htest->adc);
|
||||
|
||||
htest->continuous_buff_size = 20;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Тест диодов: подключение прямого напряжения
|
||||
*/
|
||||
void TESTER_TestDiode_Forward(TESTER_TestHandleTypeDef *htest)
|
||||
{
|
||||
/* Отключение питания от диода */
|
||||
TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward);
|
||||
/* Очистка буферов каналов */
|
||||
ClearStruct(htest->adc->chAdc.ADC_Buff);
|
||||
|
||||
/* Задержка, перед началом работы */
|
||||
TESTER_LED_TimeoutForStartTest(&htest->leds->LED1);
|
||||
TESTER_Delay(&htest->SwTimings.ticks_before_test, &hmcstim);
|
||||
TESTER_LED_TestingDiodeForward(&htest->leds->LED1);
|
||||
|
||||
/* Включение континиус АЦП */
|
||||
HAL_ADC_Start(htest->adc->hadc);
|
||||
|
||||
/* Прямое включение диода */
|
||||
TESTER_Connect_Phase(&htest->SwPhaseForward);
|
||||
|
||||
/* Прямое включение на определенное время */
|
||||
if(htest->SwTimings.ticks_for_forward.msdelay)
|
||||
{
|
||||
uint32_t tickstart = HAL_GetTick();
|
||||
HAL_StatusTypeDef res;
|
||||
while(1)
|
||||
{
|
||||
/* Считывание АЦП пока таймаут истечет */
|
||||
res = ADC_ReadContinuous(htest->adc, htest->continuous_buff_size, tickstart, htest->SwTimings.ticks_for_forward.ticks);
|
||||
|
||||
if(res != HAL_OK)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
TESTER_Delay(&htest->SwTimings.ticks_for_forward, &hmcstim);
|
||||
}
|
||||
|
||||
/* Отключение питания от диода */
|
||||
TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward);
|
||||
|
||||
/* Выключение континиус АЦП */
|
||||
HAL_ADC_Stop(htest->adc->hadc);
|
||||
|
||||
TESTER_LED_WaitForAction(&htest->leds->LED1);
|
||||
|
||||
htest->DiodeForwardVolt = htest->adc->chAdc.U_Current;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Тест диодов: подключение обратного напряжения
|
||||
*/
|
||||
void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest)
|
||||
{
|
||||
/* Отключение питания от диода */
|
||||
TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward);
|
||||
/* Очистка буферов каналов */
|
||||
ClearStruct(htest->adc->chAdc.ADC_Buff);
|
||||
|
||||
/* Задержка, перед началом работы */
|
||||
TESTER_LED_TimeoutForStartTest(&htest->leds->LED1);
|
||||
TESTER_Delay(&htest->SwTimings.ticks_before_test, &hmcstim);
|
||||
TESTER_LED_TestingDiodeReverse(&htest->leds->LED1);
|
||||
|
||||
/* Включение АЦП */
|
||||
ADC_DMA_StartRead(htest->adc);
|
||||
|
||||
/* Задержка, перед предполагаемым скачком */
|
||||
TESTER_Delay(&htest->SwTimings.ticks_before_expected_peak, &hmcstim);
|
||||
|
||||
/* Обратное включение диода */
|
||||
TESTER_Connect_Phase(&htest->SwPhaseReverse);
|
||||
|
||||
/* Обратное включение на определенное время */
|
||||
TESTER_Delay(&htest->SwTimings.ticks_for_reverse, &hmcstim);
|
||||
|
||||
/* Отключение питания от диода */
|
||||
TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward);
|
||||
|
||||
/* Обработка DMA */
|
||||
ADC_DMA_ReadForPeak(htest->adc, ADC_READ_TIMEOUT_MS);
|
||||
|
||||
TESTER_LED_WaitForAction(&htest->leds->LED1);
|
||||
|
||||
htest->DiodeReversePeakVolt = htest->adc->chAdc.U_Current;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Тест диодов: подключение прямого, а потом обратного напряжения
|
||||
*/
|
||||
void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest)
|
||||
{
|
||||
/* Отключение питания от диода */
|
||||
TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward);
|
||||
/* Очистка буферов каналов */
|
||||
ClearStruct(htest->adc->chAdc.ADC_Buff);
|
||||
|
||||
/* Задержка, перед началом работы */
|
||||
TESTER_LED_TimeoutForStartTest(&htest->leds->LED1);
|
||||
TESTER_Delay(&htest->SwTimings.ticks_before_test, &hmcstim);
|
||||
TESTER_LED_TestingDiodeForward(&htest->leds->LED1);
|
||||
|
||||
/* Прямое включение диода */
|
||||
TESTER_Connect_Phase(&htest->SwPhaseForward);
|
||||
|
||||
/* Прямое включение на определенное время */
|
||||
TESTER_Delay(&htest->SwTimings.ticks_for_forward, &hmcstim);
|
||||
htest->DiodeForwardVolt = htest->adc->chAdc.U_Current;
|
||||
TESTER_LED_TestingDiodeReverse(&htest->leds->LED1);
|
||||
|
||||
/* Переход из прямого включения в обратное */
|
||||
TESTER_Reconnect_TwoPhases(&htest->SwPhaseForward, &htest->SwPhaseReverse, &htest->SwTimings.ticks_deadtime);
|
||||
|
||||
/* Обратное включение на определенное время */
|
||||
TESTER_Delay(&htest->SwTimings.ticks_for_reverse, &hmcstim);
|
||||
|
||||
/* Отключение питания от диода */
|
||||
TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward);
|
||||
|
||||
/* Обработка DMA */
|
||||
ADC_DMA_ReadForPeak(htest->adc, ADC_READ_TIMEOUT_MS);
|
||||
|
||||
TESTER_LED_WaitForAction(&htest->leds->LED1);
|
||||
|
||||
htest->DiodeReversePeakVolt = htest->adc->chAdc.U_Current;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Тестирование одного ключа
|
||||
*/
|
||||
void TESTER_TestOneSwitch(GPIO_TypeDef *SwPort, uint32_t SwPin, uint8_t flag)
|
||||
{
|
||||
if(flag)
|
||||
{
|
||||
TESTER_PhaseSwSingle_Set(SwPort, SwPin);
|
||||
}
|
||||
else
|
||||
{
|
||||
TESTER_PhaseSwSingle_Reset(SwPort, SwPin);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Подключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef
|
||||
*/
|
||||
void TESTER_Connect_Phase(TESTER_PhaseSwitchTypeDef *PhaseSw)
|
||||
{
|
||||
TESTER_PhaseSw_Set(PhaseSw);
|
||||
}
|
||||
/**
|
||||
* @brief Отключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef
|
||||
*/
|
||||
void TESTER_Disconnect_Phase(TESTER_PhaseSwitchTypeDef *PhaseSw)
|
||||
{
|
||||
TESTER_PhaseSw_Reset(PhaseSw);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Отключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef
|
||||
*/
|
||||
void TESTER_Disconnect_AllPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_PhaseSwitchTypeDef *SwPhaseB)
|
||||
{
|
||||
TESTER_PhaseSw_Reset(SwPhaseA);
|
||||
TESTER_PhaseSw_Reset(SwPhaseB);
|
||||
}
|
||||
/**
|
||||
* @brief Переключить две фазы с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef
|
||||
*/
|
||||
void TESTER_Reconnect_TwoPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_PhaseSwitchTypeDef *SwPhaseB, TESTER_TicksDelayTypeDef *deadtime)
|
||||
{
|
||||
/* Если дедтайм меньше 100 мкс, то сначала запускаем АЦП а потом дедтаймим */
|
||||
/* Потому что эта функция по длительности порядка 30 мкс, поэтому дедтайм получается не может быть меньше 30 мкс*/
|
||||
#ifndef RECONNECT_WITHOUT_DEADTIME
|
||||
if(deadtime->msdelay == 0)
|
||||
{
|
||||
if(deadtime->ticks < 100)
|
||||
{
|
||||
#endif //RECONNECT_WITHOUT_DEADTIME
|
||||
/* Включение АЦП */
|
||||
ADC_DMA_StartRead(hTestDiode.adc);
|
||||
|
||||
/* Ожидается задержка, перед предполагаемым скачком */
|
||||
TESTER_Delay(&hTestDiode.SwTimings.ticks_before_expected_peak, &hmcstim);
|
||||
#ifndef RECONNECT_WITHOUT_DEADTIME
|
||||
}
|
||||
}
|
||||
#endif //RECONNECT_WITHOUT_DEADTIME
|
||||
|
||||
TESTER_PhaseSw_Reset(SwPhaseA);
|
||||
|
||||
#ifndef RECONNECT_WITHOUT_DEADTIME
|
||||
/* Ожидается задержка дедтайм */
|
||||
TESTER_Delay(deadtime, &hmcstim);
|
||||
|
||||
/* Включение АЦП */
|
||||
ADC_DMA_StartRead(hTestDiode.adc);
|
||||
|
||||
/* Ожидается задержка, перед предполагаемым скачком */
|
||||
TESTER_Delay(&hTestDiode.SwTimings.ticks_before_expected_peak, &hmcstim);
|
||||
#endif //RECONNECT_WITHOUT_DEADTIME
|
||||
|
||||
|
||||
TESTER_PhaseSw_Set(SwPhaseB);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Формирование задержки (в микро или миллисекундная)
|
||||
*/
|
||||
void TESTER_Delay(TESTER_TicksDelayTypeDef *tickdelay, TIM_HandleTypeDef *htim)
|
||||
{
|
||||
/* если миллисекундная задержка выключена */
|
||||
if(tickdelay->msdelay == 0)
|
||||
{
|
||||
htim->Instance->CNT = 1;
|
||||
uint32_t tickstart = HAL_GetTick();
|
||||
/* Задержка, в мкс */
|
||||
while(htim->Instance->CNT < tickdelay->ticks)
|
||||
{
|
||||
/* Если прошло уже больше секунды, а микросекундная задержка не закончилась - возврат */
|
||||
if(HAL_GetTick() - tickstart > 1000)
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* если миллисекундная задержка включена */
|
||||
else
|
||||
{
|
||||
/* Задержка, в миллисекундах */
|
||||
msDelay(tickdelay->ticks);
|
||||
}
|
||||
}
|
||||
128
diode_tester/Core/Tester_main/tester_func.h
Normal file
128
diode_tester/Core/Tester_main/tester_func.h
Normal file
@@ -0,0 +1,128 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file tester_func.h
|
||||
* @brief Заголовочный файл для функций МЗКТ.
|
||||
**************************************************************************
|
||||
@details
|
||||
|
||||
*************************************************************************/
|
||||
|
||||
|
||||
#ifndef _TESTER_FUNC_H_
|
||||
#define _TESTER_FUNC_H_
|
||||
|
||||
#include "tester_adc_func.h"
|
||||
#include "tester_interface_func.h"
|
||||
|
||||
/**
|
||||
* @brief Хендл микросекундного таймера
|
||||
*/
|
||||
#define hmcstim htim3
|
||||
|
||||
|
||||
#ifdef USE_HAL_GPIO_FUNCTIONS
|
||||
#define TESTER_PhaseSw_Set(_sw_) HAL_GPIO_WritePin((_sw_)->SW_Port, (_sw_)->SwHI_Pin | (_sw_)->SwLO_Pin, PHASE_CONNECT)
|
||||
#define TESTER_PhaseSw_Reset(_sw_) HAL_GPIO_WritePin((_sw_)->SW_Port, (_sw_)->SwHI_Pin | (_sw_)->SwLO_Pin, PHASE_DISCONNECT)
|
||||
|
||||
#define TESTER_PhaseSwSingle_Set(_swport_, _swpin_) HAL_GPIO_WritePin((_swport_), (_swpin_), PHASE_CONNECT)
|
||||
#define TESTER_PhaseSwSingle_Reset(_swport_, _swpin_) HAL_GPIO_WritePin((_swport_), (_swpin_), PHASE_DISCONNECT)
|
||||
#else //USE_HAL_GPIO_FUNCTIONS
|
||||
|
||||
#if (PHASE_CONNECT == 1) && (PHASE_DISCONNECT == 0)
|
||||
#define TESTER_PhaseSw_Set(_sw_) (_sw_)->SW_Port->BSRR = (_sw_)->SwHI_Pin | (_sw_)->SwLO_Pin
|
||||
#define TESTER_PhaseSw_Reset(_sw_) (_sw_)->SW_Port->BSRR = ((_sw_)->SwHI_Pin | (_sw_)->SwLO_Pin) << 16
|
||||
|
||||
#define TESTER_PhaseSwSingle_Set(_swport_, _swpin_) (_swport_)->BSRR = (_swpin_)
|
||||
#define TESTER_PhaseSwSingle_Reset(_swport_, _swpin_) (_swport_)->BSRR = ((_swpin_) << 16)
|
||||
#elif (PHASE_CONNECT == 0) && (PHASE_DISCONNECT == 1)
|
||||
#define TESTER_PhaseSw_Set(_sw_) (_sw_)->SW_Port->BSRR = ((_sw_)->SwHI_Pin | _sw_->SwLO_Pin) << 16
|
||||
#define TESTER_PhaseSw_Reset(_sw_) (_sw_)->SW_Port->BSRR = (_sw_)->SwHI_Pin | (_sw_)->SwLO_Pin
|
||||
|
||||
#define TESTER_PhaseSwSingle_Set(_swport_, _swpin_) (_swport_)->BSRR = ((_swpin_) << 16)
|
||||
#define TESTER_PhaseSwSingle_Reset(_swport_, _swpin_) (_swport_)->BSRR = (_swpin_)
|
||||
#endif //POWER_CONNECT
|
||||
|
||||
#endif //USE_HAL_GPIO_FUNCTIONS
|
||||
|
||||
extern TIM_HandleTypeDef htim3;
|
||||
|
||||
/**
|
||||
* @brief Структура для пинов, которые отвечают за ключи, которые подключают фазы
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
GPIO_TypeDef *SW_Port; ///< Порт первого ключа для фазы
|
||||
uint32_t SwHI_Pin; ///< Пин первого ключа для фазы
|
||||
uint32_t SwLO_Pin; ///< Пин второго ключа для фазы
|
||||
}TESTER_PhaseSwitchTypeDef;
|
||||
|
||||
|
||||
/**
|
||||
* @brief Структура для тайминга с флагом миллисекундой или тиковой (пустой for) задержкой
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
unsigned msdelay:1;
|
||||
uint32_t ticks;
|
||||
}TESTER_TicksDelayTypeDef;
|
||||
|
||||
/**
|
||||
* @brief Структура с таймингами для тестера
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
TESTER_TicksDelayTypeDef ticks_for_forward; ///< задержка для прямого включения @ref TESTER_TestDiode_Forward
|
||||
TESTER_TicksDelayTypeDef ticks_for_reverse; ///< задержка для прямого включения @ref TESTER_TestDiode_Reverse
|
||||
TESTER_TicksDelayTypeDef ticks_before_test; ///< задержка перед началом тестирования (мс или мкс)
|
||||
TESTER_TicksDelayTypeDef ticks_deadtime; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или мкс)
|
||||
TESTER_TicksDelayTypeDef ticks_before_expected_peak; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или мкс)
|
||||
}TESTER_SwitchTimingsTypeDef;
|
||||
|
||||
/**
|
||||
* @brief Структура-дескриптор для управления тестированием диодов
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
TESTER_ADCTypeDef *adc; ///< указатель на структуру АЦП тестера
|
||||
|
||||
TESTER_SwitchTimingsTypeDef SwTimings; ///< Тайминги для ключей
|
||||
|
||||
TESTER_PhaseSwitchTypeDef SwPhaseForward; ///< Пины ключей фаз для прямого включения
|
||||
TESTER_PhaseSwitchTypeDef SwPhaseReverse; ///< Пины ключей фаз для обратного включения
|
||||
|
||||
uint32_t continuous_buff_size;
|
||||
|
||||
float DiodeForwardVolt;
|
||||
float DiodeReversePeakVolt;
|
||||
|
||||
TESTER_LEDsTypeDef *leds;
|
||||
}TESTER_TestHandleTypeDef;
|
||||
extern TESTER_TestHandleTypeDef hTestDiode;
|
||||
|
||||
|
||||
|
||||
/* Инициализация хендла тестера диодов */
|
||||
void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest, TESTER_LEDsTypeDef *leds);
|
||||
|
||||
/* Тест диодов: подключение прямого напряжения */
|
||||
void TESTER_TestDiode_Forward(TESTER_TestHandleTypeDef *htest);
|
||||
/* Тест диодов: подключение обратного напряжения */
|
||||
void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest);
|
||||
/* Тест диодов: подключение прямого, а потом обратного напряжения */
|
||||
void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest);
|
||||
|
||||
/* Тестирование одного ключа */
|
||||
void TESTER_TestOneSwitch(GPIO_TypeDef *SwPort, uint32_t SwPin, uint8_t flag);
|
||||
|
||||
/* Подключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */
|
||||
void TESTER_Connect_Phase(TESTER_PhaseSwitchTypeDef *PhaseSw);
|
||||
/* Отключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */
|
||||
void TESTER_Disconnect_Phase(TESTER_PhaseSwitchTypeDef *PhaseSw);
|
||||
/* Отключить фазу с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */
|
||||
void TESTER_Disconnect_AllPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_PhaseSwitchTypeDef *SwPhaseB);
|
||||
/* Переключить две фазы с помощью ключей (пинов) в TESTER_PhaseSwitchTypeDef */
|
||||
void TESTER_Reconnect_TwoPhases(TESTER_PhaseSwitchTypeDef *SwPhaseA, TESTER_PhaseSwitchTypeDef *SwPhaseB, TESTER_TicksDelayTypeDef *deadtime);
|
||||
/* Формирование задержки (в микро или миллисекундная) */
|
||||
void TESTER_Delay(TESTER_TicksDelayTypeDef *tickdelay, TIM_HandleTypeDef *htim);
|
||||
#endif //_TESTER_FUNC_H_
|
||||
|
||||
40
diode_tester/Core/Tester_main/tester_interface_func.c
Normal file
40
diode_tester/Core/Tester_main/tester_interface_func.c
Normal file
@@ -0,0 +1,40 @@
|
||||
#include "tester_interface_func.h"
|
||||
|
||||
|
||||
/**
|
||||
* @brief Инициализация структур интерфейса
|
||||
*/
|
||||
void TESTER_InterfaceInit(GPIO_SwitchTypeDef *swstart, TESTER_LEDsTypeDef *leds)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Включить индикацию таймаута старта при активации теста
|
||||
*/
|
||||
void TESTER_LED_TimeoutForStartTest(GPIO_LEDTypeDef *led)
|
||||
{
|
||||
GPIO_LED_Off(led);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Включить индикацию прямого подключения диода
|
||||
*/
|
||||
void TESTER_LED_TestingDiodeForward(GPIO_LEDTypeDef *led)
|
||||
{
|
||||
GPIO_LED_Blink_Start(led, LED_FORWARD_DIODE_PERIOD);
|
||||
}
|
||||
/**
|
||||
* @brief Включить индикацию обратного подключения диода
|
||||
*/
|
||||
void TESTER_LED_TestingDiodeReverse(GPIO_LEDTypeDef *led)
|
||||
{
|
||||
GPIO_LED_Blink_Start(led, LED_REVERSE_DIODE_PERIOD);
|
||||
}
|
||||
/**
|
||||
* @brief Выключить индикацию ожидания комманды
|
||||
* @details Сделано через моргание, чтобы понимать, что системные тики работают
|
||||
*/
|
||||
void TESTER_LED_WaitForAction(GPIO_LEDTypeDef *led)
|
||||
{
|
||||
GPIO_LED_Blink_Start(led, LED_BLINK_AS_ON);
|
||||
}
|
||||
39
diode_tester/Core/Tester_main/tester_interface_func.h
Normal file
39
diode_tester/Core/Tester_main/tester_interface_func.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file tester_func.h
|
||||
* @brief Заголовочный файл для функций МЗКТ.
|
||||
**************************************************************************
|
||||
@details
|
||||
|
||||
*************************************************************************/
|
||||
|
||||
|
||||
#ifndef _TESTER_INTERFACE_FUNC_H_
|
||||
#define _TESTER_INTERFACE_FUNC_H_
|
||||
|
||||
#include "mylibs_include.h"
|
||||
#include "rs_message.h"
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GPIO_LEDTypeDef LED1;
|
||||
}TESTER_LEDsTypeDef;
|
||||
|
||||
|
||||
/* Инициализация структур интерфейса */
|
||||
void TESTER_InterfaceInit(GPIO_SwitchTypeDef *swstart, TESTER_LEDsTypeDef *leds);
|
||||
|
||||
|
||||
/* Включить индикацию таймаута старта при активации теста */
|
||||
void TESTER_LED_TimeoutForStartTest(GPIO_LEDTypeDef *led);
|
||||
/* Включить индикацию прямого подключения диода */
|
||||
void TESTER_LED_TestingDiodeForward(GPIO_LEDTypeDef *led);
|
||||
/* Включить индикацию обратного подключения диода */
|
||||
void TESTER_LED_TestingDiodeReverse(GPIO_LEDTypeDef *led);
|
||||
/* Выключить индикацию активного теста диодов */
|
||||
void TESTER_LED_WaitForAction(GPIO_LEDTypeDef *led);
|
||||
|
||||
#endif //_TESTER_INTERFACE_FUNC_H_
|
||||
|
||||
240
diode_tester/Core/Tester_main/tester_main.c
Normal file
240
diode_tester/Core/Tester_main/tester_main.c
Normal file
@@ -0,0 +1,240 @@
|
||||
#include "tester_main.h"
|
||||
|
||||
|
||||
TESTER_ProjectTypeDef TESTER = {0};
|
||||
|
||||
|
||||
/**s
|
||||
* @brief Инициализация всех модулей для работы тестера
|
||||
*/
|
||||
void TESTER_Init(TESTER_ProjectTypeDef *tester)
|
||||
{
|
||||
TESTER_InterfaceInit(&tester->SwStart, &tester->leds);
|
||||
GPIO_LED_Blink_Start(&tester->leds.LED1, 100);
|
||||
|
||||
tester->delay = 250;
|
||||
tester->delay_en = 0;
|
||||
|
||||
tester->func.disable_reset_call = 0;
|
||||
tester->htest = &hTestDiode;
|
||||
TESTER_HandleInit(tester->htest, &tester->leds);
|
||||
|
||||
tester->hmodbus = &hmodbus1;
|
||||
tester->mbdata = &MB_DATA;
|
||||
MODBUS_FirstInit();
|
||||
}
|
||||
|
||||
|
||||
/**s
|
||||
* @brief Функция подготовки тестера к while(1)
|
||||
*/
|
||||
void TESTER_pre_while(TESTER_ProjectTypeDef *tester)
|
||||
{
|
||||
TESTER_Set_Default_Settings(tester);
|
||||
TESTER_UpdateSettings(tester->htest, tester->mbdata);
|
||||
|
||||
RS_Receive_IT(tester->hmodbus, &MODBUS_MSG);
|
||||
HAL_TIM_Base_Start(&hmcstim);
|
||||
|
||||
|
||||
tester->f.flag_init_done = 1;
|
||||
GPIO_LED_Blink_Start(&tester->leds.LED1, LED_BLINK_AS_ON);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief Главная функция работы тестера
|
||||
*/
|
||||
void TESTER_main_while(TESTER_ProjectTypeDef *tester)
|
||||
{
|
||||
if(tester->delay_en)
|
||||
msDelay(tester->delay);
|
||||
|
||||
|
||||
/* ПОДТЯГИВАНИЕ СОСТОЯНИЯ КЛЮЧЕЙ С МОДБАС */
|
||||
TESTER_TestOneSwitch(tester->htest->SwPhaseForward.SW_Port, tester->htest->SwPhaseForward.SwHI_Pin,
|
||||
tester->mbdata->Coils.KeyForwardHiTest);
|
||||
TESTER_TestOneSwitch(tester->htest->SwPhaseForward.SW_Port, tester->htest->SwPhaseForward.SwLO_Pin,
|
||||
tester->mbdata->Coils.KeyForwardLoTest);
|
||||
TESTER_TestOneSwitch(tester->htest->SwPhaseForward.SW_Port, tester->htest->SwPhaseReverse.SwHI_Pin,
|
||||
tester->mbdata->Coils.KeyReverseHiTest);
|
||||
TESTER_TestOneSwitch(tester->htest->SwPhaseForward.SW_Port, tester->htest->SwPhaseReverse.SwLO_Pin,
|
||||
tester->mbdata->Coils.KeyReverseLoTest);
|
||||
|
||||
|
||||
|
||||
/* ТЕСТ В ОБРАТНОМ ВКЛЮЧЕНИИ */
|
||||
if(tester->func.test_diode_reverse)
|
||||
{
|
||||
tester->f.flag_test_active = 1;
|
||||
TESTER_TestDiode_Reverse(tester->htest);
|
||||
|
||||
/* Запись данных в modbus */
|
||||
tester->mbdata->InRegs.ReversePeakVoltage = tester->htest->DiodeReversePeakVolt*1000;
|
||||
|
||||
if(tester->func.disable_reset_call == 0)
|
||||
tester->func.test_diode_reverse = 0;
|
||||
|
||||
tester->f.flag_test_active = 0;
|
||||
tester->mbdata->Coils.StartTest = 0;
|
||||
}
|
||||
|
||||
/* ТЕСТ В ПРЯМОМ ВКЛЮЧЕНИИ */
|
||||
if(tester->func.test_diode_forward)
|
||||
{
|
||||
tester->f.flag_test_active = 1;
|
||||
TESTER_TestDiode_Forward(tester->htest);
|
||||
|
||||
/* Запись данных в modbus */
|
||||
tester->mbdata->InRegs.ForwardVoltage = tester->htest->DiodeForwardVolt*1000;
|
||||
|
||||
if(tester->func.disable_reset_call == 0)
|
||||
tester->func.test_diode_forward = 0;
|
||||
|
||||
tester->f.flag_test_active = 0;
|
||||
tester->mbdata->Coils.StartTest = 0;
|
||||
}
|
||||
/* ТЕСТ ПЕРЕХОДА ИЗ ПРЯМОГО В ОБРАТНОЕ ВКЛЮЧЕНИЯ*/
|
||||
if(tester->func.test_diode_switch_connection)
|
||||
{
|
||||
tester->f.flag_test_active = 1;
|
||||
TESTER_TestDiode_SwitchConnection(tester->htest);
|
||||
|
||||
/* Запись данных в modbus */
|
||||
tester->mbdata->InRegs.ReversePeakVoltage = tester->htest->DiodeReversePeakVolt*1000;
|
||||
tester->mbdata->InRegs.ForwardVoltage = tester->htest->DiodeForwardVolt*1000;
|
||||
|
||||
if(tester->func.disable_reset_call == 0)
|
||||
tester->func.test_diode_switch_connection = 0;
|
||||
|
||||
tester->f.flag_test_active = 0;
|
||||
tester->mbdata->Coils.StartTest = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief Функция работы интерфейса
|
||||
*/
|
||||
void TESTER_InterfaceHandle(TESTER_ProjectTypeDef *tester)
|
||||
{
|
||||
if(tester->f.flag_init_done == 0)
|
||||
return;
|
||||
|
||||
|
||||
/* считывание режима тестера с модбас */
|
||||
tester->mode = *((TESTER_TestModeTypeDef *)&tester->mbdata->Coils) & 0x3;
|
||||
|
||||
/* если кнопка нажата или пришла соответствующая комманда модбас */
|
||||
if(GPIO_Read_Swich(&tester->SwStart) || tester->mbdata->Coils.StartTest)
|
||||
{
|
||||
/* Обновление настроек тестера */
|
||||
TESTER_UpdateSettings(tester->htest, tester->mbdata);
|
||||
switch(tester->mode)
|
||||
{
|
||||
case TEST_FORWARD:
|
||||
tester->func.test_diode_forward = 1;
|
||||
break;
|
||||
|
||||
case TEST_REVERSE:
|
||||
tester->func.test_diode_reverse = 1;
|
||||
break;
|
||||
|
||||
case TEST_SWITCH_CONNECTION:
|
||||
tester->func.test_diode_switch_connection = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GPIO_LED_Blink_Handle(&tester->leds.LED1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Обновление настроек тестера
|
||||
*/
|
||||
void TESTER_UpdateSettings(TESTER_TestHandleTypeDef *htest, MB_DataStructureTypeDef *mbdata)
|
||||
{
|
||||
htest->SwTimings.ticks_for_forward.ticks = mbdata->HoldRegs.TimeForForward;
|
||||
htest->SwTimings.ticks_for_reverse.ticks = mbdata->HoldRegs.TimeForReverse;
|
||||
htest->SwTimings.ticks_before_test.ticks = mbdata->HoldRegs.TimeBeforeTest;
|
||||
htest->SwTimings.ticks_deadtime.ticks = mbdata->HoldRegs.TimeDeadtime;
|
||||
htest->SwTimings.ticks_before_expected_peak.ticks = mbdata->HoldRegs.TimeBeforePeak;
|
||||
|
||||
htest->SwTimings.ticks_for_forward.msdelay = mbdata->Coils.msTimeForForward_enable;
|
||||
htest->SwTimings.ticks_for_reverse.msdelay = mbdata->Coils.msTimeForReverse_enable;
|
||||
htest->SwTimings.ticks_before_test.msdelay = mbdata->Coils.msTimeBeforeTest_enable;
|
||||
htest->SwTimings.ticks_deadtime.msdelay = mbdata->Coils.msTimeDeadtime_enable;
|
||||
htest->SwTimings.ticks_before_expected_peak.msdelay = mbdata->Coils.msTimeBeforePeak_enable;
|
||||
|
||||
TESTER_ADC_UpdateSettings(htest->adc, mbdata);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Инициализация тестера по дефолтным настрйокам в tester_config.h
|
||||
*/
|
||||
void TESTER_Set_Default_Settings(TESTER_ProjectTypeDef *tester)
|
||||
{
|
||||
tester->mbdata->Coils.ForwardTest = 1;
|
||||
tester->mbdata->Coils.ReverseTest = 1;
|
||||
|
||||
/* Настройка пинов для обратного включения */
|
||||
tester->htest->SwPhaseForward.SW_Port = SWITCH_PHASES_Port;
|
||||
tester->htest->SwPhaseForward.SwHI_Pin = SWITCH_PHASE_A_POS_Pin;
|
||||
tester->htest->SwPhaseForward.SwLO_Pin = SWITCH_PHASE_B_NEG_Pin;
|
||||
|
||||
/* Настройка пинов для прямого включения */
|
||||
tester->htest->SwPhaseReverse.SW_Port = SWITCH_PHASES_Port;
|
||||
tester->htest->SwPhaseReverse.SwHI_Pin = SWITCH_PHASE_B_POS_Pin;
|
||||
tester->htest->SwPhaseReverse.SwLO_Pin = SWITCH_PHASE_A_NEG_Pin;
|
||||
|
||||
|
||||
/* Настройка пинов для кнопки старта */
|
||||
tester->SwStart.Sw_Port = SWITCH_START_Port;
|
||||
tester->SwStart.Sw_Pin = SWITCH_START_Pin;
|
||||
tester->SwStart.Sw_FilterDelay = SWITCH_ANTI_DREBEZG_DELAY;
|
||||
|
||||
/* Настройка пинов для светодиода*/
|
||||
tester->leds.LED1.LED_Port = LED1_Port;
|
||||
tester->leds.LED1.LED_Pin = LED1_Pin;
|
||||
|
||||
/* Настройка таймингов по умолчанию для тестирования */
|
||||
tester->mbdata->HoldRegs.TimeBeforeTest = DEF_TIME_BEFORE_TEST;
|
||||
tester->mbdata->Coils.msTimeBeforeTest_enable = DEF_TIME_BEFORE_TEST_MS_DELAY;
|
||||
|
||||
tester->mbdata->HoldRegs.TimeForReverse = DEF_TIME_FOR_REVERSE;
|
||||
tester->mbdata->Coils.msTimeForReverse_enable = DEF_TIME_FOR_REVERSE_MS_DELAY;
|
||||
|
||||
tester->mbdata->HoldRegs.TimeForForward = DEF_TIME_FOR_FORWARD;
|
||||
tester->mbdata->Coils.msTimeForForward_enable = DEF_TIME_FOR_FORWARD_MS_DELAY;
|
||||
|
||||
tester->mbdata->HoldRegs.TimeDeadtime = DEF_DEADTIME;
|
||||
tester->mbdata->Coils.msTimeDeadtime_enable = DEF_DEADTIME_MS_DELAY;
|
||||
|
||||
tester->mbdata->HoldRegs.TimeBeforePeak = DEF_TIME_BEFORE_PEAK;
|
||||
tester->mbdata->Coils.msTimeBeforePeak_enable = DEF_TIME_BEFORE_PEAK_MS_DELAY;
|
||||
|
||||
|
||||
/* Настройка АЦП */
|
||||
tester->mbdata->HoldRegs.Adc_PulseWidth = TESTER_ADC_PULSE_EXPETCED_WIDTH;
|
||||
tester->mbdata->HoldRegs.Adc_CalibrValue = ADC_VALUE_CALIBR;
|
||||
tester->mbdata->HoldRegs.Adc_ZeroValue = ADC_VALUE_ZERO;
|
||||
tester->mbdata->HoldRegs.Adc_U_Calibr = ADC_U_CALIBR;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Задеркжка главного цикла
|
||||
*/
|
||||
void TESTER_main_delay(TESTER_ProjectTypeDef *tester)
|
||||
{
|
||||
if(tester->delay_en)
|
||||
msDelay(tester->delay);
|
||||
}
|
||||
90
diode_tester/Core/Tester_main/tester_main.h
Normal file
90
diode_tester/Core/Tester_main/tester_main.h
Normal file
@@ -0,0 +1,90 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file tester_func.h
|
||||
* @brief Заголовочный файл для функций МЗКТ.
|
||||
**************************************************************************
|
||||
@details
|
||||
|
||||
*************************************************************************/
|
||||
|
||||
|
||||
#ifndef _TESTER_MAIN_H_
|
||||
#define _TESTER_MAIN_H_
|
||||
|
||||
#include "tester_func.h"
|
||||
|
||||
|
||||
/**
|
||||
* @brief Структура для вызова различных функций
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
unsigned test_diode_reverse:1;
|
||||
unsigned test_diode_switch_connection:1;
|
||||
unsigned test_diode_forward:1;
|
||||
|
||||
unsigned disable_reset_call:1;
|
||||
}function_calls;
|
||||
|
||||
/**
|
||||
* @brief Структура для вызова различных функций
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
unsigned flag_init_done:1;
|
||||
unsigned flag_test_active:1;
|
||||
}TESTER_FlagsTypeDef;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TEST_DISABLE = 0,
|
||||
TEST_FORWARD = 1,
|
||||
TEST_REVERSE = 2,
|
||||
TEST_SWITCH_CONNECTION = 3
|
||||
}TESTER_TestModeTypeDef;
|
||||
|
||||
|
||||
/**
|
||||
* @brief Структура проекта тестер
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
function_calls func; ///< вызов разных функций
|
||||
|
||||
TESTER_TestModeTypeDef mode; ///< режим тестера
|
||||
|
||||
TESTER_TestHandleTypeDef *htest; ///< дескриптор тестера
|
||||
|
||||
RS_HandleTypeDef *hmodbus;
|
||||
MB_DataStructureTypeDef *mbdata;
|
||||
|
||||
|
||||
GPIO_SwitchTypeDef SwStart; ///< структура кнопки старта
|
||||
TESTER_LEDsTypeDef leds; ///< структура светодиодов
|
||||
|
||||
|
||||
TESTER_FlagsTypeDef f;
|
||||
|
||||
uint32_t delay; ///< задержка главного цикла
|
||||
uint32_t delay_en:1; ///< включить задержку в главном цикле
|
||||
}TESTER_ProjectTypeDef;
|
||||
extern TESTER_ProjectTypeDef TESTER;
|
||||
|
||||
|
||||
|
||||
/* Инициализация всех модулей для работы тестера */
|
||||
void TESTER_Init(TESTER_ProjectTypeDef *tester);
|
||||
/* Функция подготовки тестера к while(1) */
|
||||
void TESTER_pre_while(TESTER_ProjectTypeDef *tester);
|
||||
/* Главная функция работы тестера */
|
||||
void TESTER_main_while(TESTER_ProjectTypeDef *tester);
|
||||
/* Функция работы интерфейса */
|
||||
void TESTER_InterfaceHandle(TESTER_ProjectTypeDef *tester);
|
||||
/* Обновление настроек тестера */
|
||||
void TESTER_UpdateSettings(TESTER_TestHandleTypeDef *htest, MB_DataStructureTypeDef *mbdata);
|
||||
/* Инициализация тестера по дефолтным настрйокам в tester_config.h */
|
||||
void TESTER_Set_Default_Settings(TESTER_ProjectTypeDef *tester);
|
||||
/*Задеркжка главного цикла */
|
||||
void TESTER_main_delay(TESTER_ProjectTypeDef *tester);
|
||||
#endif //_TESTER_MAIN_H_
|
||||
|
||||
@@ -145,32 +145,134 @@
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>ST-LINKIII-KEIL_SWO</Key>
|
||||
<Name>-U53FF72064980555724221187 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL08000 -FP0($$Device:STM32F103C6$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2</Name>
|
||||
<Name>-U005600373433510237363934 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL08000 -FP0($$Device:STM32F103C6$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2</Name>
|
||||
</SetRegEntry>
|
||||
</TargetDriverDllRegistry>
|
||||
<Breakpoint/>
|
||||
<Breakpoint>
|
||||
<Bp>
|
||||
<Number>0</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>87</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>134244302</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>1</BreakIfRCount>
|
||||
<Filename>..\Core\Tester_main\tester_main.c</Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression>\\diode_tester\../Core/Tester_main/tester_main.c\87</Expression>
|
||||
</Bp>
|
||||
</Breakpoint>
|
||||
<WatchWindow1>
|
||||
<Ww>
|
||||
<count>0</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>tester_adc,0x10</ItemText>
|
||||
<ItemText>tester_adc,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>1</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>ADC_DMA_HalfBuff,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>2</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>&tester->mbdata->Coils.Mode</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>3</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>axa</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>4</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>*(uint16_t *)(&tester->mbdata->Coils) & (1<<3)</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>5</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>tester->mbdata->Coils</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>6</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>RS_Buffer</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>7</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>hmodbus1,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>8</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>MB_DATA,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>9</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>\\diode_tester\../Core/Interfaces/modbus.c\MB_DATA.HoldRegs.TimeForForward</ItemText>
|
||||
</Ww>
|
||||
</WatchWindow1>
|
||||
<WatchWindow2>
|
||||
<Ww>
|
||||
<count>0</count>
|
||||
<WinNumber>2</WinNumber>
|
||||
<ItemText>before_pulse_delay</ItemText>
|
||||
<ItemText>TESTER,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>1</count>
|
||||
<WinNumber>2</WinNumber>
|
||||
<ItemText>pulse_delay</ItemText>
|
||||
<ItemText>tickstart,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>2</count>
|
||||
<WinNumber>2</WinNumber>
|
||||
<ItemText>uwTick,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>3</count>
|
||||
<WinNumber>2</WinNumber>
|
||||
<ItemText>timeout,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>4</count>
|
||||
<WinNumber>2</WinNumber>
|
||||
<ItemText>val_sum,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>5</count>
|
||||
<WinNumber>2</WinNumber>
|
||||
<ItemText>ADC_DMA_HalfBuff,0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>6</count>
|
||||
<WinNumber>2</WinNumber>
|
||||
<ItemText>\\diode_tester\../Core/Tester_main/tester_main.c\TESTER</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>7</count>
|
||||
<WinNumber>2</WinNumber>
|
||||
<ItemText>MB_INFO</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>8</count>
|
||||
<WinNumber>2</WinNumber>
|
||||
<ItemText>RS_Buffer</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>9</count>
|
||||
<WinNumber>2</WinNumber>
|
||||
<ItemText>*ind</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>10</count>
|
||||
<WinNumber>2</WinNumber>
|
||||
<ItemText>&ind</ItemText>
|
||||
</Ww>
|
||||
</WatchWindow2>
|
||||
<Tracepoint>
|
||||
@@ -196,7 +298,7 @@
|
||||
<aLa>0</aLa>
|
||||
<aPa1>0</aPa1>
|
||||
<AscS4>0</AscS4>
|
||||
<aSer4>0</aSer4>
|
||||
<aSer4>1</aSer4>
|
||||
<StkLoc>1</StkLoc>
|
||||
<TrcWin>0</TrcWin>
|
||||
<newCpu>0</newCpu>
|
||||
@@ -217,19 +319,15 @@
|
||||
<pMultCmdsp></pMultCmdsp>
|
||||
<SystemViewers>
|
||||
<Entry>
|
||||
<Name>System Viewer\ADC1</Name>
|
||||
<WinId>35903</WinId>
|
||||
</Entry>
|
||||
<Entry>
|
||||
<Name>System Viewer\DMA1</Name>
|
||||
<WinId>35902</WinId>
|
||||
</Entry>
|
||||
<Entry>
|
||||
<Name>System Viewer\GPIOA</Name>
|
||||
<Name>System Viewer\GPIOB</Name>
|
||||
<WinId>35904</WinId>
|
||||
</Entry>
|
||||
<Entry>
|
||||
<Name>System Viewer\GPIOC</Name>
|
||||
<Name>System Viewer\TIM2</Name>
|
||||
<WinId>35899</WinId>
|
||||
</Entry>
|
||||
<Entry>
|
||||
<Name>System Viewer\USART1</Name>
|
||||
<WinId>35905</WinId>
|
||||
</Entry>
|
||||
</SystemViewers>
|
||||
@@ -256,6 +354,18 @@
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\Core\Tester_main\tester_config.h</PathWithFileName>
|
||||
<FilenameWithoutPath>tester_config.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>2</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\Core\MyLibs\mylibs_config.h</PathWithFileName>
|
||||
<FilenameWithoutPath>mylibs_config.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
@@ -263,7 +373,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>2</FileNumber>
|
||||
<FileNumber>3</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -275,7 +385,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>3</FileNumber>
|
||||
<FileNumber>4</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -287,13 +397,13 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>4</FileNumber>
|
||||
<FileNumber>5</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\Core\Tester_main\tester_config.h</PathWithFileName>
|
||||
<FilenameWithoutPath>tester_config.h</FilenameWithoutPath>
|
||||
<PathWithFileName>..\Core\Inc\main.h</PathWithFileName>
|
||||
<FilenameWithoutPath>main.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
@@ -307,7 +417,55 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>5</FileNumber>
|
||||
<FileNumber>6</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\Core\Tester_main\tester_main.c</PathWithFileName>
|
||||
<FilenameWithoutPath>tester_main.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>7</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\Core\Tester_main\tester_main.h</PathWithFileName>
|
||||
<FilenameWithoutPath>tester_main.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>8</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\Core\Tester_main\tester_func.c</PathWithFileName>
|
||||
<FilenameWithoutPath>tester_func.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>9</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\Core\Tester_main\tester_func.h</PathWithFileName>
|
||||
<FilenameWithoutPath>tester_func.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>10</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -319,7 +477,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>6</FileNumber>
|
||||
<FileNumber>11</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -329,6 +487,30 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>12</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\Core\Tester_main\tester_interface_func.c</PathWithFileName>
|
||||
<FilenameWithoutPath>tester_interface_func.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>13</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\Core\Tester_main\tester_interface_func.h</PathWithFileName>
|
||||
<FilenameWithoutPath>tester_interface_func.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
@@ -339,7 +521,7 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>7</FileNumber>
|
||||
<FileNumber>14</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -351,7 +533,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>8</FileNumber>
|
||||
<FileNumber>15</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -363,7 +545,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>9</FileNumber>
|
||||
<FileNumber>16</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -375,7 +557,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>10</FileNumber>
|
||||
<FileNumber>17</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -387,7 +569,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>11</FileNumber>
|
||||
<FileNumber>18</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -399,7 +581,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>12</FileNumber>
|
||||
<FileNumber>19</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -411,7 +593,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>13</FileNumber>
|
||||
<FileNumber>20</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -425,13 +607,13 @@
|
||||
|
||||
<Group>
|
||||
<GroupName>MyLibs</GroupName>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>14</FileNumber>
|
||||
<FileNumber>21</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -443,7 +625,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>15</FileNumber>
|
||||
<FileNumber>22</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -455,7 +637,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>16</FileNumber>
|
||||
<FileNumber>23</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -467,7 +649,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>17</FileNumber>
|
||||
<FileNumber>24</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -477,6 +659,30 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>25</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\Core\MyLibs\general_gpio.c</PathWithFileName>
|
||||
<FilenameWithoutPath>general_gpio.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>26</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\Core\MyLibs\general_gpio.h</PathWithFileName>
|
||||
<FilenameWithoutPath>general_gpio.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
@@ -487,7 +693,7 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>5</GroupNumber>
|
||||
<FileNumber>18</FileNumber>
|
||||
<FileNumber>27</FileNumber>
|
||||
<FileType>2</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -507,7 +713,7 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>19</FileNumber>
|
||||
<FileNumber>28</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -519,7 +725,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>20</FileNumber>
|
||||
<FileNumber>29</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -531,7 +737,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>21</FileNumber>
|
||||
<FileNumber>30</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -543,7 +749,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>22</FileNumber>
|
||||
<FileNumber>31</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -555,7 +761,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>23</FileNumber>
|
||||
<FileNumber>32</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -567,7 +773,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>24</FileNumber>
|
||||
<FileNumber>33</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -579,7 +785,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>25</FileNumber>
|
||||
<FileNumber>34</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -591,7 +797,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>26</FileNumber>
|
||||
<FileNumber>35</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -611,7 +817,7 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>27</FileNumber>
|
||||
<FileNumber>36</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -623,7 +829,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>28</FileNumber>
|
||||
<FileNumber>37</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -635,7 +841,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>29</FileNumber>
|
||||
<FileNumber>38</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -647,7 +853,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>30</FileNumber>
|
||||
<FileNumber>39</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -659,7 +865,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>31</FileNumber>
|
||||
<FileNumber>40</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -671,7 +877,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>32</FileNumber>
|
||||
<FileNumber>41</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -683,7 +889,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>33</FileNumber>
|
||||
<FileNumber>42</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -695,7 +901,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>34</FileNumber>
|
||||
<FileNumber>43</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -707,7 +913,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>35</FileNumber>
|
||||
<FileNumber>44</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -719,7 +925,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>36</FileNumber>
|
||||
<FileNumber>45</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -731,7 +937,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>37</FileNumber>
|
||||
<FileNumber>46</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -743,7 +949,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>38</FileNumber>
|
||||
<FileNumber>47</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -755,7 +961,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>39</FileNumber>
|
||||
<FileNumber>48</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -767,7 +973,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>40</FileNumber>
|
||||
<FileNumber>49</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -779,7 +985,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>41</FileNumber>
|
||||
<FileNumber>50</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -791,7 +997,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>42</FileNumber>
|
||||
<FileNumber>51</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -811,7 +1017,7 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>8</GroupNumber>
|
||||
<FileNumber>43</FileNumber>
|
||||
<FileNumber>52</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
||||
@@ -385,6 +385,11 @@
|
||||
<Group>
|
||||
<GroupName>Configs</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>tester_config.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\Core\Tester_main\tester_config.h</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>mylibs_config.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
@@ -401,15 +406,35 @@
|
||||
<FilePath>..\Core\MyLibs\mylibs_include.h</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>tester_config.h</FileName>
|
||||
<FileName>main.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\Core\Tester_main\tester_config.h</FilePath>
|
||||
<FilePath>..\Core\Inc\main.h</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>Tester Main</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>tester_main.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\Core\Tester_main\tester_main.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>tester_main.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\Core\Tester_main\tester_main.h</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>tester_func.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\Core\Tester_main\tester_func.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>tester_func.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\Core\Tester_main\tester_func.h</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>tester_adc_func.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
@@ -420,6 +445,16 @@
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\Core\Tester_main\tester_adc_func.h</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>tester_interface_func.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\Core\Tester_main\tester_interface_func.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>tester_interface_func.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\Core\Tester_main\tester_interface_func.h</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
@@ -485,6 +520,16 @@
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\Core\MyLibs\trackers.h</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>general_gpio.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\Core\MyLibs\general_gpio.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>general_gpio.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\Core\MyLibs\general_gpio.h</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
|
||||
@@ -14,7 +14,7 @@ Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.ADC1.0.Instance=DMA1_Channel1
|
||||
Dma.ADC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
|
||||
Dma.ADC1.0.MemInc=DMA_MINC_ENABLE
|
||||
Dma.ADC1.0.Mode=DMA_CIRCULAR
|
||||
Dma.ADC1.0.Mode=DMA_NORMAL
|
||||
Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
|
||||
Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.ADC1.0.Priority=DMA_PRIORITY_LOW
|
||||
@@ -22,7 +22,7 @@ Dma.ADC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlign
|
||||
Dma.Request0=ADC1
|
||||
Dma.RequestsNb=1
|
||||
File.Version=6
|
||||
GPIO.groupedBy=
|
||||
GPIO.groupedBy=Group By Peripherals
|
||||
KeepUserPlacement=false
|
||||
Mcu.CPN=STM32F103C6T6A
|
||||
Mcu.Family=STM32F1
|
||||
@@ -38,17 +38,30 @@ Mcu.IPNb=8
|
||||
Mcu.Name=STM32F103C(4-6)Tx
|
||||
Mcu.Package=LQFP48
|
||||
Mcu.Pin0=PC13-TAMPER-RTC
|
||||
Mcu.Pin1=PD0-OSC_IN
|
||||
Mcu.Pin10=VP_TIM3_VS_ClockSourceINT
|
||||
Mcu.Pin2=PD1-OSC_OUT
|
||||
Mcu.Pin3=PA0-WKUP
|
||||
Mcu.Pin4=PA9
|
||||
Mcu.Pin5=PA10
|
||||
Mcu.Pin6=PA13
|
||||
Mcu.Pin7=PA14
|
||||
Mcu.Pin8=VP_SYS_VS_Systick
|
||||
Mcu.Pin9=VP_TIM2_VS_ClockSourceINT
|
||||
Mcu.PinsNb=11
|
||||
Mcu.Pin1=PC14-OSC32_IN
|
||||
Mcu.Pin10=PB1
|
||||
Mcu.Pin11=PB10
|
||||
Mcu.Pin12=PB11
|
||||
Mcu.Pin13=PB12
|
||||
Mcu.Pin14=PB13
|
||||
Mcu.Pin15=PB14
|
||||
Mcu.Pin16=PB15
|
||||
Mcu.Pin17=PA9
|
||||
Mcu.Pin18=PA10
|
||||
Mcu.Pin19=PA13
|
||||
Mcu.Pin2=PD0-OSC_IN
|
||||
Mcu.Pin20=PA14
|
||||
Mcu.Pin21=VP_SYS_VS_Systick
|
||||
Mcu.Pin22=VP_TIM2_VS_ClockSourceINT
|
||||
Mcu.Pin23=VP_TIM3_VS_ClockSourceINT
|
||||
Mcu.Pin3=PD1-OSC_OUT
|
||||
Mcu.Pin4=PA0-WKUP
|
||||
Mcu.Pin5=PA3
|
||||
Mcu.Pin6=PA4
|
||||
Mcu.Pin7=PA5
|
||||
Mcu.Pin8=PA6
|
||||
Mcu.Pin9=PB0
|
||||
Mcu.PinsNb=24
|
||||
Mcu.ThirdPartyNb=0
|
||||
Mcu.UserConstants=
|
||||
Mcu.UserName=STM32F103C6Tx
|
||||
@@ -57,6 +70,9 @@ MxDb.Version=DB.6.0.121
|
||||
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.DMA1_Channel1_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
|
||||
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.EXTI3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||
NVIC.EXTI4_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||
NVIC.EXTI9_5_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||
NVIC.ForceEnableDMAVector=true
|
||||
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
@@ -76,10 +92,62 @@ PA13.Mode=Serial_Wire
|
||||
PA13.Signal=SYS_JTMS-SWDIO
|
||||
PA14.Mode=Serial_Wire
|
||||
PA14.Signal=SYS_JTCK-SWCLK
|
||||
PA3.GPIOParameters=GPIO_Label
|
||||
PA3.GPIO_Label=PhaseAHiResponse
|
||||
PA3.Locked=true
|
||||
PA3.Signal=GPXTI3
|
||||
PA4.GPIOParameters=GPIO_Label
|
||||
PA4.GPIO_Label=PhaseALoResponse
|
||||
PA4.Locked=true
|
||||
PA4.Signal=GPXTI4
|
||||
PA5.GPIOParameters=GPIO_Label
|
||||
PA5.GPIO_Label=PhaseBHiResponse
|
||||
PA5.Locked=true
|
||||
PA5.Signal=GPXTI5
|
||||
PA6.GPIOParameters=GPIO_Label
|
||||
PA6.GPIO_Label=PhaseBLoResponse
|
||||
PA6.Locked=true
|
||||
PA6.Signal=GPXTI6
|
||||
PA9.Mode=Asynchronous
|
||||
PA9.Signal=USART1_TX
|
||||
PB0.GPIOParameters=GPIO_Label
|
||||
PB0.GPIO_Label=PhaseAHi
|
||||
PB0.Locked=true
|
||||
PB0.Signal=GPIO_Output
|
||||
PB1.GPIOParameters=GPIO_Label
|
||||
PB1.GPIO_Label=PhaseALo
|
||||
PB1.Locked=true
|
||||
PB1.Signal=GPIO_Output
|
||||
PB10.GPIOParameters=GPIO_Label
|
||||
PB10.GPIO_Label=PhaseBHi
|
||||
PB10.Locked=true
|
||||
PB10.Signal=GPIO_Output
|
||||
PB11.GPIOParameters=GPIO_Label
|
||||
PB11.GPIO_Label=PhaseBLo
|
||||
PB11.Locked=true
|
||||
PB11.Signal=GPIO_Output
|
||||
PB12.GPIOParameters=GPIO_Label
|
||||
PB12.GPIO_Label=PhaseAHiSignal
|
||||
PB12.Locked=true
|
||||
PB12.Signal=GPIO_Output
|
||||
PB13.GPIOParameters=GPIO_Label
|
||||
PB13.GPIO_Label=PhaseALoSignal
|
||||
PB13.Locked=true
|
||||
PB13.Signal=GPIO_Output
|
||||
PB14.GPIOParameters=GPIO_Label
|
||||
PB14.GPIO_Label=PhaseBHiSignal
|
||||
PB14.Locked=true
|
||||
PB14.Signal=GPIO_Output
|
||||
PB15.GPIOParameters=GPIO_Label
|
||||
PB15.GPIO_Label=PhaseBLoSignal
|
||||
PB15.Locked=true
|
||||
PB15.Signal=GPIO_Output
|
||||
PC13-TAMPER-RTC.Locked=true
|
||||
PC13-TAMPER-RTC.Signal=GPIO_Output
|
||||
PC14-OSC32_IN.GPIOParameters=GPIO_PuPd
|
||||
PC14-OSC32_IN.GPIO_PuPd=GPIO_PULLDOWN
|
||||
PC14-OSC32_IN.Locked=true
|
||||
PC14-OSC32_IN.Signal=GPIO_Input
|
||||
PD0-OSC_IN.Mode=HSE-External-Oscillator
|
||||
PD0-OSC_IN.Signal=RCC_OSC_IN
|
||||
PD1-OSC_OUT.Mode=HSE-External-Oscillator
|
||||
@@ -140,9 +208,17 @@ RCC.USBFreq_Value=72000000
|
||||
RCC.VCOOutput2Freq_Value=8000000
|
||||
SH.ADCx_IN0.0=ADC1_IN0,IN0
|
||||
SH.ADCx_IN0.ConfNb=1
|
||||
SH.GPXTI3.0=GPIO_EXTI3
|
||||
SH.GPXTI3.ConfNb=1
|
||||
SH.GPXTI4.0=GPIO_EXTI4
|
||||
SH.GPXTI4.ConfNb=1
|
||||
SH.GPXTI5.0=GPIO_EXTI5
|
||||
SH.GPXTI5.ConfNb=1
|
||||
SH.GPXTI6.0=GPIO_EXTI6
|
||||
SH.GPXTI6.ConfNb=1
|
||||
TIM3.IPParameters=Period,Prescaler,TIM_MasterOutputTrigger
|
||||
TIM3.Period=8999
|
||||
TIM3.Prescaler=0
|
||||
TIM3.Period=65535
|
||||
TIM3.Prescaler=72-1
|
||||
TIM3.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
|
||||
USART1.IPParameters=VirtualMode
|
||||
USART1.VirtualMode=VM_ASYNC
|
||||
|
||||
BIN
docs/SW Timings with HAL GPIO write.sal
Normal file
BIN
docs/SW Timings with HAL GPIO write.sal
Normal file
Binary file not shown.
BIN
docs/SW Timings without HAL GPIO write.sal
Normal file
BIN
docs/SW Timings without HAL GPIO write.sal
Normal file
Binary file not shown.
BIN
docs/mb_adr.xlsx
Normal file
BIN
docs/mb_adr.xlsx
Normal file
Binary file not shown.
Reference in New Issue
Block a user