100 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.0 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
 | 
						||
#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
 | 
						||
} |