Типа запустилось, но все равно есть проблемы с расчетом угла
This commit is contained in:
parent
8041598cc5
commit
115be84ccd
@ -250,7 +250,7 @@ void CC_PWM_Ch3_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
|
||||
}
|
||||
void CC_PWM_Ch4_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
|
||||
{ // определяет режим канала
|
||||
switch (TIMx->CCMR1 & TIM_CCMR1_OC2M)
|
||||
switch (TIMx->CCMR2 & TIM_CCMR1_OC2M)
|
||||
{
|
||||
case ((TIM_OCMODE_ACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // ACTIVE mode
|
||||
if (abs(TIMx->CNT - TIMx->CCR4) < 2*TIMS->tx_step)
|
||||
|
||||
@ -43,8 +43,10 @@ void deInitialize_MCU(void)
|
||||
memset(&MCU_CORTEX_MEM, 0, sizeof(MCU_CORTEX_MEM));
|
||||
memset(&htim1, 0, sizeof(htim1));
|
||||
|
||||
|
||||
|
||||
ClearStruct(upp);
|
||||
ClearStruct(htim1);
|
||||
ClearStruct(htim2);
|
||||
ClearStruct(htim3);
|
||||
ClearStruct(htim8);
|
||||
ClearStruct(htim11);
|
||||
@ -107,7 +109,7 @@ struct TIM_Sim tim14s;
|
||||
void Init_TIM_SIM(void)
|
||||
{
|
||||
#ifdef USE_TIM1
|
||||
memset(&tim1s, 0, sizeof(tim1s));
|
||||
memset(&tim1s, 0, sizeof(tim1s));
|
||||
tim1s.tx_cnt = TIM1->CNT;
|
||||
tim1s.tx_step = hmcu.sSimSampleTime * ABP2_TIMS_Value;
|
||||
|
||||
@ -121,7 +123,7 @@ void Init_TIM_SIM(void)
|
||||
tim1s.Channels.OC4_PIN_SHIFT = 11;
|
||||
#endif
|
||||
#ifdef USE_TIM2
|
||||
memset(&tim2s, 0, sizeof(tim2s));
|
||||
memset(&tim2s, 0, sizeof(tim2s));
|
||||
tim2s.tx_cnt = TIM2->CNT;
|
||||
tim2s.tx_step = hmcu.sSimSampleTime * ABP1_TIMS_Value;
|
||||
|
||||
@ -135,7 +137,7 @@ void Init_TIM_SIM(void)
|
||||
tim2s.Channels.OC4_PIN_SHIFT = 3;
|
||||
#endif
|
||||
#ifdef USE_TIM3
|
||||
memset(&tim3s, 0, sizeof(tim3s));
|
||||
memset(&tim3s, 0, sizeof(tim3s));
|
||||
tim3s.tx_cnt = TIM3->CNT;
|
||||
tim3s.tx_step = hmcu.sSimSampleTime * ABP1_TIMS_Value;
|
||||
|
||||
@ -149,7 +151,7 @@ void Init_TIM_SIM(void)
|
||||
tim3s.Channels.OC4_PIN_SHIFT = 9;
|
||||
#endif
|
||||
#ifdef USE_TIM4
|
||||
memset(&tim4s, 0, sizeof(tim4s));
|
||||
memset(&tim4s, 0, sizeof(tim4s));
|
||||
tim4s.tx_cnt = TIM4->CNT;
|
||||
tim4s.tx_step = hmcu.sSimSampleTime * ABP1_TIMS_Value;
|
||||
|
||||
@ -163,7 +165,7 @@ void Init_TIM_SIM(void)
|
||||
tim4s.Channels.OC4_PIN_SHIFT = 9;
|
||||
#endif
|
||||
#ifdef USE_TIM5
|
||||
memset(&tim5s, 0, sizeof(tim5s));
|
||||
memset(&tim5s, 0, sizeof(tim5s));
|
||||
tim5s.tx_cnt = TIM5->CNT;
|
||||
tim5s.tx_step = hmcu.sSimSampleTime * ABP1_TIMS_Value;
|
||||
|
||||
@ -177,7 +179,7 @@ void Init_TIM_SIM(void)
|
||||
tim5s.Channels.OC4_PIN_SHIFT = 3;
|
||||
#endif
|
||||
#ifdef USE_TIM6
|
||||
memset(&tim6s, 0, sizeof(tim6s));
|
||||
memset(&tim6s, 0, sizeof(tim6s));
|
||||
tim6s.tx_cnt = TIM6->CNT;
|
||||
tim6s.tx_step = hmcu.sSimSampleTime * ABP1_TIMS_Value;
|
||||
|
||||
|
||||
@ -79,7 +79,7 @@
|
||||
* @param _arr_ind_ Индекс выходного порта
|
||||
* @param _val_ind_ Индекс элемента в выходном массиве
|
||||
*/
|
||||
#define WriteOutputArray(_var_, _arr_ind_, _val_ind_) __WriteOutputArray(Buffer, (float)_var_, _arr_ind_, _val_ind_)
|
||||
#define WriteOutputArray(_var_, _arr_ind_, _val_ind_) __WriteOutputArray(Buffer, (float)(_var_), _arr_ind_, _val_ind_)
|
||||
|
||||
/** @brief Считывает значение из входного массива блока S-Function
|
||||
* @param _var_ Значение, которое необходимо записать (будет преобразовано в float)
|
||||
|
||||
@ -6,7 +6,9 @@
|
||||
#include "mcu_wrapper_conf.h"
|
||||
#include "app_wrapper.h"
|
||||
|
||||
#define PIN_READ(_verbname_) (_verbname_##_GPIO_Port->ODR & (_verbname_##_Pin)) ? 1 : 0
|
||||
float dbg[16];
|
||||
|
||||
#define PIN_READ(_verbname_) (_verbname_##_GPIO_Port->ODR & (_verbname_##_Pin)) ? 0 : 1
|
||||
|
||||
void Write_Thyristors(real_T* Buffer, int ind_port)
|
||||
{
|
||||
@ -75,11 +77,14 @@ void app_readInputs(const real_T* Buffer) {
|
||||
void app_writeOutputBuffer(real_T* Buffer) {
|
||||
// USER APP OUTPUT START
|
||||
Write_Thyristors(Buffer, 0);
|
||||
|
||||
Write_PowerMonitor(Buffer, 1);
|
||||
|
||||
|
||||
WriteOutputArray(TIM2->CNT, 2, 0);
|
||||
WriteOutputArray(TIM2->CCR1, 2, 1);
|
||||
|
||||
int nn = 0;
|
||||
WriteOutputArray(upp.hangle.htim->Instance->CNT, 2, nn++);
|
||||
WriteOutputArray(upp.hangle.htim->Instance->CCR1, 2, nn++);
|
||||
WriteOutputArray(upp.hangle.htim->Instance->CCR2, 2, nn++);
|
||||
WriteOutputArray(upp.hangle.htim->Instance->CCR3, 2, nn++);
|
||||
// USER APP OUTPUT END
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@ -126,6 +126,7 @@
|
||||
|
||||
#else
|
||||
|
||||
extern float dbg[16];
|
||||
#define local_time() uwTick ///< Локальное время
|
||||
//#define INCLUDE_GEN_OPTIMIZER ///< Подключить библиотеку для оптимизации параметров
|
||||
#define INCLUDE_BIT_ACCESS_LIB ///< Подключить библиотеку с typedef с битовыми полями
|
||||
|
||||
@ -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])
|
||||
|
||||
@ -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 ///< Таймер закончил свою работу в полупериоде
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user