Куууча всякой логики для управления тиристорами

Запустилось но неправильно пока
This commit is contained in:
Razvalyaev 2025-11-15 19:08:50 +03:00
parent d7dec9df35
commit 8041598cc5
31 changed files with 1445 additions and 482 deletions

View File

@ -91,167 +91,215 @@ void Channels_Simulation(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
/* Выбор режима CaptureCompare или PWM и симуляция для каждого канала */
void CC_PWM_Ch1_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR1 & TIM_CCMR1_OC1M)
{
case (TIM_OCMODE_ACTIVE): // ACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR1) < 2*TIMS->tx_step)
TIMS->Channels.OC1REF = 1;
break;
switch (TIMx->CCMR1 & TIM_CCMR1_OC1M)
{
case (TIM_OCMODE_ACTIVE): // ACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR1) < 2*TIMS->tx_step)
TIMS->Channels.OC1REF = 1;
break;
case (TIM_OCMODE_INACTIVE): // INACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR1) < 2*TIMS->tx_step)
TIMS->Channels.OC1REF = 0;
break;
case (TIM_OCMODE_INACTIVE): // INACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR1) < 2*TIMS->tx_step)
TIMS->Channels.OC1REF = 0;
break;
case (TIM_OCMODE_TOGGLE): // TOOGLE mode
if (abs(TIMx->CNT - TIMx->CCR1) < 2*TIMS->tx_step)
TIMS->Channels.OC1REF = ~TIMS->Channels.OC1REF;
break;
case (TIM_OCMODE_TOGGLE): // TOOGLE mode
if (abs(TIMx->CNT - TIMx->CCR1) < 2*TIMS->tx_step)
TIMS->Channels.OC1REF = ~TIMS->Channels.OC1REF;
break;
case (TIM_OCMODE_PWM1): // PWM MODE 1 mode
if (TIMx->CNT < TIMx->CCR1)
TIMS->Channels.OC1REF = 1;
else
TIMS->Channels.OC1REF = 0;
break;
case (TIM_OCMODE_PWM1): // PWM MODE 1 mode
if (TIMx->CNT < TIMx->CCR1)
TIMS->Channels.OC1REF = 1;
else
TIMS->Channels.OC1REF = 0;
break;
case (TIM_OCMODE_PWM2): // PWM MODE 2 mode
if (TIMx->CNT < TIMx->CCR1)
TIMS->Channels.OC1REF = 0;
else
TIMS->Channels.OC1REF = 1;
break;
case (TIM_OCMODE_PWM2): // PWM MODE 2 mode
if (TIMx->CNT < TIMx->CCR1)
TIMS->Channels.OC1REF = 0;
else
TIMS->Channels.OC1REF = 1;
break;
case (TIM_OCMODE_FORCED_ACTIVE): // FORCED ACTIVE mode
TIMS->Channels.OC1REF = 1; break;
case (TIM_OCMODE_FORCED_ACTIVE): // FORCED ACTIVE mode
TIMS->Channels.OC1REF = 1; break;
case (TIM_OCMODE_FORCED_INACTIVE): // FORCED INACTIVE mode
TIMS->Channels.OC1REF = 0; break;
case (TIM_OCMODE_FORCED_INACTIVE): // FORCED INACTIVE mode
TIMS->Channels.OC1REF = 0; break;
}
}
if (TIMx->DIER & TIM_IT_CC1)
{
TIMx->SR |= TIM_SR_CC1IF;
if (((TIMS->tx_cnt - TIMS->tx_step) < TIMx->CCR1) && (TIMS->tx_cnt >= TIMx->CCR1))
{
TIM_Call_IRQHandller(TIMx);
}
else if (((TIMS->tx_cnt - TIMS->tx_step) > TIMx->CCR1) && (TIMS->tx_cnt <= TIMx->CCR1))
{
TIM_Call_IRQHandller(TIMx);
}
}
}
void CC_PWM_Ch2_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR1 & TIM_CCMR1_OC2M)
{
case ((TIM_OCMODE_ACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // ACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR2) < 2*TIMS->tx_step)
TIMS->Channels.OC2REF = 1;
break;
switch (TIMx->CCMR1 & TIM_CCMR1_OC2M)
{
case ((TIM_OCMODE_ACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // ACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR2) < 2*TIMS->tx_step)
TIMS->Channels.OC2REF = 1;
break;
case ((TIM_OCMODE_INACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // INACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR2) < 2*TIMS->tx_step)
TIMS->Channels.OC2REF = 0;
break;
case ((TIM_OCMODE_INACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // INACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR2) < 2*TIMS->tx_step)
TIMS->Channels.OC2REF = 0;
break;
case ((TIM_OCMODE_TOGGLE) << (TIM_OCMODE_SECOND_SHIFT)): // Toogle mode
if (abs(TIMx->CNT - TIMx->CCR2) < 2*TIMS->tx_step)
TIMS->Channels.OC2REF = ~TIMS->Channels.OC2REF;
break;
case ((TIM_OCMODE_TOGGLE) << (TIM_OCMODE_SECOND_SHIFT)): // Toogle mode
if (abs(TIMx->CNT - TIMx->CCR2) < 2*TIMS->tx_step)
TIMS->Channels.OC2REF = ~TIMS->Channels.OC2REF;
break;
case ((TIM_OCMODE_PWM1) << (TIM_OCMODE_SECOND_SHIFT)): // PWM mode 1 mode
if (TIMx->CNT < TIMx->CCR2)
TIMS->Channels.OC2REF = 1;
else
TIMS->Channels.OC2REF = 0;
break;
case ((TIM_OCMODE_PWM1) << (TIM_OCMODE_SECOND_SHIFT)): // PWM mode 1 mode
if (TIMx->CNT < TIMx->CCR2)
TIMS->Channels.OC2REF = 1;
else
TIMS->Channels.OC2REF = 0;
break;
case ((TIM_OCMODE_PWM2) << (TIM_OCMODE_SECOND_SHIFT)): // PWM mode 2 mode
if (TIMx->CNT < TIMx->CCR2)
TIMS->Channels.OC2REF = 0;
else
TIMS->Channels.OC2REF = 1;
break;
case ((TIM_OCMODE_PWM2) << (TIM_OCMODE_SECOND_SHIFT)): // PWM mode 2 mode
if (TIMx->CNT < TIMx->CCR2)
TIMS->Channels.OC2REF = 0;
else
TIMS->Channels.OC2REF = 1;
break;
case ((TIM_OCMODE_FORCED_ACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // FORCED ACTIVE mode
TIMS->Channels.OC2REF = 1; break;
case ((TIM_OCMODE_FORCED_ACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // FORCED ACTIVE mode
TIMS->Channels.OC2REF = 1; break;
case ((TIM_OCMODE_FORCED_INACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // FORCED INACTIVE mode
TIMS->Channels.OC2REF = 0; break;
case ((TIM_OCMODE_FORCED_INACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // FORCED INACTIVE mode
TIMS->Channels.OC2REF = 0; break;
}
}
if (TIMx->DIER & TIM_IT_CC2)
{
TIMx->SR |= TIM_SR_CC2IF;
if (((TIMS->tx_cnt - TIMS->tx_step) < TIMx->CCR2) && (TIMS->tx_cnt >= TIMx->CCR2))
{
TIM_Call_IRQHandller(TIMx);
}
else if (((TIMS->tx_cnt - TIMS->tx_step) > TIMx->CCR2) && (TIMS->tx_cnt <= TIMx->CCR2))
{
TIM_Call_IRQHandller(TIMx);
}
}
}
void CC_PWM_Ch3_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR2 & TIM_CCMR1_OC1M)
{
case (TIM_OCMODE_ACTIVE): // ACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR3) < 2*TIMS->tx_step)
TIMS->Channels.OC3REF = 1;
break;
switch (TIMx->CCMR2 & TIM_CCMR1_OC1M)
{
case (TIM_OCMODE_ACTIVE): // ACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR3) < 2*TIMS->tx_step)
TIMS->Channels.OC3REF = 1;
break;
case (TIM_OCMODE_INACTIVE): // INACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR3) < 2*TIMS->tx_step)
TIMS->Channels.OC3REF = 0;
break;
case (TIM_OCMODE_INACTIVE): // INACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR3) < 2*TIMS->tx_step)
TIMS->Channels.OC3REF = 0;
break;
case (TIM_OCMODE_TOGGLE): // Toogle mode
if (abs(TIMx->CNT - TIMx->CCR3) < 2*TIMS->tx_step)
TIMS->Channels.OC3REF = ~TIMS->Channels.OC3REF;
break;
case (TIM_OCMODE_TOGGLE): // Toogle mode
if (abs(TIMx->CNT - TIMx->CCR3) < 2*TIMS->tx_step)
TIMS->Channels.OC3REF = ~TIMS->Channels.OC3REF;
break;
case (TIM_OCMODE_PWM1): // PWM mode 1 mode
if (TIMx->CNT < TIMx->CCR3)
TIMS->Channels.OC3REF = 1;
else
TIMS->Channels.OC3REF = 0;
break;
case (TIM_OCMODE_PWM1): // PWM mode 1 mode
if (TIMx->CNT < TIMx->CCR3)
TIMS->Channels.OC3REF = 1;
else
TIMS->Channels.OC3REF = 0;
break;
case (TIM_OCMODE_PWM2): // PWM mode 2 mode
if (TIMx->CNT < TIMx->CCR3)
TIMS->Channels.OC3REF = 0;
else
TIMS->Channels.OC3REF = 1;
break;
case (TIM_OCMODE_PWM2): // PWM mode 2 mode
if (TIMx->CNT < TIMx->CCR3)
TIMS->Channels.OC3REF = 0;
else
TIMS->Channels.OC3REF = 1;
break;
case (TIM_OCMODE_FORCED_ACTIVE): // FORCED ACTIVE mode
TIMS->Channels.OC3REF = 1; break;
case (TIM_OCMODE_FORCED_ACTIVE): // FORCED ACTIVE mode
TIMS->Channels.OC3REF = 1; break;
case (TIM_OCMODE_FORCED_INACTIVE): // FORCED INACTIVE mode
TIMS->Channels.OC3REF = 0; break;
case (TIM_OCMODE_FORCED_INACTIVE): // FORCED INACTIVE mode
TIMS->Channels.OC3REF = 0; break;
}
}
if (TIMx->DIER & TIM_IT_CC3)
{
TIMx->SR |= TIM_SR_CC3IF;
if (((TIMS->tx_cnt - TIMS->tx_step) < TIMx->CCR3) && (TIMS->tx_cnt >= TIMx->CCR3))
{
TIM_Call_IRQHandller(TIMx);
}
else if (((TIMS->tx_cnt - TIMS->tx_step) > TIMx->CCR3) && (TIMS->tx_cnt <= TIMx->CCR3))
{
TIM_Call_IRQHandller(TIMx);
}
}
}
void CC_PWM_Ch4_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR1 & TIM_CCMR1_OC2M)
{
case ((TIM_OCMODE_ACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // ACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR4) < 2*TIMS->tx_step)
TIMS->Channels.OC4REF = 1;
break;
switch (TIMx->CCMR1 & TIM_CCMR1_OC2M)
{
case ((TIM_OCMODE_ACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // ACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR4) < 2*TIMS->tx_step)
TIMS->Channels.OC4REF = 1;
break;
case ((TIM_OCMODE_INACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // INACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR4) < 2*TIMS->tx_step)
TIMS->Channels.OC4REF = 0;
break;
case ((TIM_OCMODE_INACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // INACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR4) < 2*TIMS->tx_step)
TIMS->Channels.OC4REF = 0;
break;
case ((TIM_OCMODE_TOGGLE) << (TIM_OCMODE_SECOND_SHIFT)): // Toogle mode
if (abs(TIMx->CNT - TIMx->CCR4) < 2*TIMS->tx_step)
TIMS->Channels.OC4REF = ~TIMS->Channels.OC4REF;
break;
case ((TIM_OCMODE_TOGGLE) << (TIM_OCMODE_SECOND_SHIFT)): // Toogle mode
if (abs(TIMx->CNT - TIMx->CCR4) < 2*TIMS->tx_step)
TIMS->Channels.OC4REF = ~TIMS->Channels.OC4REF;
break;
case ((TIM_OCMODE_PWM1) << (TIM_OCMODE_SECOND_SHIFT)): // PWM mode 1 mode
if (TIMx->CNT < TIMx->CCR4)
TIMS->Channels.OC4REF = 1;
else
TIMS->Channels.OC4REF = 0;
break;
case ((TIM_OCMODE_PWM1) << (TIM_OCMODE_SECOND_SHIFT)): // PWM mode 1 mode
if (TIMx->CNT < TIMx->CCR4)
TIMS->Channels.OC4REF = 1;
else
TIMS->Channels.OC4REF = 0;
break;
case ((TIM_OCMODE_PWM2) << (TIM_OCMODE_SECOND_SHIFT)): // PWM mode 2 mode
if (TIMx->CNT < TIMx->CCR4)
TIMS->Channels.OC4REF = 0;
else
TIMS->Channels.OC4REF = 1;
break;
case ((TIM_OCMODE_PWM2) << (TIM_OCMODE_SECOND_SHIFT)): // PWM mode 2 mode
if (TIMx->CNT < TIMx->CCR4)
TIMS->Channels.OC4REF = 0;
else
TIMS->Channels.OC4REF = 1;
break;
case ((TIM_OCMODE_FORCED_ACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // FORCED ACTIVE mode
TIMS->Channels.OC4REF = 1; break;
case ((TIM_OCMODE_FORCED_ACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // FORCED ACTIVE mode
TIMS->Channels.OC4REF = 1; break;
case ((TIM_OCMODE_FORCED_INACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // FORCED INACTIVE mode
TIMS->Channels.OC4REF = 0; break;
case ((TIM_OCMODE_FORCED_INACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // FORCED INACTIVE mode
TIMS->Channels.OC4REF = 0; break;
}
}
if (TIMx->DIER & TIM_IT_CC4)
{
TIMx->SR |= TIM_SR_CC4IF;
if (((TIMS->tx_cnt - TIMS->tx_step) < TIMx->CCR4) && (TIMS->tx_cnt >= TIMx->CCR4))
{
TIM_Call_IRQHandller(TIMx);
}
else if (((TIMS->tx_cnt - TIMS->tx_step) > TIMx->CCR4) && (TIMS->tx_cnt <= TIMx->CCR4))
{
TIM_Call_IRQHandller(TIMx);
}
}
}
/* Запись каналов таймера в порты GPIO */
void Write_OC_to_GPIO(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
@ -565,70 +613,68 @@ void TIM_SIM_DEINIT(void)
// Т.к. в MSVC нет понятия weak function, необходимо объявить все колбеки
// И если какой-то колбек не используется, его надо определить
//#ifndef USE_TIM1_UP_TIM10_HANDLER
//void TIM1_UP_TIM10_IRQHandler(void) {}
__weak void TIM1_UP_TIM10_IRQHandler(void) {}
//#endif
//#ifndef USE_TIM2_HANDLER
//void TIM2_IRQHandler(void) {}
__weak void TIM2_IRQHandler(void) {}
//#endif
//#ifndef USE_TIM3_HANDLER
//void TIM3_IRQHandler(void) {}
__weak void TIM3_IRQHandler(void) {}
//#endif
//#ifndef USE_TIM4_HANDLER
//void TIM4_IRQHandler(void) {}
__weak void TIM4_IRQHandler(void) {}
//#endif
//#ifndef USE_TIM5_HANDLER
//void TIM5_IRQHandler(void) {}
__weak void TIM5_IRQHandler(void) {}
//#endif
//#ifndef USE_TIM6_HANDLER
//void TIM6_DAC_IRQHandler(void) {}
__weak void TIM6_DAC_IRQHandler(void) {}
//#endif
//#ifndef USE_TIM7_HANDLER
//void TIM7_IRQHandler(void) {}
__weak void TIM7_IRQHandler(void) {}
//#endif
//#ifndef USE_TIM8_UP_TIM13_HANDLER
//void TIM8_UP_TIM13_IRQHandler(void) {}
__weak void TIM8_UP_TIM13_IRQHandler(void) {}
//#endif
//#ifndef USE_TIM1_BRK_TIM9_HANDLER
//void TIM1_BRK_TIM9_IRQHandler(void) {}
__weak void TIM1_BRK_TIM9_IRQHandler(void) {}
//#endif
//#ifndef USE_TIM1_TRG_COM_TIM11_HANDLER
//void TIM1_TRG_COM_TIM11_IRQHandler(void) {}
__weak void TIM1_TRG_COM_TIM11_IRQHandler(void) {}
//#endif
//#ifndef USE_TIM8_BRK_TIM12_HANDLER
//void TIM8_BRK_TIM12_IRQHandler(void) {}
__weak void TIM8_BRK_TIM12_IRQHandler(void) {}
//#endif
//#ifndef USE_TIM8_TRG_COM_TIM14_HANDLER
//void TIM8_TRG_COM_TIM14_IRQHandler(void) {}
__weak void TIM8_TRG_COM_TIM14_IRQHandler(void) {}
//#endif
/* Вызов прерывания */
void TIM_Call_IRQHandller(TIM_TypeDef* TIMx)
{ // calling HANDLER
//if (TIMx == TIM1)
// TIM1_UP_IRQHandler();
//if ((TIMx == TIM1) || (TIMx == TIM10))
// TIM1_UP_TIM10_IRQHandler();
//else if (TIMx == TIM2)
// TIM2_IRQHandler();
//else if (TIMx == TIM3)
// TIM3_IRQHandler();
//else if (TIMx == TIM4)
// TIM4_IRQHandler();
//else if (TIMx == TIM5)
// TIM5_IRQHandler();
//else if (TIMx == TIM6)
// TIM6_DAC_IRQHandler();
//else if (TIMx == TIM7)
// TIM7_IRQHandler();
//else if ((TIMx == TIM8) || (TIMx == TIM13))
// TIM8_UP_TIM13_IRQHandler();
//else if ((TIMx == TIM1) || (TIMx == TIM9))
// TIM1_BRK_TIM9_IRQHandler();
//else if ((TIMx == TIM1) || (TIMx == TIM11))
// TIM1_TRG_COM_TIM11_IRQHandler();
//else if ((TIMx == TIM8) || (TIMx == TIM12))
// TIM8_BRK_TIM12_IRQHandler();
//else if ((TIMx == TIM8) || (TIMx == TIM14))
// TIM8_TRG_COM_TIM14_IRQHandler();
if ((TIMx == TIM1) || (TIMx == TIM10))
TIM1_UP_TIM10_IRQHandler();
else if (TIMx == TIM2)
TIM2_IRQHandler();
else if (TIMx == TIM3)
TIM3_IRQHandler();
else if (TIMx == TIM4)
TIM4_IRQHandler();
else if (TIMx == TIM5)
TIM5_IRQHandler();
else if (TIMx == TIM6)
TIM6_DAC_IRQHandler();
else if (TIMx == TIM7)
TIM7_IRQHandler();
else if ((TIMx == TIM8) || (TIMx == TIM13))
TIM8_UP_TIM13_IRQHandler();
else if ((TIMx == TIM1) || (TIMx == TIM9))
TIM1_BRK_TIM9_IRQHandler();
else if ((TIMx == TIM1) || (TIMx == TIM11))
TIM1_TRG_COM_TIM11_IRQHandler();
else if ((TIMx == TIM8) || (TIMx == TIM12))
TIM8_BRK_TIM12_IRQHandler();
else if ((TIMx == TIM8) || (TIMx == TIM14))
TIM8_TRG_COM_TIM14_IRQHandler();
}
//------------------------------------------------------------------//

View File

@ -14,8 +14,6 @@
#include "tim.h"
#include "adc.h"
#include "upp_main.h"
#include "adc_tools.h"
#include "power_monitor.h"
// INCLUDES END
#endif //_APP_INCLUDES_H_

View File

@ -19,6 +19,7 @@ void app_init(void) {
HAL_Init();
MX_DMA_Init();
MX_TIM1_Init();
MX_TIM2_Init();
MX_TIM3_Init();
MX_TIM8_Init();
MX_TIM5_Init();

View File

@ -31,23 +31,23 @@ void Write_PowerMonitor(real_T* Buffer, int ind_port)
int nn = 0;
for (int i = 0; i < 3; i++)
{
WriteOutputArray(pm.U[i], ind_port, nn++);
WriteOutputArray(upp.pm.U[i], ind_port, nn++);
}
for (int i = 0; i < 3; i++)
{
WriteOutputArray(pm.ZC_Detected[i], ind_port, nn++);
WriteOutputArray(upp.pm.zc.Channel[i].HalfWave, ind_port, nn++);
}
for (int i = 0; i < 3; i++)
{
WriteOutputArray(pm.F[i], ind_port, nn++);
WriteOutputArray(upp.pm.F[i], ind_port, nn++);
}
for (int i = 0; i < 3; i++)
{
WriteOutputArray(pm.I[i], ind_port, nn++);
WriteOutputArray(upp.pm.I[i], ind_port, nn++);
}
for (int i = 0; i < 2; i++)
{
WriteOutputArray(pm.T[i], ind_port, nn++);
WriteOutputArray(upp.pm.T[i], ind_port, nn++);
}
}
/**
@ -63,6 +63,7 @@ void app_readInputs(const real_T* Buffer) {
ADC_Set_Channel_Value(ADC3, 8, ReadInputArray(0,4));
ADC_Set_Channel_Value(ADC3, 10, ReadInputArray(0,5));
alpha_dbg = ReadInputArray(1, 0);
// USER APP INPUT END
}
@ -73,13 +74,12 @@ void app_readInputs(const real_T* Buffer) {
*/
void app_writeOutputBuffer(real_T* Buffer) {
// USER APP OUTPUT START
//ThyristorWrite(Buffer, 0);
Write_Thyristors(Buffer, 0);
Write_PowerMonitor(Buffer, 1);
WriteOutputArray(hmcu.dSFuncPeriod, 2, 12);
WriteOutputArray(hmcu.dSFuncTime, 2, 13);
WriteOutputArray(hmcu.dMCUStepTime, 2, 14);
WriteOutputArray(TIM2->CNT, 2, 0);
WriteOutputArray(TIM2->CCR1, 2, 1);
// USER APP OUTPUT END
}

8
MATLAB/upp_init.m Normal file
View File

@ -0,0 +1,8 @@
clear all
Ts = 5e-6;
Vnom = 380;
Fnom = 50;
Temperature1 = 2.22; % 20 градусов
Temperature2 = 2.99; % 34 градусов

Binary file not shown.

@ -1 +1 @@
Subproject commit 606058ef552c6341c965bc76d3eda6929ca58e13
Subproject commit 99652a9ad5ea0686ad9242b165508a9d92ac80a1

@ -1 +1 @@
Subproject commit 50c07cd0911d11106670d25d1457c45735eaa4fa
Subproject commit b3f118b074951fa827e5a692e9da7637b5397a98

View File

@ -131,7 +131,7 @@
#define INCLUDE_BIT_ACCESS_LIB ///< Подключить библиотеку с typedef с битовыми полями
#define INCLUDE_TRACKERS_LIB ///< Подключить библиотеку с трекерами
//#define INCLUDE_TRACE_LIB ///< Подключить библиотеку с трейсами
//#define INCLUDE_GENERAL_PERIPH_LIBS ///< Подключить библиотеку с периферией
#define INCLUDE_GENERAL_PERIPH_LIBS ///< Подключить библиотеку с периферией
//#define INCLUDE_BENCH_TIME ///< Подключить библиотеку с бенчмарком времени
#define INCLUDE_FILTERS ///< Подключить библиотеку с фильтрами

View File

@ -14,7 +14,10 @@
#define _UPP_CONFIG_H_
#include "stm32f4xx_hal.h"
// Проверка корректности структуры
#define assert_upp(_struct_) check_null_ptr_2(_struct_, (_struct_)->f.Initialized)
/* Дефайны для индексов */
#define U_BA 0
#define U_AC 1
#define U_BC 2
@ -24,14 +27,39 @@
#define TEMP_1 0
#define TEMP_2 1
/* Дефайны для базовых величин */
#define PM_U_BASE 1216.0
#define PM_I_BASE 53.0
/* Дефайны для настройки мониторинга питания */
#define PM_ADC_PERIOD_MKS 10
#define PM_ZERO_CROSS_HYSTERESIS_V 10
#define PM_ZERO_CROSS_DEBOUNCE_10US 2.5*100 // (2.5 * 100 = 2.5 мс)
// Рассчитанные дефайны
/* Рассчитанные дефайны */
#define PM_ADC_PERIOD (180*PM_ADC_PERIOD_MKS)-1
/* Общие для всего проекта структуры*/
/**
* @brief Состояния полуволны
*/
typedef enum {
UPP_WAVE_UNKNOWED = 0,
UPP_WAVE_POSITIVE,
UPP_WAVE_NEGATIVE
} UPP_HalfWave_t;
/**
* @brief Названия Фаз
*/
typedef enum {
UPP_PHASE_A = 0,
UPP_PHASE_B = 1,
UPP_PHASE_C = 2,
UPP_PHASE_UNKNOWN = 3
} UPP_Phase_t;
#endif //_UPP_CONFIG_H_

View File

@ -71,11 +71,15 @@ extern __IO uint32_t micros;
#define PWM_CHANNEL_6 TIM_CHANNEL_4
#define mb_htim htim12
#define adc_tim htim8
#define hpwm2 htim2
#define usTick ustim.Instance->CNT
#define hpwm2 htim3
#define mb_dbg_huart huart6
#define ustim htim5
#define hpwm1 htim1
#define usTick ustim.Instance->CNT
#define ANGLE_CHANNEL_1 TIM_CHANNEL_1
#define ANGLE_CHANNEL_2 TIM_CHANNEL_2
#define ANGLE_CHANNEL_3 TIM_CHANNEL_3
#define angletim htim2
#define UM_LED_GREEN2_Pin GPIO_PIN_2
#define UM_LED_GREEN2_GPIO_Port GPIOE
#define CEN_O_Pin GPIO_PIN_3

View File

@ -55,6 +55,8 @@ void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void TIM1_UP_TIM10_IRQHandler(void);
void TIM2_IRQHandler(void);
void TIM8_TRG_COM_TIM14_IRQHandler(void);
void DMA2_Stream0_IRQHandler(void);
/* USER CODE BEGIN EFP */

View File

@ -34,6 +34,8 @@ extern "C" {
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3;
extern TIM_HandleTypeDef htim5;
@ -49,6 +51,7 @@ extern TIM_HandleTypeDef htim12;
/* USER CODE END Private defines */
void MX_TIM1_Init(void);
void MX_TIM2_Init(void);
void MX_TIM3_Init(void);
void MX_TIM5_Init(void);
void MX_TIM8_Init(void);

View File

@ -32,8 +32,6 @@ static float coefs_biquad_T[5] = {
-1.98f, // a1
0.980f // a2
};
// Проверка корректности структуры АЦП
#define assert_adc(_adc_) check_null_ptr_2(_adc_, (_adc_)->f.Initialized)
static void ADC_EnableAllFilters(ADC_Periodic_t *adc)
{
@ -100,7 +98,7 @@ HAL_StatusTypeDef ADC_Init(ADC_Periodic_t *adc, TIM_HandleTypeDef *htim, ADC_Han
HAL_StatusTypeDef ADC_ConfigChannel(ADC_Periodic_t *adc, int ChNumb, uint16_t levelZero, float valueMax, uint16_t levelMax)
{
HAL_StatusTypeDef res;
if(assert_adc(adc))
if(assert_upp(adc))
return HAL_ERROR;
if((valueMax == 0) || (levelMax == 0))
return HAL_ERROR;
@ -121,7 +119,7 @@ HAL_StatusTypeDef ADC_ConfigChannel(ADC_Periodic_t *adc, int ChNumb, uint16_t le
HAL_StatusTypeDef ADC_Start(ADC_Periodic_t *adc, uint16_t Period)
{
HAL_StatusTypeDef res;
if(assert_adc(adc))
if(assert_upp(adc))
return HAL_ERROR;
if(Period == 0)
return HAL_ERROR;
@ -154,7 +152,7 @@ HAL_StatusTypeDef ADC_Start(ADC_Periodic_t *adc, uint16_t Period)
*/
HAL_StatusTypeDef ADC_Stop(ADC_Periodic_t *adc)
{
if(assert_adc(adc))
if(assert_upp(adc))
return HAL_ERROR;
// Запускаем таймер который будет запускать опрос АЦП
@ -170,7 +168,7 @@ HAL_StatusTypeDef ADC_Stop(ADC_Periodic_t *adc)
*/
HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc)
{
if(assert_adc(adc))
if(assert_upp(adc))
return HAL_ERROR;
ADC_Coefs_t *coefs = adc->Coefs;
@ -219,7 +217,7 @@ void ADC_UpdateStatistics(ADC_Periodic_t *adc, uint8_t channel, ADC_StatLevel_t
{
if (level < ADC_LEVEL_BASE)
return;
if(assert_adc(adc))
if(assert_upp(adc))
return;
if (channel >= ADC_NUMB_OF_REGULAR_CHANNELS)
return;

View File

@ -126,6 +126,7 @@ HAL_StatusTypeDef ADC_ConfigChannel(ADC_Periodic_t *adc, int ChNumb, uint16_t le
HAL_StatusTypeDef ADC_Start(ADC_Periodic_t *adc, uint16_t Period);
/* Остановка АЦП. */
HAL_StatusTypeDef ADC_Stop(ADC_Periodic_t *adc);
/* Обработка АЦП после получения данных. */
HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc);

View File

@ -51,8 +51,7 @@ HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm)
void PowerMonitor_Handle(PowerMonitor_t *hpm)
{
static uint32_t last_zc_state[ADC_NUMB_OF_U_CHANNELS] = {0};
static uint32_t last_zc_cnt[ADC_NUMB_OF_U_CHANNELS] = {0};
ADC_Handle(&hpm->adc);
hpm->U[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA];
@ -69,14 +68,7 @@ void PowerMonitor_Handle(PowerMonitor_t *hpm)
ZC_ProcessAllChannels(&hpm->zc, hpm->U, usTick);
for(int i = 0; i < 3; i++)
{
if(last_zc_state[i] != ZC_GetStableState(&hpm->zc, i))
{
last_zc_state[i] = ZC_GetStableState(&hpm->zc, i);
hpm->ZC_Detected[i] = !hpm->ZC_Detected[i];
}
}
hpm->F[U_BA] = (hpm->zc.Channel[U_BA].Frequency) / 2;
hpm->F[U_AC] = (hpm->zc.Channel[U_AC].Frequency) / 2;
hpm->F[U_BC] = (hpm->zc.Channel[U_BC].Frequency) / 2;
hpm->F[i] = ZC_GetFrequency(&hpm->zc, i) / 2;
}
}

View File

@ -10,11 +10,12 @@
#include "adc_tools.h"
#include "zero_cross.h"
typedef struct
{
ADC_Periodic_t adc;
ZeroCross_Handle_t zc;
uint32_t ZC_Detected[3];
UPP_HalfWave_t CurrentHalfWave[3];
float U[3];
float F[3];

View File

@ -38,7 +38,6 @@ HAL_StatusTypeDef ZC_Init(ZeroCross_Handle_t *zc, uint8_t num_channels,
zc->Channel[i].LastValue = 0.0f;
zc->Channel[i].CurrentValue = 0.0f;
zc->Channel[i].DebounceCounter = 0;
zc->Channel[i].StableState = 0;
zc->Channel[i].LastCrossTime = 0;
zc->Channel[i].Period = 0;
zc->Channel[i].Frequency = 0.0f;
@ -61,10 +60,9 @@ HAL_StatusTypeDef ZC_Init(ZeroCross_Handle_t *zc, uint8_t num_channels,
HAL_StatusTypeDef ZC_ConfigChannel(ZeroCross_Handle_t *zc, uint8_t channel,
ZC_EdgeType_t edgeType)
{
if (zc == NULL || !zc->f.Initialized) {
if (assert_upp(zc)){
return HAL_ERROR;
}
if (channel >= zc->NumChannels) {
return HAL_ERROR;
}
@ -74,7 +72,6 @@ HAL_StatusTypeDef ZC_ConfigChannel(ZeroCross_Handle_t *zc, uint8_t channel,
// Сброс состояния канала при реконфигурации
zc->Channel[channel].LastValue = 0.0f;
zc->Channel[channel].DebounceCounter = 0;
zc->Channel[channel].StableState = 0;
zc->Channel[channel].LastCrossTime = 0;
zc->Channel[channel].Period = 0;
zc->Channel[channel].Frequency = 0.0f;
@ -91,7 +88,10 @@ HAL_StatusTypeDef ZC_ConfigChannel(ZeroCross_Handle_t *zc, uint8_t channel,
*/
void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uint32_t timestamp)
{
if (zc == NULL || !zc->f.Initialized || !zc->f.Monitoring) {
if (assert_upp(zc)){
return;
}
if (!zc->f.Monitoring) {
return;
}
if (channel >= zc->NumChannels) {
@ -147,9 +147,9 @@ void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uin
if(zc_detected)
{
zc_ch->StableState = zc_detected == 1? 1:0;
uint32_t RealTimeShift = zc->DebounceSamples*(timestamp - zc->LastTick); // коло-во тиков * период вызова функции
zc_ch->HalfWave = zc_detected == 1 ? UPP_WAVE_POSITIVE : UPP_WAVE_NEGATIVE;
zc_ch->Occurred = 1;
uint32_t RealTimeShift = 0;//zc->DebounceSamples*(timestamp - zc->LastTick); // коло-во тиков * период вызова функции
// Переход подтвержден сразу
uint32_t RealTimestamp = timestamp-RealTimeShift;
@ -180,7 +180,11 @@ void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uin
*/
void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float *values, uint32_t timestamp)
{
if (zc == NULL || !zc->f.Initialized || !zc->f.Monitoring || values == NULL) {
if (assert_upp(zc)){
return;
}
if (!zc->f.Monitoring || values == NULL) {
return;
}
@ -191,6 +195,38 @@ void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float *values, uint32_t times
zc->LastTick = timestamp;
}
/**
* @brief Полученить флаг - переход произошел.
* @param zc Указатель на хендл детектора нуля
* @param channel Номер канала
* @return 1 - переход произошел, 0 - перехода не было.
*/
int ZC_isOccurred(ZeroCross_Handle_t *zc, uint8_t channel)
{
if (assert_upp(zc)){
return 0;
}
int occurred = zc->Channel[channel].Occurred;
zc->Channel[channel].Occurred = 0;
return occurred;
}
/**
* @brief Получение полуволны (после последнего zero-cross).
* @param zc Указатель на хендл детектора нуля
* @param channel Номер канала
* @return Текущая полуволна @ref UPP_HalfWave_t.
*/
UPP_HalfWave_t ZC_GetHalfWave(ZeroCross_Handle_t *zc, uint8_t channel)
{
if (assert_upp(zc)){
return UPP_WAVE_UNKNOWED;
}
return zc->Channel[channel].HalfWave;
}
/**
* @brief Получение частоты сигнала.
* @param zc Указатель на хендл детектора нуля
@ -199,73 +235,16 @@ void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float *values, uint32_t times
*/
float ZC_GetFrequency(ZeroCross_Handle_t *zc, uint8_t channel)
{
if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) {
if (assert_upp(zc)){
return 0.0f;
}
if (channel >= zc->NumChannels) {
return 0.0f;
}
return zc->Channel[channel].Frequency;
}
/**
* @brief Получение периода сигнала.
* @param zc Указатель на хендл детектора нуля
* @param channel Номер канала
* @return Период в тактах таймера.
*/
uint32_t ZC_GetPeriod(ZeroCross_Handle_t *zc, uint8_t channel)
{
if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) {
return 0;
}
return zc->Channel[channel].Period;
}
/**
* @brief Получение счетчика переходов.
* @param zc Указатель на хендл детектора нуля
* @param channel Номер канала
* @return Количество переходов.
*/
uint32_t ZC_GetCrossCount(ZeroCross_Handle_t *zc, uint8_t channel)
{
if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) {
return 0;
}
return zc->Channel[channel].CrossCount;
}
/**
* @brief Получение текущего состояния канала.
* @param zc Указатель на хендл детектора нуля
* @param channel Номер канала
* @return Состояние (0 - отрицательное, 1 - положительное).
*/
uint8_t ZC_GetStableState(ZeroCross_Handle_t *zc, uint8_t channel)
{
if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) {
return 0;
}
return zc->Channel[channel].StableState;
}
/**
* @brief Получение текущего значения канала.
* @param zc Указатель на хендл детектора нуля
* @param channel Номер канала
* @return Текущее значение сигнала.
*/
float ZC_GetCurrentValue(ZeroCross_Handle_t *zc, uint8_t channel)
{
if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) {
return 0.0f;
}
return zc->Channel[channel].CurrentValue;
}
/**
* @brief Включение/выключение мониторинга.
* @param zc Указатель на хендл детектора нуля
@ -273,6 +252,9 @@ float ZC_GetCurrentValue(ZeroCross_Handle_t *zc, uint8_t channel)
*/
void ZC_EnableMonitoring(ZeroCross_Handle_t *zc, uint8_t enable)
{
if (assert_upp(zc)){
return;
}
if (zc == NULL || !zc->f.Initialized) {
return;
}
@ -287,7 +269,7 @@ void ZC_EnableMonitoring(ZeroCross_Handle_t *zc, uint8_t enable)
*/
void ZC_Reset(ZeroCross_Handle_t *zc, uint8_t channel)
{
if (zc == NULL || !zc->f.Initialized) {
if (assert_upp(zc)){
return;
}
@ -295,7 +277,6 @@ void ZC_Reset(ZeroCross_Handle_t *zc, uint8_t channel)
zc->Channel[channel].LastValue = 0.0f;
zc->Channel[channel].CurrentValue = 0.0f;
zc->Channel[channel].DebounceCounter = 0;
zc->Channel[channel].StableState = 0;
zc->Channel[channel].LastCrossTime = 0;
zc->Channel[channel].Period = 0;
zc->Channel[channel].Frequency = 0.0f;
@ -307,7 +288,6 @@ void ZC_Reset(ZeroCross_Handle_t *zc, uint8_t channel)
zc->Channel[i].LastValue = 0.0f;
zc->Channel[i].CurrentValue = 0.0f;
zc->Channel[i].DebounceCounter = 0;
zc->Channel[i].StableState = 0;
zc->Channel[i].LastCrossTime = 0;
zc->Channel[i].Period = 0;
zc->Channel[i].Frequency = 0.0f;

View File

@ -88,15 +88,16 @@ typedef enum {
* @brief Структура канала детектора нуля
*/
typedef struct {
uint32_t CrossCount; ///< Счетчик переходов
float LastValue; ///< Предыдущее значение
float CurrentValue; ///< Текущее значение
uint16_t DebounceCounter; ///< Счетчик антидребезга
uint8_t StableState; ///< Стабильное состояние (0=отриц, 1=полож)
uint32_t LastCrossTime; ///< Время последнего перехода
uint32_t Period; ///< Период сигнала (в тактах таймера)
float Frequency; ///< Частота
ZC_EdgeType_t EdgeType; ///< Тип детектируемого перехода
uint8_t Occurred; ///< Флаг что пересечение нуля произошло
uint32_t CrossCount; ///< Счетчик переходов
float LastValue; ///< Предыдущее значение
float CurrentValue; ///< Текущее значение
uint16_t DebounceCounter; ///< Счетчик антидребезга
uint32_t LastCrossTime; ///< Время последнего перехода
uint32_t Period; ///< Период сигнала (в тактах таймера)
float Frequency; ///< Частота
UPP_HalfWave_t HalfWave; ///< Текущая полуволна
ZC_EdgeType_t EdgeType; ///< Тип детектируемого перехода
} ZC_Channel_t;
/**
@ -132,36 +133,17 @@ void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value,
void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float *values,
uint32_t timestamp);
/* Полученить флаг - переход произошел. */
int ZC_isOccurred(ZeroCross_Handle_t *zc, uint8_t channel);
/* Получение частоты сигнала */
float ZC_GetFrequency(ZeroCross_Handle_t *zc, uint8_t channel);
/* Получение периода сигнала */
uint32_t ZC_GetPeriod(ZeroCross_Handle_t *zc, uint8_t channel);
/* Получение счетчика переходов */
uint32_t ZC_GetCrossCount(ZeroCross_Handle_t *zc, uint8_t channel);
/* Получение текущего состояния канала */
uint8_t ZC_GetStableState(ZeroCross_Handle_t *zc, uint8_t channel);
/* Получение текущего значения канала */
float ZC_GetCurrentValue(ZeroCross_Handle_t *zc, uint8_t channel);
/* Получение полуволны (после последнего zero-cross) */
UPP_HalfWave_t ZC_GetHalfWave(ZeroCross_Handle_t *zc, uint8_t channel);
/* Включение/выключение мониторинга */
void ZC_EnableMonitoring(ZeroCross_Handle_t *zc, uint8_t enable);
/* Сброс статистики канала */
void ZC_Reset(ZeroCross_Handle_t *zc, uint8_t channel);
/* Установка гистерезиса для хендла */
void ZC_SetHysteresis(ZeroCross_Handle_t *zc, float hysteresis);
/* Установка дебаунс samples для хендла */
void ZC_SetDebounceSamples(ZeroCross_Handle_t *zc, uint8_t debounce_samples);
/* Получение количества каналов хендла */
uint8_t ZC_GetNumChannels(ZeroCross_Handle_t *zc);
#endif /* _ZERO_CROSS_H_ */
/**

View File

@ -107,6 +107,7 @@ int main(void)
MX_TIM12_Init();
MX_TIM8_Init();
MX_TIM5_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
#else //MATLAB
#endif //MATLAB

View File

@ -23,6 +23,8 @@
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "upp_main.h"
#include "pwm_thyristors.h"
#include "angle_control.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@ -57,6 +59,8 @@
/* External variables --------------------------------------------------------*/
extern DMA_HandleTypeDef hdma_adc3;
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim8;
extern TIM_HandleTypeDef htim14;
@ -202,13 +206,41 @@ void SysTick_Handler(void)
/* please refer to the startup file (startup_stm32f4xx.s). */
/******************************************************************************/
/**
* @brief This function handles TIM1 update interrupt and TIM10 global interrupt.
*/
void TIM1_UP_TIM10_IRQHandler(void)
{
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */
/* USER CODE END TIM1_UP_TIM10_IRQn 0 */
HAL_TIM_IRQHandler(&htim1);
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */
UPP_PWM_Handle();
/* USER CODE END TIM1_UP_TIM10_IRQn 1 */
}
/**
* @brief This function handles TIM2 global interrupt.
*/
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
//UPP_Angle_Handle();
/* USER CODE END TIM2_IRQn 1 */
}
/**
* @brief This function handles TIM8 trigger and commutation interrupts and TIM14 global interrupt.
*/
void TIM8_TRG_COM_TIM14_IRQHandler(void)
{
/* USER CODE BEGIN TIM8_TRG_COM_TIM14_IRQn 0 */
#ifndef MATLAB
#ifndef MATLAB // в матлабе нет htim14, т.к. это систем тики
/* USER CODE END TIM8_TRG_COM_TIM14_IRQn 0 */
HAL_TIM_IRQHandler(&htim8);
HAL_TIM_IRQHandler(&htim14);

View File

@ -25,6 +25,7 @@
/* USER CODE END 0 */
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim5;
TIM_HandleTypeDef htim8;
@ -48,7 +49,7 @@ void MX_TIM1_Init(void)
/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1;
htim1.Init.Prescaler = 180-1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 65535;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
@ -67,7 +68,11 @@ void MX_TIM1_Init(void)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
if (HAL_TIM_OnePulse_Init(&htim1, TIM_OPMODE_SINGLE) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
@ -112,6 +117,67 @@ void MX_TIM1_Init(void)
/* USER CODE END TIM1_Init 2 */
HAL_TIM_MspPostInit(&htim1);
}
/* TIM2 init function */
void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 4294967295;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_OC_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_TIMING;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
/* USER CODE END TIM2_Init 2 */
}
/* TIM3 init function */
void MX_TIM3_Init(void)
@ -122,6 +188,7 @@ void MX_TIM3_Init(void)
/* USER CODE END TIM3_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_SlaveConfigTypeDef sSlaveConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
@ -147,8 +214,18 @@ void MX_TIM3_Init(void)
{
Error_Handler();
}
if (HAL_TIM_OnePulse_Init(&htim3, TIM_OPMODE_SINGLE) != HAL_OK)
{
Error_Handler();
}
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;
sSlaveConfig.InputTrigger = TIM_TS_ITR0;
if (HAL_TIM_SlaveConfigSynchro(&htim3, &sSlaveConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Error_Handler();
@ -325,10 +402,29 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM1_MspInit 0 */
/* TIM1 clock enable */
__HAL_RCC_TIM1_CLK_ENABLE();
/* TIM1 interrupt Init */
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
/* USER CODE BEGIN TIM1_MspInit 1 */
/* USER CODE END TIM1_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspInit 0 */
/* USER CODE END TIM2_MspInit 0 */
/* TIM2 clock enable */
__HAL_RCC_TIM2_CLK_ENABLE();
/* TIM2 interrupt Init */
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
/* USER CODE BEGIN TIM2_MspInit 1 */
/* USER CODE END TIM2_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspInit 0 */
@ -469,10 +565,27 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM1_CLK_DISABLE();
/* TIM1 interrupt Deinit */
HAL_NVIC_DisableIRQ(TIM1_UP_TIM10_IRQn);
/* USER CODE BEGIN TIM1_MspDeInit 1 */
/* USER CODE END TIM1_MspDeInit 1 */
}
else if(tim_baseHandle->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspDeInit 0 */
/* USER CODE END TIM2_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM2_CLK_DISABLE();
/* TIM2 interrupt Deinit */
HAL_NVIC_DisableIRQ(TIM2_IRQn);
/* USER CODE BEGIN TIM2_MspDeInit 1 */
/* USER CODE END TIM2_MspDeInit 1 */
}
else if(tim_baseHandle->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspDeInit 0 */

View File

@ -0,0 +1,167 @@
/**
******************************************************************************
* @file pwm_thyristors.c
* @brief Модуль для управления тиристорами
******************************************************************************
* @details
******************************************************************************/
#include "angle_control.h"
#include "tim.h"
/**
* @brief Инициализация ШИМ тиристоров.
* @param hangle Указатель на таймер
* @return HAL Status.
*/
HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle, float AngleMin, float AngleMax)
{
if(hangle == NULL)
return HAL_ERROR;
if(AngleMax < 0 || AngleMax > 1)
return HAL_ERROR;
if(AngleMin < 0 || AngleMin > 1)
return HAL_ERROR;
hangle->htim = &angletim;
hangle->AngleMax = AngleMax;
hangle->AngleMin = AngleMin;
HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_1);
HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_2);
HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_3);
Angle_Reset(hangle, UPP_PHASE_A);
Angle_Reset(hangle, UPP_PHASE_B);
Angle_Reset(hangle, UPP_PHASE_C);
return HAL_OK;
}
/**
* @brief Хендл таймера для рассчета угла открытия.
* @param hangle Указатель на таймер
* @return HAL Status.
*/
UPP_Phase_t Angle_Handle(Angle_Handle_t *hangle)
{
if(hangle == NULL)
return UPP_PHASE_UNKNOWN;
switch(hangle->htim->Channel)
{
case HAL_TIM_ACTIVE_CHANNEL_1:
return UPP_PHASE_A;
break;
case HAL_TIM_ACTIVE_CHANNEL_2:
return UPP_PHASE_B;
break;
case HAL_TIM_ACTIVE_CHANNEL_3:
return UPP_PHASE_C;
break;
default:
return UPP_PHASE_UNKNOWN;
break;
}
return UPP_PHASE_UNKNOWN;
}
/**
* @brief Установка угла открытия в таймер.
* @param hangle Указатель на таймер
* @param Phase Для какой фазы надо установить угол открытия
* @return HAL Status.
*/
HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float Angle, float Freq)
{
if(hangle == NULL)
return HAL_ERROR;
// Если канал дурацкий - возвращаем ошибку
if(Phase >= 3)
{
return HAL_ERROR;
}
if(Angle > hangle->AngleMax)
{
Angle = hangle->AngleMax;
}
if(Angle < hangle->AngleMin)
{
Angle = hangle->AngleMin;
}
uint32_t timer_ticks = TIM_FreqToTick(Freq/Angle, ANGLE_TIM2_FREQ_MHZ);
uint32_t ccr_ticks = __HAL_TIM_GET_COUNTER(hangle->htim) + timer_ticks;
switch(Phase)
{
case UPP_PHASE_A:
__HAL_TIM_ENABLE_IT(hangle->htim, TIM_IT_CC1);
__HAL_TIM_SET_COMPARE(hangle->htim, ANGLE_CHANNEL_1, ccr_ticks);
break;
case UPP_PHASE_B:
__HAL_TIM_ENABLE_IT(hangle->htim, TIM_IT_CC2);
__HAL_TIM_SET_COMPARE(hangle->htim, ANGLE_CHANNEL_2, ccr_ticks);
break;
case UPP_PHASE_C:
__HAL_TIM_ENABLE_IT(hangle->htim, TIM_IT_CC3);
__HAL_TIM_SET_COMPARE(hangle->htim, ANGLE_CHANNEL_3, ccr_ticks);
break;
case UPP_PHASE_UNKNOWN:
// ПОКА ХЗ
break;
}
return HAL_OK;
}
/**
* @brief Сброс угла открытия у таймера.
* @param hangle Указатель на таймер
* @param Phase Для какой фазы надо сбросить угол открытия
* @return HAL Status.
*/
HAL_StatusTypeDef Angle_Reset(Angle_Handle_t *hangle, UPP_Phase_t Phase)
{
if(hangle == NULL)
return HAL_ERROR;
// Если канал дурацкий - возвращаем ошибку
if(Phase >= 3)
{
return HAL_ERROR;
}
switch(Phase)
{
case UPP_PHASE_A:
__HAL_TIM_DISABLE_IT(hangle->htim, TIM_IT_CC1);
break;
case UPP_PHASE_B:
__HAL_TIM_DISABLE_IT(hangle->htim, TIM_IT_CC2);
break;
case UPP_PHASE_C:
__HAL_TIM_DISABLE_IT(hangle->htim, TIM_IT_CC3);
break;
case UPP_PHASE_UNKNOWN:
// ПОКА ХЗ
break;
}
return HAL_OK;
}

View File

@ -0,0 +1,30 @@
/**
******************************************************************************
* @file pwm_thyristors.h
* @brief Модуль для управления тиристорами (объединённый 6-канальный)
******************************************************************************
*/
#ifndef _ANGLE_CONTROL_H_
#define _ANGLE_CONTROL_H_
#include "main.h"
#define ANGLE_TIM2_FREQ_MHZ 90
typedef struct
{
TIM_HandleTypeDef *htim;
float AngleMin;
float AngleMax;
}Angle_Handle_t;
/* Инициализация Таймера для рассчета угла открытия. */
HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle, float AngleMin, float AngleMax);
/* Установка угла открытия в таймер. */
HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float Angle, float Freq);
/* Сброс угла открытия у таймера. */
HAL_StatusTypeDef Angle_Reset(Angle_Handle_t *hangle, UPP_Phase_t Phase);
/* Хендл таймера для рассчета угла открытия. */
UPP_Phase_t Angle_Handle(Angle_Handle_t *hangle);
#endif /* _ANGLE_CONTROL_H_ */

View File

@ -0,0 +1,303 @@
/**
******************************************************************************
* @file pwm_thyristors.c
* @brief Модуль для управления тиристорами
******************************************************************************
* @details
******************************************************************************/
#include "pwm_thyristors.h"
#include "angle_control.h"
#include "tim.h"
static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint32_t state);
/**
* @brief Инициализация ШИМ тиристоров.
* @param hpwm Указатель на хендл ШИМ тиристоров
* @return HAL Status.
*/
HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm)
{
if(hpwm == NULL)
return HAL_ERROR;
// Фаза A
hpwm->AllPhases[PHASE_A_POS].State = PWM_THYR_DISABLED;
hpwm->AllPhases[PHASE_A_POS].ChMask = PWM_CHANNEL_1;
hpwm->AllPhases[PHASE_A_POS].htim = &hpwm1;
hpwm->AllPhases[PHASE_A_NEG].State = PWM_THYR_DISABLED;
hpwm->AllPhases[PHASE_A_NEG].ChMask = PWM_CHANNEL_2;
hpwm->AllPhases[PHASE_A_NEG].htim = &hpwm1;
// Фаза B
hpwm->AllPhases[PHASE_B_POS].State = PWM_THYR_DISABLED;
hpwm->AllPhases[PHASE_B_POS].ChMask = PWM_CHANNEL_3;
hpwm->AllPhases[PHASE_B_POS].htim = &hpwm1;
hpwm->AllPhases[PHASE_B_NEG].State = PWM_THYR_DISABLED;
hpwm->AllPhases[PHASE_B_NEG].ChMask = PWM_CHANNEL_4;
hpwm->AllPhases[PHASE_B_NEG].htim = &hpwm1;
// Фаза C
hpwm->AllPhases[PHASE_C_POS].State = PWM_THYR_DISABLED;
hpwm->AllPhases[PHASE_C_POS].ChMask = PWM_CHANNEL_5;
hpwm->AllPhases[PHASE_C_POS].htim = &hpwm2;
hpwm->AllPhases[PHASE_C_NEG].State = PWM_THYR_DISABLED;
hpwm->AllPhases[PHASE_C_NEG].ChMask = PWM_CHANNEL_6;
hpwm->AllPhases[PHASE_C_NEG].htim = &hpwm2;
// Фаза неизвестная (чтобы не был указатель в никуда, а был на эту структуру)
hpwm->AllPhases[PHASE_UNKNOWN].State = PWM_THYR_DISABLED;
hpwm->AllPhases[PHASE_UNKNOWN].ChMask = 0;
hpwm->AllPhases[PHASE_UNKNOWN].htim = NULL;
hpwm->f.Initialized = 1;
// Инициализируем ничем. Потом когда словим сеть - поставим конкретные тиристоры
PWM_SetHalfWave(hpwm, UPP_PHASE_A, UPP_WAVE_UNKNOWED);
PWM_SetHalfWave(hpwm, UPP_PHASE_B, UPP_WAVE_UNKNOWED);
PWM_SetHalfWave(hpwm, UPP_PHASE_C, UPP_WAVE_UNKNOWED);
PWM_SetFrequency(hpwm, hpwm->Config.Frequency);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_1);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_2);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_3);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_4);
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;
}
/**
* @brief Запуск ШИМ.
* @param hpwm Указатель на хендл ШИМ тиристоров
* @param Phase На какой фазе надо запустить ШИМ
* @return HAL Status.
*/
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;
}
switch(hpwm->Phase[Phase]->State)
{
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:
// переходим в состояние старта ШИМ
hpwm->Phase[Phase]->State = PWM_THYR_TIM_START;
return HAL_OK;
default:
return HAL_ERROR;;
}
return HAL_ERROR;
}
/**
* @brief Остановить ШИМ.
* @param hpwm Указатель на хендл ШИМ тиристоров
* @param Phase На какой фазе надо остановить ШИМ
* @return HAL Status.
*/
HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_stop)
{
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;
}
hpwm->Phase[Phase]->State = PWM_THYR_TIM_WAIT_ZERO;
if(force_stop)
{
__PWM_SetOutputState(hpwm, Phase, PWM_DISABLE);
}
return HAL_ERROR;
}
/**
* @brief Хендл ШИМ тиристоров.
* @param hpwm Указатель на хендл ШИМ тиристоров
* @return HAL Status.
*/
HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm)
{
if(assert_upp(hpwm))
return HAL_ERROR;
for(int phase = 0; phase < 3; phase++)
{
if(!read_bit(hpwm->Config.PhaseMask.all, phase))
continue;
if (hpwm->Phase[phase] == NULL || hpwm->Phase[phase] == &hpwm->AllPhases[PHASE_UNKNOWN])
continue;
switch(hpwm->Phase[phase]->State)
{
case PWM_THYR_DISABLED:
__PWM_SetOutputState(hpwm, phase, PWM_DISABLE);
break;
case PWM_THYR_TIM_WAIT_ZERO:
__PWM_SetOutputState(hpwm, phase, 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;
break;
case PWM_THYR_TIM_ACTIVE:
hpwm->Phase[phase]->PulseCnt--;
if(hpwm->Phase[phase]->PulseCnt <= 0)
{
hpwm->Phase[phase]->PulseCnt = 0;
hpwm->Phase[phase]->State = PWM_THYR_TIM_DONE;
}
break;
case PWM_THYR_TIM_DONE:
hpwm->Phase[phase]->State = PWM_THYR_TIM_WAIT_ZERO;
break;
default:
__PWM_SetOutputState(hpwm, phase, PWM_DISABLE);
break;
}
}
return HAL_OK;
}
/**
* @brief Установка полуволны для слежения.
* @param hpwm Указатель на хендл ШИМ тиристоров
* @param Phase Для какой фазы надо установить полуволну
* @param halfwave Какую полуволну установить
* @return HAL Status.
*/
HAL_StatusTypeDef PWM_SetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase, UPP_HalfWave_t halfwave)
{
if(assert_upp(hpwm))
return HAL_ERROR;
// Сбрасываем текущий канал
__PWM_SetOutputState(hpwm, Phase, PWM_DISABLE);
// Если канал дурацкий - выставляем заглушку
if(Phase >= 3)
{
hpwm->Phase[Phase] = &hpwm->AllPhases[PHASE_UNKNOWN];
return HAL_ERROR;
}
// Выставляем канал
switch(halfwave)
{
case UPP_WAVE_POSITIVE:
hpwm->Phase[Phase] = &hpwm->AllPhases[Phase];
return HAL_OK;
case UPP_WAVE_NEGATIVE:
hpwm->Phase[Phase] = &hpwm->AllPhases[Phase+3];
return HAL_OK;
default:
hpwm->Phase[Phase] = &hpwm->AllPhases[PHASE_UNKNOWN];
return HAL_ERROR;
}
}
/**
* @brief Установка режима для канала ШИМ.
* @param hpwm Указатель на хендл ШИМ тиристоров
* @param Phase Для какой фазы надо установить состояние
* @param state Какое состояние установить
* @return HAL Status.
*/
static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint32_t state)
{
if(hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN])
return HAL_ERROR;
uint32_t ch_mode = state;
switch(hpwm->Phase[Phase]->ChMask)
{
case TIM_CHANNEL_1:
hpwm->Phase[Phase]->htim->Instance->CCMR1 &= ~TIM_OCMODE_PWM2;
hpwm->Phase[Phase]->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);
break;
case TIM_CHANNEL_3:
hpwm->Phase[Phase]->htim->Instance->CCMR2 &= ~TIM_OCMODE_PWM2;
hpwm->Phase[Phase]->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);
break;
default:
break;
}
return HAL_OK;
}
/**
* @brief Установка полуволны для слежения.
* @param hpwm Указатель на хендл ШИМ тиристоров
* @param Phase Для какой фазы надо установить полуволну
* @param halfwave Какую полуволну установить
* @return HAL Status.
*/
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)
{
return UPP_WAVE_UNKNOWED;
}
// Выставляем канал
if(hpwm->Phase[Phase] == &hpwm->AllPhases[Phase])
{
return UPP_WAVE_POSITIVE;
}
else if(hpwm->Phase[Phase] == &hpwm->AllPhases[Phase+3])
{
return UPP_WAVE_NEGATIVE;
}
else
{
return UPP_WAVE_UNKNOWED;
}
}

View File

@ -0,0 +1,114 @@
/**
******************************************************************************
* @file pwm_thyristors.h
* @brief Модуль для управления тиристорами (объединённый 6-канальный)
******************************************************************************
*/
#ifndef _PWM_THYRISTORS_H
#define _PWM_THYRISTORS_H
#include "main.h"
#define PWM_TIM1_FREQ_MHZ 180
#define PWM_TIM3_FREQ_MHZ 90
#define PWM_ENABLE TIM_OCMODE_PWM1
#define PWM_DISABLE TIM_OCMODE_FORCED_ACTIVE
#define PWM_SetFrequency(_hpwm_, _freq_) \
do { _hpwm_->Config.Frequency = _freq_; \
__HAL_TIM_SET_AUTORELOAD(&hpwm1, TIM_FreqToTick(_freq_, PWM_TIM1_FREQ_MHZ)); \
__HAL_TIM_SET_AUTORELOAD(&hpwm2, TIM_FreqToTick(_freq_, PWM_TIM3_FREQ_MHZ)); \
__HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_1, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); \
__HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_2, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); \
__HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_3, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); \
__HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_4, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); \
__HAL_TIM_SET_COMPARE(&hpwm2, PWM_CHANNEL_5, __HAL_TIM_GET_AUTORELOAD(&hpwm2)/2); \
__HAL_TIM_SET_COMPARE(&hpwm2, PWM_CHANNEL_6, __HAL_TIM_GET_AUTORELOAD(&hpwm2)/2); }while(0);
// Индексы для структур каналов @ref PWM_Handle_t
#define PHASE_A_POS 0
#define PHASE_B_POS 1
#define PHASE_C_POS 2
#define PHASE_A_NEG 3
#define PHASE_B_NEG 4
#define PHASE_C_NEG 5
#define PHASE_UNKNOWN 6
/**
* @brief Состояния канала
*/
typedef enum {
PWM_THYR_DISABLED = 0, ///< Канал отключен
PWM_THYR_TIM_WAIT_ZERO, ///< Таймер ждет пересечения нуля
PWM_THYR_TIM_START, ///< Запуск таймера для ШИМ
PWM_THYR_TIM_ACTIVE, ///< Таймер активен и формирует ШИМ
PWM_THYR_TIM_DONE ///< Таймер закончил свою работу в полупериоде
} PWM_State_t;
/**
* @brief Канал PWM (один тиристор)
*/
typedef struct {
PWM_State_t State; ///< Состояние тиристора
TIM_HandleTypeDef *htim; ///< указатель на соответствующий TIM (hpwm1 или hpwm2)
uint32_t PulseCnt; ///< Счетчик кол-ва импульсов. Инициализируется из структуры @ref PWM_ThyrConfig_t
uint32_t ChMask; ///< TIM_CHANNEL_x
struct {
unsigned Ready:1; ///< Флаг готовности тиристора к работе
} f;
} PWM_Channel_t;
/**
* @brief Канал PWM (один тиристор)
*/
typedef struct {
union
{
uint8_t all;
struct
{
uint8_t phA:1;
uint8_t phB:1;
uint8_t phC:1;
};
}PhaseMask; ///< Какими каналами управлять
uint8_t PulseNumber; ///< Сколько импульсов отправить в пакете для открытия тиристоров
uint32_t Frequency; ///< Частота импульсов
} PWM_ThyrConfig_t;
/**
* @brief Хендл управляюзщий тиристорами */
typedef struct {
PWM_ThyrConfig_t Config;
PWM_Channel_t *Phase[3]; ///< Текущие каналы для фаз
PWM_Channel_t AllPhases[7]; ///< Все каналы для фаз (+1 для деинициализированного канала)
struct {
unsigned Initialized : 1;
unsigned Running : 1; ///< true если оба таймера запущены
} f;
} PWM_Handle_t;
/* ---- API ---- */
/* Инициализация ШИМ тиристоров. */
HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm);
/* Запуск ШИМ. */
HAL_StatusTypeDef PWM_Start(PWM_Handle_t *hpwm, UPP_Phase_t Phase);
/* Остановить ШИМ. */
HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_stop);
/* Установка полуволны для слежения. */
HAL_StatusTypeDef PWM_SetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase, UPP_HalfWave_t halfwave);
/* Установка полуволны для слежения. */
UPP_HalfWave_t PWM_GetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase);
/* Хендл ШИМ тиристоров. */
HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm);
#endif /* _PWM_THYRISTORS_H */

View File

@ -6,9 +6,9 @@
* @details
******************************************************************************/
#include "upp_main.h" // всё остальное по работе с УПП
#include "power_monitor.h" // статистика сети и АЦП
PowerMonitor_t pm;
UPP_t upp;
float alpha_dbg = 0.5;
// ОСНОВНОЙ ЦИКЛ main.c
/**
* @brief Инициализация УПП.
@ -17,7 +17,11 @@ PowerMonitor_t pm;
int UPP_Init(void)
{
HAL_TIM_Base_Start(&ustim);
PowerMonitor_Init(&pm);
PowerMonitor_Init(&upp.pm);
upp.hpwm.Config.Frequency = 20000;
upp.hpwm.Config.PulseNumber = 20;
PWM_Init(&upp.hpwm);
Angle_Init(&upp.hangle, 0, 0.8);
return 0;
}
@ -27,7 +31,8 @@ int UPP_Init(void)
*/
int UPP_PreWhile(void)
{
PowerMonitor_Start(&pm);
PowerMonitor_Start(&upp.pm);
upp.hpwm.Config.PhaseMask.all = 0x7;
return 0;
}
@ -41,7 +46,52 @@ int UPP_While(void)
return 0;
}
// ПРЕРЫВАНИЯ stm32f4xx_it.c
void UPP_ADC_Handle(void)
{
PowerMonitor_Handle(&pm);
PowerMonitor_Handle(&upp.pm);
for(int phase = 0; phase < 3; phase++)
{
// Если произошел Zero Cross
if(ZC_isOccurred(&upp.pm.zc, phase))
{
// Меняем полуволну тиристора
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);
}
}
}
void UPP_PWM_Handle(void)
{
PWM_Handle(&upp.hpwm);
}
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim)
{
if (htim == upp.hangle.htim)
{
UPP_Angle_Handle();
}
}
void UPP_Angle_Handle(void)
{
UPP_Phase_t phase = Angle_Handle(&upp.hangle);
switch(phase)
{
case UPP_PHASE_A:
PWM_Start(&upp.hpwm, UPP_PHASE_A);
break;
case UPP_PHASE_B:
PWM_Start(&upp.hpwm, UPP_PHASE_B);
break;
case UPP_PHASE_C:
PWM_Start(&upp.hpwm, UPP_PHASE_C);
break;
default:
break;
}
}

View File

@ -11,7 +11,19 @@
#include "main.h" // либы из AllLibs и вербальные имена из CubeMX
#include "upp_config.h"
#include "power_monitor.h" // статистика сети и АЦП
#include "pwm_thyristors.h" // Управление тиристорами
#include "angle_control.h" // Управление углом открытия
extern float alpha_dbg;
typedef struct
{
PowerMonitor_t pm;
PWM_Handle_t hpwm;
Angle_Handle_t hangle;
}UPP_t;
extern UPP_t upp;
/* Инициализация УПП */
@ -22,4 +34,6 @@ int UPP_PreWhile(void);
int UPP_While(void);
void UPP_ADC_Handle(void);
void UPP_PWM_Handle(void);
void UPP_Angle_Handle(void);
#endif //_UPP_MAIN_H

View File

@ -327,6 +327,54 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>12</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\UPP\pwm_thyristors.c</PathWithFileName>
<FilenameWithoutPath>pwm_thyristors.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>13</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\UPP\pwm_thyristors.h</PathWithFileName>
<FilenameWithoutPath>pwm_thyristors.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\UPP\angle_control.c</PathWithFileName>
<FilenameWithoutPath>angle_control.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>15</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\UPP\angle_control.h</PathWithFileName>
<FilenameWithoutPath>angle_control.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@ -337,7 +385,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>12</FileNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -349,7 +397,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>13</FileNumber>
<FileNumber>17</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -361,7 +409,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>14</FileNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -373,7 +421,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>15</FileNumber>
<FileNumber>19</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -385,7 +433,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>16</FileNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -397,7 +445,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>17</FileNumber>
<FileNumber>21</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -409,14 +457,6 @@
</File>
</Group>
<Group>
<GroupName>Thyristors</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
</Group>
<Group>
<GroupName>Application/User/Core</GroupName>
<tvExp>1</tvExp>
@ -424,8 +464,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>18</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -436,8 +476,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>19</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -448,8 +488,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>20</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -460,8 +500,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>21</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -472,8 +512,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>22</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -484,8 +524,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>23</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -496,8 +536,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>24</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -508,8 +548,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>25</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -520,8 +560,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>26</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -532,8 +572,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>27</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -544,8 +584,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>28</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -556,8 +596,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>29</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -568,8 +608,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>30</FileNumber>
<GroupNumber>4</GroupNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -588,8 +628,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>31</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>35</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -600,8 +640,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>32</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>36</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -612,8 +652,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>33</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>37</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -624,8 +664,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>34</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>38</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -636,8 +676,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>35</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>39</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -648,8 +688,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>36</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>40</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -660,8 +700,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>37</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -672,8 +712,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>38</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>42</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -692,8 +732,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>39</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -704,8 +744,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>40</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -716,8 +756,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>41</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -728,8 +768,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>42</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -740,8 +780,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>43</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -752,8 +792,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>44</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -764,8 +804,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>45</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -776,8 +816,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>46</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -788,8 +828,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>47</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -800,8 +840,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>48</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -812,8 +852,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>49</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -824,8 +864,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>50</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -844,8 +884,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>51</FileNumber>
<GroupNumber>7</GroupNumber>
<FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -856,8 +896,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>52</FileNumber>
<GroupNumber>7</GroupNumber>
<FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -871,13 +911,13 @@
<Group>
<GroupName>PeriphGeneral</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>53</FileNumber>
<GroupNumber>8</GroupNumber>
<FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -888,8 +928,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>54</FileNumber>
<GroupNumber>8</GroupNumber>
<FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -900,8 +940,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>55</FileNumber>
<GroupNumber>8</GroupNumber>
<FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -912,8 +952,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>56</FileNumber>
<GroupNumber>8</GroupNumber>
<FileNumber>60</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -924,8 +964,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>57</FileNumber>
<GroupNumber>8</GroupNumber>
<FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -944,8 +984,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>58</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -956,8 +996,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>59</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -968,8 +1008,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>60</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -980,8 +1020,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>61</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>65</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -992,8 +1032,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>62</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>66</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1004,8 +1044,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>63</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>67</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1016,8 +1056,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>64</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1028,8 +1068,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>65</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1040,8 +1080,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>66</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1052,8 +1092,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>67</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1064,8 +1104,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>68</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1076,8 +1116,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>69</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1088,8 +1128,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>70</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1100,8 +1140,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>71</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1112,8 +1152,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>72</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1124,8 +1164,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>73</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1136,8 +1176,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>74</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1148,8 +1188,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>75</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>79</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1160,8 +1200,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>76</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>80</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1172,8 +1212,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>77</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>81</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1184,8 +1224,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>78</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>82</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1196,8 +1236,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>79</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>83</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1208,8 +1248,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>80</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>84</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1220,8 +1260,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>81</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>85</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1240,8 +1280,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>82</FileNumber>
<GroupNumber>10</GroupNumber>
<FileNumber>86</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1260,8 +1300,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>83</FileNumber>
<GroupNumber>11</GroupNumber>
<FileNumber>87</FileNumber>
<FileType>2</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>

View File

@ -445,6 +445,26 @@
<FileType>5</FileType>
<FilePath>..\Core\UPP\upp_main.h</FilePath>
</File>
<File>
<FileName>pwm_thyristors.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\UPP\pwm_thyristors.c</FilePath>
</File>
<File>
<FileName>pwm_thyristors.h</FileName>
<FileType>5</FileType>
<FilePath>..\Core\UPP\pwm_thyristors.h</FilePath>
</File>
<File>
<FileName>angle_control.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\UPP\angle_control.c</FilePath>
</File>
<File>
<FileName>angle_control.h</FileName>
<FileType>5</FileType>
<FilePath>..\Core\UPP\angle_control.h</FilePath>
</File>
</Files>
</Group>
<Group>
@ -482,9 +502,6 @@
</File>
</Files>
</Group>
<Group>
<GroupName>Thyristors</GroupName>
</Group>
<Group>
<GroupName>Application/User/Core</GroupName>
<Files>

View File

@ -54,13 +54,14 @@ Mcu.CPN=STM32F427ZGT6
Mcu.Family=STM32F4
Mcu.IP0=ADC3
Mcu.IP1=CAN1
Mcu.IP10=TIM3
Mcu.IP11=TIM5
Mcu.IP12=TIM8
Mcu.IP13=TIM11
Mcu.IP14=TIM12
Mcu.IP15=USART3
Mcu.IP16=USART6
Mcu.IP10=TIM2
Mcu.IP11=TIM3
Mcu.IP12=TIM5
Mcu.IP13=TIM8
Mcu.IP14=TIM11
Mcu.IP15=TIM12
Mcu.IP16=USART3
Mcu.IP17=USART6
Mcu.IP2=DMA
Mcu.IP3=IWDG
Mcu.IP4=NVIC
@ -69,7 +70,7 @@ Mcu.IP6=RTC
Mcu.IP7=SPI3
Mcu.IP8=SYS
Mcu.IP9=TIM1
Mcu.IPNb=17
Mcu.IPNb=18
Mcu.Name=STM32F427Z(G-I)Tx
Mcu.Package=LQFP144
Mcu.Pin0=PE2
@ -127,17 +128,25 @@ Mcu.Pin55=VP_RTC_VS_RTC_Activate
Mcu.Pin56=VP_RTC_VS_RTC_Calendar
Mcu.Pin57=VP_SYS_VS_tim14
Mcu.Pin58=VP_TIM1_VS_ClockSourceINT
Mcu.Pin59=VP_TIM3_VS_ClockSourceINT
Mcu.Pin59=VP_TIM1_VS_OPM
Mcu.Pin6=PC14/OSC32_IN
Mcu.Pin60=VP_TIM8_VS_ClockSourceINT
Mcu.Pin61=VP_TIM11_VS_ClockSourceINT
Mcu.Pin62=VP_TIM12_VS_ClockSourceINT
Mcu.Pin60=VP_TIM2_VS_ClockSourceINT
Mcu.Pin61=VP_TIM2_VS_no_output1
Mcu.Pin62=VP_TIM2_VS_no_output2
Mcu.Pin63=VP_TIM2_VS_no_output3
Mcu.Pin64=VP_TIM3_VS_ControllerModeTrigger
Mcu.Pin65=VP_TIM3_VS_ClockSourceINT
Mcu.Pin66=VP_TIM3_VS_ClockSourceITR
Mcu.Pin67=VP_TIM3_VS_OPM
Mcu.Pin68=VP_TIM8_VS_ClockSourceINT
Mcu.Pin69=VP_TIM11_VS_ClockSourceINT
Mcu.Pin7=PC15/OSC32_OUT
Mcu.Pin70=VP_TIM12_VS_ClockSourceINT
Mcu.Pin8=PF6
Mcu.Pin9=PF7
Mcu.PinsNb=63
Mcu.PinsNb=71
Mcu.ThirdPartyNb=0
Mcu.UserConstants=mb_huart,huart3;mbdbg_htim,htim11;PWM_CHANNEL_1,TIM_CHANNEL_1;PWM_CHANNEL_2,TIM_CHANNEL_2;PWM_CHANNEL_3,TIM_CHANNEL_3;PWM_CHANNEL_4,TIM_CHANNEL_4;mem_hspi,hspi3;PWM_CHANNEL_5,TIM_CHANNEL_3;PWM_CHANNEL_6,TIM_CHANNEL_4;mb_htim,htim12;adc_tim,htim8;hpwm2,htim2;mb_dbg_huart,huart6;ustim,htim5;hpwm1,htim1;usTick,ustim.Instance->CNT
Mcu.UserConstants=mb_huart,huart3;mbdbg_htim,htim11;PWM_CHANNEL_1,TIM_CHANNEL_1;PWM_CHANNEL_2,TIM_CHANNEL_2;PWM_CHANNEL_3,TIM_CHANNEL_3;PWM_CHANNEL_4,TIM_CHANNEL_4;mem_hspi,hspi3;PWM_CHANNEL_5,TIM_CHANNEL_3;PWM_CHANNEL_6,TIM_CHANNEL_4;mb_htim,htim12;adc_tim,htim8;usTick,ustim.Instance->CNT;hpwm2,htim3;mb_dbg_huart,huart6;ustim,htim5;hpwm1,htim1;ANGLE_CHANNEL_1,TIM_CHANNEL_1;ANGLE_CHANNEL_2,TIM_CHANNEL_2;ANGLE_CHANNEL_3,TIM_CHANNEL_3;angletim,htim2
Mcu.UserName=STM32F427ZGTx
MxCube.Version=6.12.1
MxDb.Version=DB.6.0.121
@ -152,6 +161,8 @@ NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
NVIC.TIM1_UP_TIM10_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.TIM2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.TIM8_TRG_COM_TIM14_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:true
NVIC.TimeBase=TIM8_TRG_COM_TIM14_IRQn
NVIC.TimeBaseIP=TIM14
@ -395,7 +406,7 @@ ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-true-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC3_Init-ADC3-false-HAL-true,5-MX_USART3_UART_Init-USART3-false-HAL-true,6-MX_CAN1_Init-CAN1-false-HAL-true,7-MX_IWDG_Init-IWDG-false-HAL-true,8-MX_TIM13_Init-TIM13-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_TIM1_Init-TIM1-false-HAL-true,10-MX_TIM3_Init-TIM3-false-HAL-true,11-MX_USART6_UART_Init-USART6-false-HAL-true,12-MX_SPI3_Init-SPI3-false-HAL-true,13-MX_TIM11_Init-TIM11-false-HAL-true,14-MX_TIM12_Init-TIM12-false-HAL-true,15-MX_TIM8_Init-TIM8-false-HAL-true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-true-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC3_Init-ADC3-false-HAL-true,5-MX_USART3_UART_Init-USART3-false-HAL-true,6-MX_CAN1_Init-CAN1-false-HAL-true,7-MX_IWDG_Init-IWDG-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_TIM1_Init-TIM1-false-HAL-true,10-MX_TIM3_Init-TIM3-false-HAL-true,11-MX_USART6_UART_Init-USART6-false-HAL-true,12-MX_SPI3_Init-SPI3-false-HAL-true,13-MX_TIM11_Init-TIM11-false-HAL-true,14-MX_TIM12_Init-TIM12-false-HAL-true,15-MX_TIM8_Init-TIM8-false-HAL-true,16-MX_TIM5_Init-TIM5-false-HAL-true,17-MX_TIM2_Init-TIM2-false-HAL-true
RCC.48MHZClocksFreq_Value=90000000
RCC.AHBFreq_Value=180000000
RCC.APB1CLKDivider=RCC_HCLK_DIV4
@ -461,19 +472,30 @@ SPI3.Direction=SPI_DIRECTION_2LINES
SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate
SPI3.Mode=SPI_MODE_MASTER
SPI3.VirtualType=VM_MASTER
TIM1.Channel-Output\ Compare2\ CH2=TIM_CHANNEL_2
TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM1.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM1.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,Prescaler
TIM1.Prescaler=180-1
TIM1.IPParameters=Prescaler,Channel-Output Compare2 CH2,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation4 CH4,Channel-PWM Generation3 CH3,TIM_MasterOutputTrigger
TIM1.Prescaler=0
TIM1.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
TIM11.IPParameters=Prescaler
TIM11.Prescaler=180-1
TIM12.IPParameters=Prescaler
TIM12.Prescaler=90-1
TIM2.Channel-Output\ Compare1\ No\ Output=TIM_CHANNEL_1
TIM2.Channel-Output\ Compare2\ No\ Output=TIM_CHANNEL_2
TIM2.Channel-Output\ Compare3\ No\ Output=TIM_CHANNEL_3
TIM2.IPParameters=Channel-Output Compare2 No Output,Channel-Output Compare1 No Output,Channel-Output Compare3 No Output,OCMode_1,OCMode_2,OCMode_3
TIM2.OCMode_1=TIM_OCMODE_TIMING
TIM2.OCMode_2=TIM_OCMODE_TIMING
TIM2.OCMode_3=TIM_OCMODE_TIMING
TIM3.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM3.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4
TIM3.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,TIM_MasterSlaveMode,TIM_MasterOutputTrigger
TIM3.TIM_MasterOutputTrigger=TIM_TRGO_RESET
TIM3.TIM_MasterSlaveMode=TIM_MASTERSLAVEMODE_ENABLE
TIM5.Channel-Input_Capture1_from_TI1=TIM_CHANNEL_1
TIM5.IPParameters=Channel-Input_Capture1_from_TI1,Prescaler
TIM5.Prescaler=90-1
@ -500,8 +522,24 @@ VP_TIM12_VS_ClockSourceINT.Mode=Internal
VP_TIM12_VS_ClockSourceINT.Signal=TIM12_VS_ClockSourceINT
VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
VP_TIM1_VS_OPM.Mode=OPM_bit
VP_TIM1_VS_OPM.Signal=TIM1_VS_OPM
VP_TIM2_VS_ClockSourceINT.Mode=Internal
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
VP_TIM2_VS_no_output1.Mode=Output Compare1 No Output
VP_TIM2_VS_no_output1.Signal=TIM2_VS_no_output1
VP_TIM2_VS_no_output2.Mode=Output Compare2 No Output
VP_TIM2_VS_no_output2.Signal=TIM2_VS_no_output2
VP_TIM2_VS_no_output3.Mode=Output Compare3 No Output
VP_TIM2_VS_no_output3.Signal=TIM2_VS_no_output3
VP_TIM3_VS_ClockSourceINT.Mode=Internal
VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
VP_TIM3_VS_ClockSourceITR.Mode=TriggerSource_ITR0
VP_TIM3_VS_ClockSourceITR.Signal=TIM3_VS_ClockSourceITR
VP_TIM3_VS_ControllerModeTrigger.Mode=Trigger Mode
VP_TIM3_VS_ControllerModeTrigger.Signal=TIM3_VS_ControllerModeTrigger
VP_TIM3_VS_OPM.Mode=OPM_bit
VP_TIM3_VS_OPM.Signal=TIM3_VS_OPM
VP_TIM8_VS_ClockSourceINT.Mode=Internal
VP_TIM8_VS_ClockSourceINT.Signal=TIM8_VS_ClockSourceINT
board=custom