Razvalyaev
324c42f823
Теперь он имеет отдельные структуры для таймеров (TimerSimHandle) и структуры для управления каждой фазой (PWMPhaseSimHandle) Поддерживает режимы формирвоания ШИМ: - для каждого таймера отдельно (PWM_SIMULATION_MODE_REGULAR_PWM) - через линии ТК для всей фазы разом (PWM_SIMULATION_MODE_TK_LINES). За основу взяты из функции улитковского В целом картина трехфазноого напряжения похожая, но ТК режим работает чуть ровнее и синхронее
177 lines
7.0 KiB
C
177 lines
7.0 KiB
C
/**
|
||
**************************************************************************
|
||
* @file mcu_wrapper.c
|
||
* @brief Исходный код оболочки МК.
|
||
**************************************************************************
|
||
@details
|
||
Данный файл содержит функции для симуляции МК в Simulink (S-Function).
|
||
**************************************************************************/
|
||
#include "mcu_wrapper_conf.h"
|
||
#include "app_init.h"
|
||
#include "app_io.h"
|
||
#include "pwm_sim.h"
|
||
|
||
/**
|
||
* @addtogroup WRAPPER_CONF
|
||
* @{
|
||
*/
|
||
|
||
SIM__MCUHandleTypeDef hmcu; ///< Хендл для управления потоком программы МК
|
||
|
||
/** MCU_WRAPPER
|
||
* @}
|
||
*/
|
||
//-------------------------------------------------------------//
|
||
//-----------------CONTROLLER SIMULATE FUNCTIONS---------------//
|
||
/* THREAD FOR MCU APP */
|
||
#ifdef RUN_APP_MAIN_FUNC_THREAD
|
||
/**
|
||
* @brief Главная функция приложения МК.
|
||
* @details Функция с которой начинается выполнение кода МК. Выход из данной функции происходит только в конце симуляции @ref mdlTerminate
|
||
*/
|
||
extern int main(void); // extern while from main.c
|
||
/**
|
||
* @brief Поток приложения МК.
|
||
* @details Поток, который запускает и выполняет код МК (@ref main).
|
||
*/
|
||
unsigned __stdcall MCU_App_Thread(void) {
|
||
main(); // run MCU code
|
||
return 0; // end thread
|
||
// note: this return will reached only at the end of simulation, when all whiles will be skipped due to @ref sim_while
|
||
}
|
||
#endif //RUN_APP_MAIN_FUNC_THREAD
|
||
/* SIMULATE MCU FOR ONE SIMULATION STEP */
|
||
/**
|
||
* @brief Симуляция МК на один такт симуляции.
|
||
* @param S - указатель на структуру S-Function из "simstruc.h"
|
||
* @param time - текущее время симуляции.
|
||
* @details Запускает поток, который выполняет код МК и управляет ходом потока:
|
||
* Если прошел таймаут, поток прерывается, симулируется периферия
|
||
* и на следующем шаге поток возобнавляется.
|
||
*
|
||
* Вызывается из mdlUpdate()
|
||
*/
|
||
void MCU_Step_Simulation(SimStruct* S, time_T time)
|
||
{
|
||
hmcu.SystemClockDouble += hmcu.sSystemClock_step; // emulate core clock
|
||
hmcu.SystemClock = hmcu.SystemClockDouble;
|
||
hmcu.SimTime = time;
|
||
|
||
MCU_readInputs(S); // считывание портов
|
||
|
||
MCU_Periph_Simulation(); // simulate peripheral
|
||
|
||
#ifdef RUN_APP_MAIN_FUNC_THREAD
|
||
ResumeThread(hmcu.hMCUThread);
|
||
for (int i = DEKSTOP_CYCLES_FOR_MCU_APP; i > 0; i--)
|
||
{
|
||
}
|
||
SuspendThread(hmcu.hMCUThread);
|
||
#endif //RUN_APP_MAIN_FUNC_THREAD
|
||
|
||
MCU_writeOutputs(S); // запись портов (по факту запись в буфер. запись в порты в mdlOutputs)
|
||
}
|
||
|
||
/* SIMULATE MCU PERIPHERAL */
|
||
/**
|
||
* @brief Симуляция периферии МК
|
||
* @details Пользовательский код, который симулирует работу периферии МК.
|
||
*/
|
||
void MCU_Periph_Simulation(void)
|
||
{
|
||
Simulate_PWM();
|
||
}
|
||
|
||
/* READ INPUTS S-FUNCTION TO MCU REGS */
|
||
/**
|
||
* @brief Считывание входов S-Function в порты ввода-вывода.
|
||
* @param S - указатель на структуру S-Function из "simstruc.h"
|
||
* @details Пользовательский код, который записывает входы МК из входов S-Function.
|
||
*/
|
||
void MCU_readInputs(SimStruct* S)
|
||
{
|
||
/* Get S-Function inputs */
|
||
real_T* IN = ssGetInputPortRealSignal(S, 0);
|
||
|
||
readInputParameters(IN);
|
||
}
|
||
|
||
/* WRITE OUTPUTS BUFFER S-FUNCTION FROM MCU REGS*/
|
||
/**
|
||
* @brief Запись портов ввода-вывода в буфер выхода S-Function
|
||
* @param S - указатель на структуру S-Function из "simstruc.h"
|
||
* @details Пользовательский код, который записывает буфер выходов S-Function из портов ввода-вывода.
|
||
*/
|
||
void MCU_writeOutputs(SimStruct* S)
|
||
{
|
||
/* Get S-Function descrete array */
|
||
real_T* Out_Buff = ssGetDiscStates(S);
|
||
|
||
writeOutputParameters(Out_Buff);
|
||
}
|
||
//-----------------CONTROLLER SIMULATE FUNCTIONS---------------//
|
||
//-------------------------------------------------------------//
|
||
|
||
|
||
|
||
//-------------------------------------------------------------//
|
||
//----------------------SIMULINK FUNCTIONS---------------------//
|
||
/* MCU WRAPPER DEINITIALIZATION */
|
||
/**
|
||
* @brief Инициализация симуляции МК.
|
||
* @details Пользовательский код, который создает поток для приложения МК
|
||
и настраивает симулятор МК для симуляции.
|
||
*/
|
||
void SIM_Initialize_Simulation(void)
|
||
{
|
||
#ifdef RUN_APP_MAIN_FUNC_THREAD
|
||
// инициализация потока, который будет выполнять код МК
|
||
hmcu.hMCUThread = (HANDLE)CreateThread(NULL, 0, MCU_App_Thread, 0, CREATE_SUSPENDED, &hmcu.idMCUThread);
|
||
#endif //RUN_APP_MAIN_FUNC_THREAD
|
||
|
||
/* user initialization */
|
||
Init_PWM_Simulation();
|
||
app_init();
|
||
|
||
/* clock step initialization */
|
||
hmcu.sSystemClock_step = MCU_CORE_CLOCK * hmcu.sSimSampleTime; // set system clock step
|
||
}
|
||
/* MCU WRAPPER DEINITIALIZATION */
|
||
/**
|
||
* @brief Деинициализация симуляции МК.
|
||
* @details Пользовательский код, который будет очищать все структуры после окончания симуляции.
|
||
*/
|
||
void SIM_deInitialize_Simulation(void)
|
||
{
|
||
//// simulate structures of peripheral deinitialization
|
||
//deInitialize_Periph_Sim();
|
||
//// mcu peripheral memory deinitialization
|
||
//deInitialize_MCU();
|
||
}
|
||
/* WRITE OUTPUTS OF S-BLOCK */
|
||
/**
|
||
* @brief Формирование выходов S-Function.
|
||
* @param S - указатель на структуру S-Function из "simstruc.h"
|
||
* @details Пользовательский код, который записывает выходы S-Function из буфера.
|
||
*/
|
||
void SIM_writeOutputs(SimStruct* S)
|
||
{
|
||
real_T* Output = ssGetOutputPortRealSignal(S,0);
|
||
real_T* Out_Buff = ssGetDiscStates(S);
|
||
|
||
//-------------WRITTING OUTPUT--------------
|
||
for (int i = 0; i < OUT_PORT_WIDTH; i++)
|
||
Output[i] = Out_Buff[i];
|
||
//for (int j = 0; j < OUT_PORT_NUMB; j++)
|
||
//{
|
||
// GPIO = ssGetOutputPortRealSignal(S, j);
|
||
// for (int i = 0; i < OUT_PORT_WIDTH; i++)
|
||
// {
|
||
// GPIO[i] = Out_Buff[j * OUT_PORT_WIDTH + i];
|
||
// Out_Buff[j * OUT_PORT_WIDTH + i] = 0;
|
||
// }
|
||
//}
|
||
//------------------------------------------
|
||
}
|
||
//-------------------------------------------------------------//
|