diff --git a/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.c b/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.c index c8210a1..6c46c76 100644 --- a/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.c +++ b/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.c @@ -250,7 +250,7 @@ void CC_PWM_Ch3_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS) } void CC_PWM_Ch4_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS) { // определяет режим канала - switch (TIMx->CCMR1 & TIM_CCMR1_OC2M) + switch (TIMx->CCMR2 & TIM_CCMR1_OC2M) { case ((TIM_OCMODE_ACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // ACTIVE mode if (abs(TIMx->CNT - TIMx->CCR4) < 2*TIMS->tx_step) diff --git a/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c b/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c index 4107892..4ace5cb 100644 --- a/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c +++ b/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c @@ -43,8 +43,10 @@ void deInitialize_MCU(void) memset(&MCU_CORTEX_MEM, 0, sizeof(MCU_CORTEX_MEM)); memset(&htim1, 0, sizeof(htim1)); - + + ClearStruct(upp); ClearStruct(htim1); + ClearStruct(htim2); ClearStruct(htim3); ClearStruct(htim8); ClearStruct(htim11); @@ -107,7 +109,7 @@ struct TIM_Sim tim14s; void Init_TIM_SIM(void) { #ifdef USE_TIM1 - memset(&tim1s, 0, sizeof(tim1s)); + memset(&tim1s, 0, sizeof(tim1s)); tim1s.tx_cnt = TIM1->CNT; tim1s.tx_step = hmcu.sSimSampleTime * ABP2_TIMS_Value; @@ -121,7 +123,7 @@ void Init_TIM_SIM(void) tim1s.Channels.OC4_PIN_SHIFT = 11; #endif #ifdef USE_TIM2 - memset(&tim2s, 0, sizeof(tim2s)); + memset(&tim2s, 0, sizeof(tim2s)); tim2s.tx_cnt = TIM2->CNT; tim2s.tx_step = hmcu.sSimSampleTime * ABP1_TIMS_Value; @@ -135,7 +137,7 @@ void Init_TIM_SIM(void) tim2s.Channels.OC4_PIN_SHIFT = 3; #endif #ifdef USE_TIM3 - memset(&tim3s, 0, sizeof(tim3s)); + memset(&tim3s, 0, sizeof(tim3s)); tim3s.tx_cnt = TIM3->CNT; tim3s.tx_step = hmcu.sSimSampleTime * ABP1_TIMS_Value; @@ -149,7 +151,7 @@ void Init_TIM_SIM(void) tim3s.Channels.OC4_PIN_SHIFT = 9; #endif #ifdef USE_TIM4 - memset(&tim4s, 0, sizeof(tim4s)); + memset(&tim4s, 0, sizeof(tim4s)); tim4s.tx_cnt = TIM4->CNT; tim4s.tx_step = hmcu.sSimSampleTime * ABP1_TIMS_Value; @@ -163,7 +165,7 @@ void Init_TIM_SIM(void) tim4s.Channels.OC4_PIN_SHIFT = 9; #endif #ifdef USE_TIM5 - memset(&tim5s, 0, sizeof(tim5s)); + memset(&tim5s, 0, sizeof(tim5s)); tim5s.tx_cnt = TIM5->CNT; tim5s.tx_step = hmcu.sSimSampleTime * ABP1_TIMS_Value; @@ -177,7 +179,7 @@ void Init_TIM_SIM(void) tim5s.Channels.OC4_PIN_SHIFT = 3; #endif #ifdef USE_TIM6 - memset(&tim6s, 0, sizeof(tim6s)); + memset(&tim6s, 0, sizeof(tim6s)); tim6s.tx_cnt = TIM6->CNT; tim6s.tx_step = hmcu.sSimSampleTime * ABP1_TIMS_Value; diff --git a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h index e3924e6..8f592c0 100644 --- a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h +++ b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h @@ -79,7 +79,7 @@ * @param _arr_ind_ Индекс выходного порта * @param _val_ind_ Индекс элемента в выходном массиве */ -#define WriteOutputArray(_var_, _arr_ind_, _val_ind_) __WriteOutputArray(Buffer, (float)_var_, _arr_ind_, _val_ind_) +#define WriteOutputArray(_var_, _arr_ind_, _val_ind_) __WriteOutputArray(Buffer, (float)(_var_), _arr_ind_, _val_ind_) /** @brief Считывает значение из входного массива блока S-Function * @param _var_ Значение, которое необходимо записать (будет преобразовано в float) diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index 8b6e497..e627662 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -6,7 +6,9 @@ #include "mcu_wrapper_conf.h" #include "app_wrapper.h" -#define PIN_READ(_verbname_) (_verbname_##_GPIO_Port->ODR & (_verbname_##_Pin)) ? 1 : 0 +float dbg[16]; + +#define PIN_READ(_verbname_) (_verbname_##_GPIO_Port->ODR & (_verbname_##_Pin)) ? 0 : 1 void Write_Thyristors(real_T* Buffer, int ind_port) { @@ -75,11 +77,14 @@ void app_readInputs(const real_T* Buffer) { void app_writeOutputBuffer(real_T* Buffer) { // USER APP OUTPUT START Write_Thyristors(Buffer, 0); + Write_PowerMonitor(Buffer, 1); - WriteOutputArray(TIM2->CNT, 2, 0); - WriteOutputArray(TIM2->CCR1, 2, 1); - + int nn = 0; + WriteOutputArray(upp.hangle.htim->Instance->CNT, 2, nn++); + WriteOutputArray(upp.hangle.htim->Instance->CCR1, 2, nn++); + WriteOutputArray(upp.hangle.htim->Instance->CCR2, 2, nn++); + WriteOutputArray(upp.hangle.htim->Instance->CCR3, 2, nn++); // USER APP OUTPUT END } \ No newline at end of file diff --git a/MATLAB/thyristors.slx b/MATLAB/thyristors.slx deleted file mode 100644 index 3d302ea..0000000 Binary files a/MATLAB/thyristors.slx and /dev/null differ diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index 857c684..d83512b 100644 Binary files a/MATLAB/upp_r2023.slx and b/MATLAB/upp_r2023.slx differ diff --git a/UPP/Core/Configs/mylibs_config.h b/UPP/Core/Configs/mylibs_config.h index cbc013d..89c6755 100644 --- a/UPP/Core/Configs/mylibs_config.h +++ b/UPP/Core/Configs/mylibs_config.h @@ -126,6 +126,7 @@ #else +extern float dbg[16]; #define local_time() uwTick ///< Локальное время //#define INCLUDE_GEN_OPTIMIZER ///< Подключить библиотеку для оптимизации параметров #define INCLUDE_BIT_ACCESS_LIB ///< Подключить библиотеку с typedef с битовыми полями diff --git a/UPP/Core/UPP/pwm_thyristors.c b/UPP/Core/UPP/pwm_thyristors.c index fc6c643..20455c8 100644 --- a/UPP/Core/UPP/pwm_thyristors.c +++ b/UPP/Core/UPP/pwm_thyristors.c @@ -9,7 +9,7 @@ #include "angle_control.h" #include "tim.h" -static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint32_t state); +static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state); /** * @brief Инициализация ШИМ тиристоров. @@ -65,6 +65,7 @@ HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm) HAL_TIM_PWM_Start(&hpwm2, PWM_CHANNEL_5); HAL_TIM_PWM_Start(&hpwm2, PWM_CHANNEL_6); HAL_TIM_Base_Start_IT(&hpwm1); + return HAL_OK; } @@ -79,25 +80,25 @@ HAL_StatusTypeDef PWM_Start(PWM_Handle_t *hpwm, UPP_Phase_t Phase) { if(assert_upp(hpwm)) return HAL_ERROR; - if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) - return HAL_ERROR; // Если канал дурацкий - возвращаем ошибку if(Phase >= 3) { return HAL_ERROR; } + if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) + return HAL_ERROR; switch(hpwm->Phase[Phase]->State) { + case PWM_THYR_DISABLED: case PWM_THYR_TIM_START: case PWM_THYR_TIM_ACTIVE: case PWM_THYR_TIM_DONE: return HAL_BUSY; - - case PWM_THYR_DISABLED: - case PWM_THYR_TIM_WAIT_ZERO: - // переходим в состояние старта ШИМ + + // Запуск только если таймер в режиме ожидания + case PWM_THYR_TIM_WAIT: hpwm->Phase[Phase]->State = PWM_THYR_TIM_START; return HAL_OK; @@ -118,22 +119,22 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_ { if(assert_upp(hpwm)) return HAL_ERROR; - if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) - return HAL_ERROR; // Если канал дурацкий - возвращаем ошибку if(Phase >= 3) { return HAL_ERROR; } + if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) + return HAL_ERROR; - hpwm->Phase[Phase]->State = PWM_THYR_TIM_WAIT_ZERO; + hpwm->Phase[Phase]->State = PWM_THYR_DISABLED; if(force_stop) { - __PWM_SetOutputState(hpwm, Phase, PWM_DISABLE); + __PWM_SetOutputState(hpwm->Phase[Phase], PWM_DISABLE); } - return HAL_ERROR; + return HAL_OK; } /** * @brief Хендл ШИМ тиристоров. @@ -144,45 +145,47 @@ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm) { if(assert_upp(hpwm)) return HAL_ERROR; - - for(int phase = 0; phase < 3; phase++) + + uint8_t phase = 0; + PWM_Channel_t *hPhase = NULL; + + for(int ch = 0; ch < 6; ch++) { - if(!read_bit(hpwm->Config.PhaseMask.all, phase)) + hPhase = &hpwm->AllPhases[ch]; + if (hPhase->htim == NULL) continue; - if (hpwm->Phase[phase] == NULL || hpwm->Phase[phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) - continue; - - switch(hpwm->Phase[phase]->State) + + switch (hPhase->State) { case PWM_THYR_DISABLED: - __PWM_SetOutputState(hpwm, phase, PWM_DISABLE); + __PWM_SetOutputState(hPhase, PWM_DISABLE); break; - - case PWM_THYR_TIM_WAIT_ZERO: - __PWM_SetOutputState(hpwm, phase, PWM_DISABLE); + + case PWM_THYR_TIM_WAIT: + __PWM_SetOutputState(hPhase, PWM_DISABLE); break; - + case PWM_THYR_TIM_START: - __PWM_SetOutputState(hpwm, phase, PWM_ENABLE); - hpwm->Phase[phase]->PulseCnt = hpwm->Config.PulseNumber; - hpwm->Phase[phase]->State = PWM_THYR_TIM_ACTIVE; + __PWM_SetOutputState(hPhase, PWM_ENABLE); + hPhase->PulseCnt = hpwm->Config.PulseNumber; + hPhase->State = PWM_THYR_TIM_ACTIVE; break; - + case PWM_THYR_TIM_ACTIVE: - hpwm->Phase[phase]->PulseCnt--; - if(hpwm->Phase[phase]->PulseCnt <= 0) + hPhase->PulseCnt--; + if (hPhase->PulseCnt <= 0) { - hpwm->Phase[phase]->PulseCnt = 0; - hpwm->Phase[phase]->State = PWM_THYR_TIM_DONE; + hPhase->PulseCnt = 0; + hPhase->State = PWM_THYR_TIM_DONE; } break; - + case PWM_THYR_TIM_DONE: - hpwm->Phase[phase]->State = PWM_THYR_TIM_WAIT_ZERO; + hPhase->State = PWM_THYR_TIM_WAIT; break; - + default: - __PWM_SetOutputState(hpwm, phase, PWM_DISABLE); + __PWM_SetOutputState(hPhase, PWM_DISABLE); break; } } @@ -203,7 +206,8 @@ HAL_StatusTypeDef PWM_SetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase, UPP_Hal // Сбрасываем текущий канал - __PWM_SetOutputState(hpwm, Phase, PWM_DISABLE); + PWM_Stop(hpwm, Phase, 1); + // Если канал дурацкий - выставляем заглушку if(Phase >= 3) { @@ -213,12 +217,14 @@ HAL_StatusTypeDef PWM_SetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase, UPP_Hal // Выставляем канал switch(halfwave) { - case UPP_WAVE_POSITIVE: + case UPP_WAVE_POSITIVE: hpwm->Phase[Phase] = &hpwm->AllPhases[Phase]; + hpwm->Phase[Phase]->State = PWM_THYR_TIM_WAIT; return HAL_OK; case UPP_WAVE_NEGATIVE: hpwm->Phase[Phase] = &hpwm->AllPhases[Phase+3]; + hpwm->Phase[Phase]->State = PWM_THYR_TIM_WAIT; return HAL_OK; default: @@ -234,31 +240,33 @@ HAL_StatusTypeDef PWM_SetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase, UPP_Hal * @param state Какое состояние установить * @return HAL Status. */ -static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint32_t state) +static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state) { - if(hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) + if(hCh == NULL) return HAL_ERROR; + if (hCh->htim == NULL) + return HAL_ERROR; + uint32_t ch_mode = state; - - switch(hpwm->Phase[Phase]->ChMask) + switch(hCh->ChMask) { case TIM_CHANNEL_1: - hpwm->Phase[Phase]->htim->Instance->CCMR1 &= ~TIM_OCMODE_PWM2; - hpwm->Phase[Phase]->htim->Instance->CCMR1 |= ch_mode; + hCh->htim->Instance->CCMR1 &= ~TIM_OCMODE_PWM2; + hCh->htim->Instance->CCMR1 |= ch_mode; break; case TIM_CHANNEL_2: - hpwm->Phase[Phase]->htim->Instance->CCMR1 &= ~(TIM_OCMODE_PWM2 << 8); - hpwm->Phase[Phase]->htim->Instance->CCMR1 |= (ch_mode << 8); + hCh->htim->Instance->CCMR1 &= ~(TIM_OCMODE_PWM2 << 8); + hCh->htim->Instance->CCMR1 |= (ch_mode << 8); break; case TIM_CHANNEL_3: - hpwm->Phase[Phase]->htim->Instance->CCMR2 &= ~TIM_OCMODE_PWM2; - hpwm->Phase[Phase]->htim->Instance->CCMR2 |= ch_mode; + hCh->htim->Instance->CCMR2 &= ~TIM_OCMODE_PWM2; + hCh->htim->Instance->CCMR2 |= ch_mode; break; case TIM_CHANNEL_4: - hpwm->Phase[Phase]->htim->Instance->CCMR2 &= ~(TIM_OCMODE_PWM2 << 8); - hpwm->Phase[Phase]->htim->Instance->CCMR2 |= (ch_mode << 8); + hCh->htim->Instance->CCMR2 &= ~(TIM_OCMODE_PWM2 << 8); + hCh->htim->Instance->CCMR2 |= (ch_mode << 8); break; default: break; @@ -278,14 +286,14 @@ UPP_HalfWave_t PWM_GetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase) { if(assert_upp(hpwm)) return UPP_WAVE_UNKNOWED; - if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) - return UPP_WAVE_UNKNOWED; - // Если канал дурацкий - возвращаем UNKNOWED - if(Phase >= 3) + if (Phase >= 3) { return UPP_WAVE_UNKNOWED; } + if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) + return UPP_WAVE_UNKNOWED; + // Выставляем канал if(hpwm->Phase[Phase] == &hpwm->AllPhases[Phase]) diff --git a/UPP/Core/UPP/pwm_thyristors.h b/UPP/Core/UPP/pwm_thyristors.h index 008f930..fa56447 100644 --- a/UPP/Core/UPP/pwm_thyristors.h +++ b/UPP/Core/UPP/pwm_thyristors.h @@ -46,7 +46,7 @@ do { _hpwm_->Config.Frequency = _freq_; \ */ typedef enum { PWM_THYR_DISABLED = 0, ///< Канал отключен - PWM_THYR_TIM_WAIT_ZERO, ///< Таймер ждет пересечения нуля + PWM_THYR_TIM_WAIT, ///< Таймер ждет команды PWM_THYR_TIM_START, ///< Запуск таймера для ШИМ PWM_THYR_TIM_ACTIVE, ///< Таймер активен и формирует ШИМ PWM_THYR_TIM_DONE ///< Таймер закончил свою работу в полупериоде diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index 729fb6c..a6a3571 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -60,7 +60,7 @@ void UPP_ADC_Handle(void) // Меняем полуволну тиристора UPP_HalfWave_t curr_halfwave = ZC_GetHalfWave(&upp.pm.zc, phase); PWM_SetHalfWave(&upp.hpwm, phase, curr_halfwave); - Angle_Start(&upp.hangle, phase, alpha_dbg, upp.hpwm.Config.Frequency); + Angle_Start(&upp.hangle, phase, alpha_dbg, 100); } } } @@ -76,10 +76,10 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim) UPP_Angle_Handle(); } } - void UPP_Angle_Handle(void) { UPP_Phase_t phase = Angle_Handle(&upp.hangle); + Angle_Reset(&upp.hangle, phase); switch(phase) { case UPP_PHASE_A: