Типа запустилось, но все равно есть проблемы с расчетом угла

This commit is contained in:
2025-11-16 00:13:13 +03:00
parent 8041598cc5
commit 115be84ccd
10 changed files with 86 additions and 70 deletions

View File

@@ -126,6 +126,7 @@
#else
extern float dbg[16];
#define local_time() uwTick ///< Локальное время
//#define INCLUDE_GEN_OPTIMIZER ///< Подключить библиотеку для оптимизации параметров
#define INCLUDE_BIT_ACCESS_LIB ///< Подключить библиотеку с typedef с битовыми полями

View File

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

View File

@@ -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 ///< Таймер закончил свою работу в полупериоде

View File

@@ -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: