/** ************************************************************************** * @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); } if (GPIOB->ODR & (1 << i)) { WriteOutputArray(1, 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 }