126 lines
4.4 KiB
C
126 lines
4.4 KiB
C
/**
|
||
**************************************************************************
|
||
* @file app_init.h
|
||
* @brief Файл с функциями записи входов/выходов программы МК @ref app_init.
|
||
**************************************************************************/
|
||
#include "mcu_wrapper_conf.h"
|
||
#include "app_wrapper.h"
|
||
|
||
/**
|
||
* @brief Функция для записи входов в приложение МК
|
||
* @param u - массив входных значений
|
||
*/
|
||
void app_readInputs(const real_T* Buffer) {
|
||
// USER APP INPUT START
|
||
// Код для записи считывания входов из IO буфера
|
||
// Буфер в начале хранит входные порты S-Function, далее идут выходные порты:
|
||
// Buffer[0:15] - входной 1 порт, Buffer[16:31] - входной 2 порт,
|
||
// Buffer[32:47] - выходной 1 порт, Buffer[48:63] - выходной 2 порт
|
||
//
|
||
// Note: используте для чтения:
|
||
// val = ReadInputArray(arr_ind, val_ind)
|
||
// Пример:
|
||
// // запись в второй элемент первого массива
|
||
// app_variable = ReadInputArray(0, 1);
|
||
// // чтение из IO буфера напрямую
|
||
// app_variable_2 = Buffer[10];
|
||
|
||
#define detect_front(_in_numb_, _var_, _val_) { \
|
||
if ((Buffer[_in_numb_] > 0.5) && (prev_in[_in_numb_] <= 0.5)) \
|
||
{ \
|
||
_var_ = _val_; \
|
||
} }
|
||
|
||
#define detect_rise(_in_numb_, _var_, _val_) { \
|
||
if ((Buffer[_in_numb_] < 0.5) && (prev_in[_in_numb_] >= 0.5)) \
|
||
{ \
|
||
_var_ = _val_; \
|
||
} }
|
||
|
||
static real_T prev_in[TOTAL_IN_SIZE];
|
||
|
||
detect_front(0, phase_A.zc_detector.f.EXTIZeroCrossDetected, 1);
|
||
detect_rise(0, phase_A.zc_detector.f.EXTIZeroCrossDetected, 1);
|
||
|
||
detect_front(1, phase_B.zc_detector.f.EXTIZeroCrossDetected, 1);
|
||
detect_rise(1, phase_B.zc_detector.f.EXTIZeroCrossDetected, 1);
|
||
|
||
detect_front(2, phase_C.zc_detector.f.EXTIZeroCrossDetected, 1);
|
||
detect_rise(2, phase_C.zc_detector.f.EXTIZeroCrossDetected, 1);
|
||
|
||
detect_front(3, Upp.GoSafe, 1);
|
||
detect_rise(3, Upp.GoSafe, 0);
|
||
|
||
detect_front(4, Upp.Prepare, 1);
|
||
detect_rise(4, Upp.Prepare, 0);
|
||
|
||
detect_front(5, Upp.ForceStop, 1);
|
||
detect_rise(5, Upp.ForceStop, 0);
|
||
|
||
detect_front(6, Upp.ForceDisconnect, 1);
|
||
detect_rise(6, Upp.ForceDisconnect, 0);
|
||
|
||
|
||
Upp.sine_freq = Buffer[7];
|
||
Upp.Duration = Buffer[8];
|
||
|
||
|
||
for (int i = 0; i < TOTAL_IN_SIZE; i++)
|
||
{
|
||
prev_in[i] = Buffer[i];
|
||
}
|
||
// USER APP INPUT END
|
||
}
|
||
|
||
/**
|
||
* @brief Функция для записи выходов приложения МК
|
||
* @param xD - массив буффера выходов(дискретных выходов)
|
||
* @details Используте WriteOutputArray(val, arr_ind, val_ind) для записи
|
||
*/
|
||
void app_writeOutputBuffer(real_T* Buffer) {
|
||
// USER APP OUTPUT START
|
||
// Код для записи выходов в IO буфер
|
||
// Буфер в начале хранит входные порты S-Function, далее идут выходные порты:
|
||
// Buffer[0:15] - входной 1 порт, Buffer[16:31] - входной 2 порт,
|
||
// Buffer[32:47] - выходной 1 порт, Buffer[48:63] - выходной 2 порт
|
||
//
|
||
// Note: используте для записи:
|
||
// WriteOutputArray(val, arr_ind, val_ind)
|
||
// Пример:
|
||
// // запись в второй элемент первого массива
|
||
// WriteOutputArray(app_variable, 0, 1);
|
||
// // запись в IO буфер напрямую
|
||
// Buffer[XD_OUTPUT_START + 10] = app_variable_2;
|
||
|
||
|
||
for (int i = 0; i < 16; i++)
|
||
{
|
||
if (GPIOA->ODR & (1 << i))
|
||
{
|
||
WriteOutputArray(1, 0, i);
|
||
}
|
||
else
|
||
{
|
||
WriteOutputArray(0, 0, i);
|
||
}
|
||
|
||
if (GPIOB->ODR & (1 << i))
|
||
{
|
||
WriteOutputArray(1, 1, i);
|
||
}
|
||
else
|
||
{
|
||
WriteOutputArray(0, 1, i);
|
||
}
|
||
}
|
||
|
||
int var = phase_A.ctrl.angle.delay_us;
|
||
WriteOutputArray(var, 2, 0);
|
||
var = (uint16_t)((uint16_t)TIMER->CNT - phase_A.ctrl.angle.start_delay_tick);
|
||
WriteOutputArray(var, 2, 1);
|
||
var = phase_A.ctrl.angle.start_delay_tick;
|
||
WriteOutputArray(var, 2, 2);
|
||
var = TIMER->CNT;
|
||
WriteOutputArray(var, 2, 3);
|
||
// USER APP OUTPUT END
|
||
} |