|
|
|
|
@@ -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])
|
|
|
|
|
|