matlab_stm_emulate/app_wrapper/app_io.c

100 lines
3.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
**************************************************************************
* @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
#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
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
}