ШИМ и контроль угла отлажене на 417 более менее

Оптимизированы конфиг дефайны - в мкс и мс, а не тиках
This commit is contained in:
Razvalyaev 2025-11-20 19:13:42 +03:00
parent 2b22c5b0eb
commit d918ffb860
19 changed files with 296 additions and 192 deletions

View File

@ -33,7 +33,7 @@
#define UPP_SIMULATE_I ///< Симулировт токи а не брать с АЦП
/**
* @addtogroup UPP_DEFAULT_PARAMS Default params for external flash
* @addtogroup UPP_PARAMS_DEFAULT Default params for external flash
* @ingroup UPP_CONFIG
* @brief Дефолтные параметры для внешней памяти. Они применятся по команде или по ошибке
* @details Префиксы
@ -41,11 +41,10 @@
*/
/* Номинальные параметры */
/* Уставки по температурам */
#define SETPOINT_TEMP_WARN 70
#define SETPOINT_TEMP_ERR 85
/* Номинальные параметры */
#define NOM_PHASE_NUMB 3
#define NOM_U_V_DEFAULT 690
@ -78,7 +77,7 @@
#define ANGLE_MAX_PERCENT_DEFAULT 0.8
#define ANGLE_MIN_PERCENT_DEFAULT 0.1
#define ANGLE_PID_KP_COEF_DEFAULT 1.0
#define ANGLE_PID_KI_COEF_DEFAULT 0.1
#define ANGLE_PID_KI_COEF_DEFAULT 0.01
#define ANGLE_PID_KD_COEF_DEFAULT 0
#define ANGLE_REF_ALPHA_COEF_DEFAULT 0.0001
@ -99,7 +98,7 @@
#define PWM_THYR_FREQUENCY_HZ_DEFAULT 20000
#define PWM_THYR_PULSE_NUMBER_DEFAULT 20
/** //UPP_DEFAULT_PARAMS
/** //UPP_PARAMS_DEFAULT
* @}
*/
@ -111,19 +110,18 @@
* @{
*/
/* Периоды вызова всякого */
/* Периоды обновления всякого */
#define PM_ADC_PERIOD_US 30 ///< Период опроса АЦП в мкс
#define PM_SLOW_PERIOD_CNT 20 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US
#define PM_TEMP_SLOW_PERIOD_CNT 200 ///< Период обновления датчиков температуры в тиках @ref PM_SLOW_PERIOD_CNT
#define PM_F_SLOW_PERIOD_CNT 2000 ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT
#define UPP_SLOW_TICKS_FOR_INIT 20000 ///< Сколько тиков ждать медленных измерений ждать перед переходом в готовность
#define PM_SLOW_PERIOD_US 500 ///< Период обновления медленных расчетов в мкс (чтобы делилось на @ref PM_ADC_PERIOD_US)
#define PM_TEMP_SLOW_PERIOD_MS 1000 ///< Период опроса АЦП в мс
#define PM_F_SLOW_PERIOD_MS 40 ///< Период обновления частоты в мс
#define UPP_INIT_BEFORE_READY_MS 2000 ///< Сколько сканировать сеть, перед выставлением состояния готовности
/* Частоты таймеров в МГц*/
#define US_TIM5_FREQ_MHZ 90 ///< Частота тиков таймера ШИМ (1-4 каналы)
#define ADC_TIM8_FREQ_MZH 180 ///< Частота тиков таймера АЦП
#define PWM_TIM1_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (1-4 каналы)
#define PWM_TIM3_FREQ_MHZ 90 ///< Частота тиков таймера ШИМ (5-6 каналы)
#define PWM_TIM8_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (5-6 каналы)
#define US_TIM5_FREQ_MHZ 90 ///< Частота тиков микросекундного таймера
#define ADC_TIM3_FREQ_MZH 90 ///< Частота тиков таймера АЦП
#define ANGLE_TIM2_FREQ_MHZ 90 ///< Частота тиков таймера отсчета угла открытия тиристоров
@ -132,17 +130,17 @@
// ===== ОТЛАДОЧНЫЕ ШТУКИ ДЛЯ 417 ======
#if defined(STM32F417xx)
#undef US_TIM5_FREQ_MHZ
#undef ADC_TIM8_FREQ_MZH
#undef PWM_TIM1_FREQ_MHZ
#undef PWM_TIM3_FREQ_MHZ
#undef PWM_TIM8_FREQ_MHZ
#undef US_TIM5_FREQ_MHZ
#undef ADC_TIM3_FREQ_MZH
#undef ANGLE_TIM2_FREQ_MHZ
// У 417 меньше частота поэтому меняем прескалер
#define US_TIM5_FREQ_MHZ 84 ///< Частота тиков таймера ШИМ (1-4 каналы)
#define ADC_TIM8_FREQ_MZH 168 ///< Частота тиков таймера АЦП
#define PWM_TIM1_FREQ_MHZ 168 ///< Частота тиков таймера ШИМ (1-4 каналы)
#define PWM_TIM3_FREQ_MHZ 84 ///< Частота тиков таймера ШИМ (5-6 каналы)
#define PWM_TIM8_FREQ_MHZ 168 ///< Частота тиков таймера ШИМ (5-6 каналы)
#define US_TIM5_FREQ_MHZ 84 ///< Частота тиков микросекундного таймера
#define ADC_TIM3_FREQ_MZH 84 ///< Частота тиков таймера АЦП
#define ANGLE_TIM2_FREQ_MHZ 84 ///< Частота тиков таймера отсчета угла открытия тиристоров
#define HAL_PWREx_EnableOverDrive() HAL_ERROR

View File

@ -27,7 +27,7 @@
* @brief Список аварий УПП
*/
typedef enum {
UPP_Not_Init = 0, ///< УПП не инициализирован
UPP_Init = 0, ///< УПП не инициализирован
UPP_Ready = 1, ///< УПП в готовности
UPP_Work = 2, ///< УПП в работе, управляет тиристорами
UPP_Error = 3, ///< УПП в аварии
@ -96,7 +96,7 @@ typedef struct {
/**
* @brief Структура параметров УПП от ПУИ
* @details Параметры по умолчанию приведены в @ref UPP_DEFAULT_PARAMS
* @details Параметры по умолчанию приведены в @ref UPP_PARAMS_DEFAULT
* @note Защиты X приведены в @ref UPP_ErrorType_t
*/
typedef struct {
@ -149,20 +149,26 @@ typedef struct {
* @brief Дефайны УПП которые используютяс исключительно внутри программы
* @{
*/
#define PM_SLOW_PERIOD_US (PM_ADC_PERIOD_US*PM_SLOW_PERIOD_CNT)
#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000)
/* Перерасчеты в тики */
#define PM_SLOW_PERIOD_CNT (PM_SLOW_PERIOD_US/PM_ADC_PERIOD_US) ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US
#define US_TO_SLOW_TICKS(_us_) ((_us_)/PM_SLOW_PERIOD_US)
#define MS_TO_SLOW_TICKS(_ms_) US_TO_SLOW_TICKS((_ms_)*1000)
#define PM_F_SLOW_PERIOD_CNT (MS_TO_SLOW_TICKS(PM_F_SLOW_PERIOD_MS)) ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT
/* Перерасчеты в тики */
#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000) ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT
/* Дефайны для "удобного" доступа к структурам */
#define PARAM_INTERNAL MB_INTERNAL.param
#define PARAM_PUI MB_DATA.HoldRegs.pui_params
#define ERR_PUI errors.pui.err
#define ERR_PRIVATE errors.prvt.f.err
#define ERR_PRIVATE_CNT errors.prvt.cnt
/* Enum'ы УПП */
/**
* @brief Состояния полуволны
*/

View File

@ -62,6 +62,7 @@ void Error_Handler(void);
/* USER CODE END EFP */
/* Private defines -----------------------------------------------------------*/
#define angletim htim2
#define mb_huart huart3
#define mbdbg_htim htim11
#define PWM_CHANNEL_1 TIM_CHANNEL_1
@ -69,19 +70,18 @@ void Error_Handler(void);
#define PWM_CHANNEL_3 TIM_CHANNEL_3
#define PWM_CHANNEL_4 TIM_CHANNEL_4
#define mem_hspi hspi3
#define ANGLE_CHANNEL_2 TIM_CHANNEL_2
#define ANGLE_CHANNEL_3 TIM_CHANNEL_3
#define ANGLE_CHANNEL_1 TIM_CHANNEL_1
#define PWM_CHANNEL_5 TIM_CHANNEL_3
#define PWM_CHANNEL_6 TIM_CHANNEL_4
#define mb_htim htim12
#define adc_tim htim8
#define adc_tim htim3
#define usTick ustim.Instance->CNT
#define hpwm2 htim3
#define hpwm2 htim8
#define mb_dbg_huart huart6
#define ustim htim5
#define hpwm1 htim1
#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_Pin GPIO_PIN_3

View File

@ -104,7 +104,7 @@ HAL_StatusTypeDef ADC_Start(ADC_Periodic_t *adc, float PeriodUs)
HAL_TIM_Base_Stop(adc->htim);
// Запускаем таймер который будет запускать опрос АЦП с заданным периодом
__HAL_TIM_SET_AUTORELOAD_FORCE(adc->htim, TIM_MicrosToTick(PeriodUs, ADC_TIM4_FREQ_MZH-1));
__HAL_TIM_SET_AUTORELOAD_FORCE(adc->htim, TIM_MicrosToTick(PeriodUs, ADC_TIM3_FREQ_MZH-1));
res = HAL_TIM_Base_Start(adc->htim);
if(res != HAL_OK)

View File

@ -88,7 +88,7 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
/* Инициализация среднего фильтра для температур */
for(int i = 0; i < ADC_NUMB_OF_T_CHANNELS; i++)
{
if(FilterAverage_Init(&hpm->avg[AVG_TEMP1+i], PM_TEMP_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT))
if(FilterAverage_Init(&hpm->avg[AVG_TEMP1+i], MS_TO_SLOW_TICKS(PM_TEMP_SLOW_PERIOD_MS), FILTER_MODE_DEFAULT))
return HAL_ERROR;
Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]);
@ -96,7 +96,7 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
/* Инициализация среднего фильтра для частот */
for(int i = 0; i < 3; i++)
{
if(FilterAverage_Init(&hpm->avg[AVG_FBA+i], PM_F_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT))
if(FilterAverage_Init(&hpm->avg[AVG_FBA+i], MS_TO_SLOW_TICKS(PM_F_SLOW_PERIOD_MS), FILTER_MODE_DEFAULT))
return HAL_ERROR;
Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]);

View File

@ -50,7 +50,7 @@ void MX_ADC3_Init(void)
hadc3.Init.ContinuousConvMode = DISABLE;
hadc3.Init.DiscontinuousConvMode = DISABLE;
hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T8_TRGO;
hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO;
hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc3.Init.NbrOfConversion = 6;
hadc3.Init.DMAContinuousRequests = ENABLE;

View File

@ -62,13 +62,13 @@ void MX_GPIO_Init(void)
HAL_GPIO_WritePin(DO2_GPIO_Port, DO2_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(DO3_GPIO_Port, DO3_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(DO3_GPIO_Port, DO3_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(DO5_GPIO_Port, DO5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, DO5_Pin|DO4_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, DO4_Pin|RDO4_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(RDO4_GPIO_Port, RDO4_Pin, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, DO1_Pin|RDO1_Pin|SCIDE2_Pin|SCIDE1_Pin

View File

@ -22,7 +22,6 @@
#include "can.h"
#include "dma.h"
#include "iwdg.h"
#include "rtc.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
@ -108,7 +107,6 @@ int main(void)
MX_USART3_UART_Init();
MX_CAN1_Init();
MX_IWDG_Init();
//MX_RTC_Init();
MX_TIM1_Init();
MX_TIM3_Init();
MX_USART6_UART_Init();
@ -123,11 +121,11 @@ int main(void)
__HAL_TIM_SET_PRESCALER_FORCE(&ustim, US_TIM5_FREQ_MHZ-1);
#if defined(STM32F417xx)
// т.к. нет епромки выставляем дефолтные
UPP_SetDefault(1, 1);
UPP_Params_SetDefault(1, 1);
#endif
#else //MATLAB
#endif //MATLAB
UPP_Init();
UPP_App_Init();
/* USER CODE END 2 */
/* Infinite loop */

View File

@ -53,7 +53,7 @@ void MX_TIM1_Init(void)
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 65535;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.RepetitionCounter = 20;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
@ -68,6 +68,10 @@ void MX_TIM1_Init(void)
{
Error_Handler();
}
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)
@ -184,9 +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};
/* USER CODE BEGIN TIM3_Init 1 */
@ -206,42 +208,15 @@ void MX_TIM3_Init(void)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
{
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.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM3_Init 2 */
/* USER CODE END TIM3_Init 2 */
HAL_TIM_MspPostInit(&htim3);
}
/* TIM5 init function */
@ -294,6 +269,8 @@ void MX_TIM8_Init(void)
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
/* USER CODE BEGIN TIM8_Init 1 */
@ -301,9 +278,9 @@ void MX_TIM8_Init(void)
htim8.Instance = TIM8;
htim8.Init.Prescaler = 0;
htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
htim8.Init.Period = 1800-1;
htim8.Init.Period = 65535;
htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim8.Init.RepetitionCounter = 0;
htim8.Init.RepetitionCounter = 20;
htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim8) != HAL_OK)
{
@ -314,15 +291,50 @@ void MX_TIM8_Init(void)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
if (HAL_TIM_PWM_Init(&htim8) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_OnePulse_Init(&htim8, TIM_OPMODE_SINGLE) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM8_Init 2 */
/* USER CODE END TIM8_Init 2 */
HAL_TIM_MspPostInit(&htim8);
}
/* TIM11 init function */
@ -505,27 +517,27 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
/* USER CODE END TIM1_MspPostInit 1 */
}
else if(timHandle->Instance==TIM3)
else if(timHandle->Instance==TIM8)
{
/* USER CODE BEGIN TIM3_MspPostInit 0 */
/* USER CODE BEGIN TIM8_MspPostInit 0 */
/* USER CODE END TIM3_MspPostInit 0 */
/* USER CODE END TIM8_MspPostInit 0 */
__HAL_RCC_GPIOC_CLK_ENABLE();
/**TIM3 GPIO Configuration
PC8 ------> TIM3_CH3
PC9 ------> TIM3_CH4
/**TIM8 GPIO Configuration
PC8 ------> TIM8_CH3
PC9 ------> TIM8_CH4
*/
GPIO_InitStruct.Pin = PWM5_Pin|PWM6_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* USER CODE BEGIN TIM3_MspPostInit 1 */
/* USER CODE BEGIN TIM8_MspPostInit 1 */
/* USER CODE END TIM3_MspPostInit 1 */
/* USER CODE END TIM8_MspPostInit 1 */
}
}

View File

@ -38,12 +38,10 @@ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle)
Angle_Reset(hangle, UPP_PHASE_B);
Angle_Reset(hangle, UPP_PHASE_C);
// Инициализация углов
float angle_max = to_float(PARAM_INTERNAL.angle.Angle_Max, 65535);
float angle_min = to_float(PARAM_INTERNAL.angle.Angle_Min, 65535);
hangle->f.Initialized = 1;
return HAL_OK;
}
@ -121,8 +119,8 @@ void Angle_PID_Reset(Angle_Handle_t *hangle)
* @brief Выставление степени открытия тиристоров.
* @param hangle Указатель на таймер
* @param OpenLevel Насколько открыть тиристор:
- 0 - полностбю закрыт,
- 1 - полностью открыт
- 0 - максимально закрыт,
- 1 - максимально открыт
* @return HAL Status.
*/
HAL_StatusTypeDef Angle_SetAngle(Angle_Handle_t *hangle, float OpenLevel)
@ -190,6 +188,7 @@ HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float P
switch(Phase)
{
case UPP_PHASE_A:
__HAL_TIM_CLEAR_IT(hangle->htim, TIM_IT_CC1); // очищаем флаг навсякий
__HAL_TIM_SET_COMPARE(hangle->htim, ANGLE_CHANNEL_1, ccr_ticks);
// Если слишком маленький timer_tick и счетчик уже перевалил за ccr, но не сгенерил прервыание:
if (__HAL_TIM_GET_COMPARE(hangle->htim, ANGLE_CHANNEL_1) <= __HAL_TIM_GET_COUNTER(hangle->htim))
@ -203,6 +202,7 @@ HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float P
break;
case UPP_PHASE_B:
__HAL_TIM_CLEAR_IT(hangle->htim, TIM_IT_CC2); // очищаем флаг навсякий
__HAL_TIM_SET_COMPARE(hangle->htim, ANGLE_CHANNEL_2, ccr_ticks);
// Если слишком маленький timer_tick и счетчик уже перевалил за ccr, но не сгенерил прервыание:
if (__HAL_TIM_GET_COMPARE(hangle->htim, ANGLE_CHANNEL_2) <= __HAL_TIM_GET_COUNTER(hangle->htim))
@ -215,6 +215,7 @@ HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float P
break;
case UPP_PHASE_C:
__HAL_TIM_CLEAR_IT(hangle->htim, TIM_IT_CC3); // очищаем флаг навсякий
__HAL_TIM_SET_COMPARE(hangle->htim, ANGLE_CHANNEL_3, ccr_ticks);
// Если слишком маленький timer_tick и счетчик уже перевалил за ccr, но не сгенерил прервыание:
if (__HAL_TIM_GET_COMPARE(hangle->htim, ANGLE_CHANNEL_3) <= __HAL_TIM_GET_COUNTER(hangle->htim))

View File

@ -60,14 +60,17 @@ HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm)
PWM_SetConfig(hpwm, PARAM_INTERNAL.pwm.PhaseMask, PARAM_INTERNAL.pwm.Frequency, PARAM_INTERNAL.pwm.PulseNumber);
PWM_Stop(hpwm, 0, 1);
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);
PWM_Stop(hpwm, 0, 1);
#ifndef PWM_HARDWARE_IMPULSES_CONTROL
HAL_TIM_Base_Start_IT(&hpwm1);
#endif
return HAL_OK;
}
@ -103,13 +106,26 @@ HAL_StatusTypeDef PWM_Start(PWM_Handle_t *hpwm, UPP_Phase_t Phase)
// Запуск только если таймер в режиме ожидания
case PWM_THYR_TIM_WAIT:
#ifndef PWM_HARDWARE_IMPULSES_CONTROL
hpwm->Phase[Phase]->State = PWM_THYR_TIM_START;
return HAL_OK;
#else
hpwm->Phase[Phase]->State = PWM_THYR_TIM_ACTIVE;
if(hpwm->Config.PulseNumber)
hpwm->Phase[Phase]->htim->Instance->RCR = hpwm->Config.PulseNumber-1;
else
return HAL_ERROR;
__PWM_SetOutputState(hpwm->Phase[Phase], PWM_ENABLE);
hpwm->f.Running++;
return HAL_TIM_Base_Start_IT(hpwm->Phase[Phase]->htim);
#endif
default:
return HAL_ERROR;
}
return HAL_ERROR;
}
@ -127,6 +143,25 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_
{
if(assert_upp(hpwm))
return HAL_ERROR;
// Если force_stop_all - сбрасываем ВСЕ КАНАЛЫ
if(force_stop_all)
{
// в первую очередь выключаем канал, потом выставим режим каналов
__HAL_TIM_MOE_DISABLE(&hpwm1);
// в первую очередь выключаем канал, потом выставим режим каналов
__HAL_TIM_MOE_DISABLE(&hpwm2);
for(int ch = 0; ch < 6; ch++)
{
__PWM_SetOutputState(&hpwm->AllPhases[ch], PWM_DISABLE);
}
return HAL_OK;
}
// Если НЕ force_stop_all - сбрасываем ТОЛЬКО заданный канал
else
{
// Если канал дурацкий - возвращаем ошибку
if(Phase >= 3)
{
@ -136,22 +171,17 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_
return HAL_ERROR;
hpwm->Phase[Phase]->State = PWM_THYR_DISABLED;
// Если не force_stop_all - сбрасываем только текущий канал
if (!force_stop_all)
{
__PWM_SetOutputState(hpwm->Phase[Phase], PWM_DISABLE);
}
// Если force_stop_all - сбрасываем ВСЕ КАНАЛЫ
else {
for(int ch = 0; ch < 6; ch++)
{
__PWM_SetOutputState(&hpwm->AllPhases[ch], PWM_DISABLE);
}
}
#ifdef PWM_HARDWARE_IMPULSES_CONTROL
if(hpwm->f.Running)
hpwm->f.Running--;
HAL_TIM_Base_Stop(hpwm->Phase[Phase]->htim);
#endif
return HAL_OK;
}
}
/**
* @brief Хендл ШИМ тиристоров.
* @param hpwm Указатель на хендл ШИМ тиристоров
@ -172,6 +202,7 @@ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm)
if (hPhase->htim == NULL)
continue;
#ifndef PWM_HARDWARE_IMPULSES_CONTROL
switch (hPhase->State)
{
case PWM_THYR_DISABLED: // канал отключен
@ -208,6 +239,14 @@ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm)
__PWM_SetOutputState(hPhase, PWM_DISABLE);
break;
}
#else //PWM_HARDWARE_IMPULSES_CONTROL
// после того как пачка импульсов прошла отключаем активный канал
if (hPhase->State == PWM_THYR_TIM_ACTIVE)
{
__PWM_SetOutputState(hPhase, PWM_DISABLE);
HAL_TIM_Base_Stop(hPhase->htim);
}
#endif
}
return HAL_OK;
}
@ -233,7 +272,7 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t
hpwm->Config.Frequency = Frequency;
// Высставление периодов
__HAL_TIM_SET_AUTORELOAD(&hpwm1, TIM_FreqToTick(Frequency, PWM_TIM1_FREQ_MHZ-1));
__HAL_TIM_SET_AUTORELOAD(&hpwm2, TIM_FreqToTick(Frequency, PWM_TIM3_FREQ_MHZ-1));
__HAL_TIM_SET_AUTORELOAD(&hpwm2, TIM_FreqToTick(Frequency, PWM_TIM8_FREQ_MHZ-1));
// Скважности 50/50
__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);
@ -249,7 +288,11 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t
PWM_Stop(hpwm, 0, 1);
#ifndef PWM_HARDWARE_IMPULSES_CONTROL
return HAL_TIM_Base_Start_IT(&hpwm1);
#else
return HAL_OK;
#endif
}
@ -317,6 +360,7 @@ HAL_StatusTypeDef PWM_SetPolarity(PWM_Handle_t *hpwm, int polarity)
}
return HAL_OK;
}
/**
* @brief Установка режима для канала ШИМ.
* @param hpwm Указатель на хендл ШИМ тиристоров
@ -331,9 +375,9 @@ static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state
if (hCh->htim == NULL)
return HAL_ERROR;
uint32_t ch_mode = state;
// выставляем режим каналов
switch(hCh->ChMask)
{
case TIM_CHANNEL_1:
@ -355,5 +399,12 @@ static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state
default:
break;
}
// в последнюю очередь включаем выход. Перед этим настраиваем каналы на ШИМ
if(state == PWM_ENABLE)
{
__HAL_TIM_MOE_ENABLE(hCh->htim);
}
return HAL_OK;
}

View File

@ -10,11 +10,11 @@
#define PWM_HARDWARE_IMPULSES_CONTROL
#define PWM_ENABLE TIM_OCMODE_PWM2
#define PWM_DISABLE TIM_OCMODE_FORCED_ACTIVE
#define PWM_DISABLE TIM_OCMODE_FORCED_INACTIVE

View File

@ -11,15 +11,15 @@
UPP_t upp;
float dbg_iref = 1;
int dbg_polarity = 1;
// ОСНОВНОЙ ЦИКЛ main.c
int dbg_polarity = 0;
/**
* @brief Инициализация УПП.
* @return 0 - если ОК, >1 если ошибка.
*/
int UPP_Init(void)
int UPP_App_Init(void)
{
upp.workmode = UPP_Init;
/* Очищаем входы */
UPP_IO_Init();
@ -46,8 +46,6 @@ int UPP_Init(void)
{
return 1;
}
upp.workmode = UPP_Ready;
return 0;
}
@ -57,7 +55,7 @@ int UPP_Init(void)
*/
int UPP_PreWhile(void)
{
UPP_Params_InternalControl();
UPP_Params_ControlInternal();
if(Angle_SetRange(&upp.hangle, 0.0, 0.8) != HAL_OK)
return 1;
@ -102,7 +100,7 @@ int UPP_While(void)
// Сброс на дефолтные по запросу
if(upp.call->set_default_pui || upp.call->set_default_internal)
{
UPP_SetDefault(upp.call->set_default_pui, upp.call->set_default_internal);
UPP_Params_SetDefault(upp.call->set_default_pui, upp.call->set_default_internal);
}
// Медленные расчеты
@ -115,11 +113,16 @@ int UPP_While(void)
switch(upp.workmode)
{
/* Состояние инициализации */
case UPP_Not_Init:
if(slow_cnt > UPP_SLOW_TICKS_FOR_INIT)
case UPP_Init:
if(slow_cnt > MS_TO_SLOW_TICKS(UPP_INIT_BEFORE_READY_MS))
{
slow_cnt = 0; // сбрасываем чтобы потом еще раз инициализироватся
upp.workmode = UPP_Ready;
}
else
{
slow_cnt++;
}
break;
/* Состояние готовности */
@ -147,7 +150,7 @@ int UPP_While(void)
UPP_DO.Error(DISABLE);
// если пришла команда на остановку
if (!upp.call->go)
upp.workmode = UPP_Ready;
upp.workmode = UPP_Init;
// Регулирование тиристоров
#ifndef UPP_SIMULATE_I // берем с АЦП
@ -181,7 +184,7 @@ int UPP_While(void)
UPP_DO.Error(ENABLE);
// Находимся до тех пор пока ошибки не будет устранена
if(errors.common == Err_None)
upp.workmode = UPP_Not_Init;
upp.workmode = UPP_Init;
retval = 1;
break;
@ -189,7 +192,7 @@ int UPP_While(void)
UPP_Errors_Handle();
UPP_Params_InternalControl();
UPP_Params_ControlInternal();
upp.pm.f.runSlow = 0;
@ -209,7 +212,7 @@ int UPP_While(void)
*/
void UPP_Tick(void)
{
if(upp.workmode == UPP_Not_Init)
if(upp.workmode == UPP_Init)
return;
}

View File

@ -49,7 +49,7 @@ extern UPP_t upp;
/* Инициализация УПП */
int UPP_Init(void);
int UPP_App_Init(void);
/* Инициализация основного цикла УПП. */
int UPP_PreWhile(void);
/* Основной цикл УПП. */

View File

@ -18,7 +18,7 @@ static void __AngleSetLimit(void);
* @brief Контроль внутренних параметров УПП.
* @return HAL Status.
*/
void UPP_Params_InternalControl(void)
void UPP_Params_ControlInternal(void)
{
__AngleSetLimit();
if(upp.call->go) // при запущеном УПП ничего не меняем
@ -171,13 +171,22 @@ void UPP_Params_InternalControl(void)
}
/**
* @brief Установка параметров на дефолтные значения @ref UPP_DEFAULT_PARAMS.
* @brief Контроль внутренних параметров УПП.
* @return HAL Status.
*/
void UPP_Params_Saturate(void)
{
}
/**
* @brief Установка параметров на дефолтные значения @ref UPP_PARAMS_DEFAULT.
* @param pui_default Сбросить параметры ПУИ
* @param internal_default Сбросить внутренние параметры
* @return HAL Status.
*/
void UPP_SetDefault(int pui_default, int internal_default)
void UPP_Params_SetDefault(int pui_default, int internal_default)
{
if(pui_default)
{

View File

@ -96,8 +96,8 @@ typedef struct
/* Контроль внутренних параметров УПП. */
void UPP_Params_InternalControl(void);
void UPP_Params_ControlInternal(void);
/* Установка параметров на дефолтные значения */
void UPP_SetDefault(int pui_default, int internal_default);
void UPP_Params_SetDefault(int pui_default, int internal_default);
#endif //_UPP_PARAMS_H

View File

@ -331,7 +331,7 @@
<Type>0</Type>
<LineNumber>407</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134233366</Address>
<Address>134233418</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
@ -368,12 +368,12 @@
<Ww>
<count>1</count>
<WinNumber>1</WinNumber>
<ItemText>upp</ItemText>
<ItemText>upp,0x0A</ItemText>
</Ww>
<Ww>
<count>2</count>
<WinNumber>1</WinNumber>
<ItemText>uwTick</ItemText>
<ItemText>uwTick,0x0A</ItemText>
</Ww>
<Ww>
<count>3</count>
@ -388,7 +388,7 @@
<Ww>
<count>5</count>
<WinNumber>1</WinNumber>
<ItemText>hbt</ItemText>
<ItemText>hbt,0x0A</ItemText>
</Ww>
<Ww>
<count>6</count>
@ -410,6 +410,31 @@
<WinNumber>1</WinNumber>
<ItemText>dbg_iref</ItemText>
</Ww>
<Ww>
<count>10</count>
<WinNumber>1</WinNumber>
<ItemText>upp.call-&gt;reset_mcu</ItemText>
</Ww>
<Ww>
<count>11</count>
<WinNumber>1</WinNumber>
<ItemText>upp.pm.zc.Channel[0].HalfWave</ItemText>
</Ww>
<Ww>
<count>12</count>
<WinNumber>1</WinNumber>
<ItemText>upp.call-&gt;reserved</ItemText>
</Ww>
<Ww>
<count>13</count>
<WinNumber>1</WinNumber>
<ItemText>\\Debug_F417\../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c\uwTick</ItemText>
</Ww>
<Ww>
<count>14</count>
<WinNumber>1</WinNumber>
<ItemText>htim1</ItemText>
</Ww>
</WatchWindow1>
<WatchWindow2>
<Ww>
@ -518,18 +543,8 @@
<LogicAnalyzers>
<Wi>
<IntNumber>0</IntNumber>
<FirstString>`upp.pm.measured.real.U[0]</FirstString>
<SecondString>0000000000000000007097C00000000000709740000000000000000000000000000000007570702E706D2E6D656173757265642E7265616C2E555B305D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000001000000731CC7711CC7D13F1400000000000000000000000000000000000000A49F0008</SecondString>
</Wi>
<Wi>
<IntNumber>1</IntNumber>
<FirstString>`upp.pm.measured.real.U[1]</FirstString>
<SecondString>0080000000000000007097C00000000000709740000000000000000000000000000000007570702E706D2E6D656173757265642E7265616C2E555B315D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000002000000398EE3388EE3D83F1400000000000000000000000000000000000000A49F0008</SecondString>
</Wi>
<Wi>
<IntNumber>2</IntNumber>
<FirstString>`upp.pm.measured.final.F[0]</FirstString>
<SecondString>0000800000000000000000000000000000805140000000000000000000000000000000007570702E706D2E6D656173757265642E66696E616C2E465B305D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000003000000555555555555D53F140000000000000000000000000000000000000028020008</SecondString>
<FirstString>`upp.pm.zc.Channel[0].HalfWave</FirstString>
<SecondString>0000000000000000000000000000000000000040000000000000000000000000000000007570702E706D2E7A632E4368616E6E656C5B305D2E48616C66576176650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000001000000000000000000F03F1400000000000000000000000000000000000000FC9E0008</SecondString>
</Wi>
</LogicAnalyzers>
<SystemViewers>
@ -545,6 +560,10 @@
<Name>System Viewer\TIM14</Name>
<WinId>35903</WinId>
</Entry>
<Entry>
<Name>System Viewer\TIM2</Name>
<WinId>35900</WinId>
</Entry>
<Entry>
<Name>System Viewer\TIM5</Name>
<WinId>35905</WinId>

View File

@ -94,25 +94,25 @@ Mcu.Pin23=PB11
Mcu.Pin24=PB13
Mcu.Pin25=PG6
Mcu.Pin26=PC6
Mcu.Pin27=PC8
Mcu.Pin28=PC9
Mcu.Pin29=PA8
Mcu.Pin27=PC7
Mcu.Pin28=PC8
Mcu.Pin29=PC9
Mcu.Pin3=PE5
Mcu.Pin30=PA9
Mcu.Pin31=PA10
Mcu.Pin32=PA11
Mcu.Pin33=PA12
Mcu.Pin34=PA13
Mcu.Pin35=PA14
Mcu.Pin36=PA15
Mcu.Pin37=PC10
Mcu.Pin38=PC11
Mcu.Pin39=PC12
Mcu.Pin30=PA8
Mcu.Pin31=PA9
Mcu.Pin32=PA10
Mcu.Pin33=PA11
Mcu.Pin34=PA12
Mcu.Pin35=PA13
Mcu.Pin36=PA14
Mcu.Pin37=PA15
Mcu.Pin38=PC10
Mcu.Pin39=PC11
Mcu.Pin4=PE6
Mcu.Pin40=PD2
Mcu.Pin41=PD3
Mcu.Pin42=PD6
Mcu.Pin43=PG9
Mcu.Pin40=PC12
Mcu.Pin41=PD2
Mcu.Pin42=PD3
Mcu.Pin43=PD6
Mcu.Pin44=PG12
Mcu.Pin45=PG15
Mcu.Pin46=PB3
@ -128,16 +128,16 @@ Mcu.Pin54=VP_RTC_VS_RTC_Activate
Mcu.Pin55=VP_RTC_VS_RTC_Calendar
Mcu.Pin56=VP_SYS_VS_tim14
Mcu.Pin57=VP_TIM1_VS_ClockSourceINT
Mcu.Pin58=VP_TIM2_VS_ClockSourceINT
Mcu.Pin59=VP_TIM2_VS_no_output1
Mcu.Pin58=VP_TIM1_VS_OPM
Mcu.Pin59=VP_TIM2_VS_ClockSourceINT
Mcu.Pin6=PC14/OSC32_IN
Mcu.Pin60=VP_TIM2_VS_no_output2
Mcu.Pin61=VP_TIM2_VS_no_output3
Mcu.Pin62=VP_TIM3_VS_ClockSourceINT
Mcu.Pin63=VP_TIM5_VS_ClockSourceINT
Mcu.Pin64=VP_TIM8_VS_ControllerModeTrigger
Mcu.Pin60=VP_TIM2_VS_no_output1
Mcu.Pin61=VP_TIM2_VS_no_output2
Mcu.Pin62=VP_TIM2_VS_no_output3
Mcu.Pin63=VP_TIM3_VS_ClockSourceINT
Mcu.Pin64=VP_TIM5_VS_ClockSourceINT
Mcu.Pin65=VP_TIM8_VS_ClockSourceINT
Mcu.Pin66=VP_TIM8_VS_ClockSourceITR
Mcu.Pin66=VP_TIM8_VS_OPM
Mcu.Pin67=VP_TIM11_VS_ClockSourceINT
Mcu.Pin68=VP_TIM12_VS_ClockSourceINT
Mcu.Pin7=PC15/OSC32_OUT
@ -145,7 +145,7 @@ Mcu.Pin8=PF6
Mcu.Pin9=PF7
Mcu.PinsNb=69
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;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.UserConstants=angletim,htim2;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;ANGLE_CHANNEL_2,TIM_CHANNEL_2;ANGLE_CHANNEL_3,TIM_CHANNEL_3;ANGLE_CHANNEL_1,TIM_CHANNEL_1;PWM_CHANNEL_5,TIM_CHANNEL_3;PWM_CHANNEL_6,TIM_CHANNEL_4;mb_htim,htim12;adc_tim,htim3;usTick,ustim.Instance->CNT;hpwm2,htim8;mb_dbg_huart,huart6;ustim,htim5;hpwm1,htim1
Mcu.UserName=STM32F427ZGTx
MxCube.Version=6.12.1
MxDb.Version=DB.6.0.121
@ -191,7 +191,7 @@ PA4.Signal=GPIO_Output
PA5.GPIOParameters=PinState,GPIO_Label
PA5.GPIO_Label=DO4
PA5.Locked=true
PA5.PinState=GPIO_PIN_SET
PA5.PinState=GPIO_PIN_RESET
PA5.Signal=GPIO_Output
PA6.GPIOParameters=PinState,GPIO_Label
PA6.GPIO_Label=RDO4
@ -261,6 +261,8 @@ PC12.GPIOParameters=GPIO_Label
PC12.GPIO_Label=UM_SPI_MOSI
PC12.Mode=Full_Duplex_Master
PC12.Signal=SPI3_MOSI
PC13.GPIOParameters=GPIO_Label
PC13.GPIO_Label=DO3
PC13.Locked=true
PC13.Signal=GPIO_Output
PC14/OSC32_IN.Mode=LSE-External-Oscillator
@ -271,6 +273,11 @@ PC6.GPIOParameters=GPIO_Label
PC6.GPIO_Label=SCIT1
PC6.Mode=Asynchronous
PC6.Signal=USART6_TX
PC7.GPIOParameters=GPIO_Label
PC7.GPIO_Label=SCIR2
PC7.Locked=true
PC7.Mode=Asynchronous
PC7.Signal=USART6_RX
PC8.GPIOParameters=GPIO_Label
PC8.GPIO_Label=PWM5
PC8.Signal=S_TIM8_CH3
@ -347,6 +354,8 @@ PF9.GPIOParameters=GPIO_Label
PF9.GPIO_Label=AI_Ia
PF9.Mode=IN7
PF9.Signal=ADC3_IN7
PG12.GPIOParameters=GPIO_Label
PG12.GPIO_Label=ERR_24V
PG12.Locked=true
PG12.Signal=GPIO_Input
PG15.GPIOParameters=GPIO_Label
@ -358,10 +367,6 @@ PG6.GPIO_Label=UM_SPI_CS
PG6.GPIO_PuPd=GPIO_PULLDOWN
PG6.Locked=true
PG6.Signal=GPIO_Output
PG9.GPIOParameters=GPIO_Label
PG9.GPIO_Label=SCIR2
PG9.Mode=Asynchronous
PG9.Signal=USART6_RX
PH0/OSC_IN.Mode=HSE-External-Oscillator
PH0/OSC_IN.Signal=RCC_OSC_IN
PH1/OSC_OUT.Mode=HSE-External-Oscillator
@ -397,7 +402,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_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
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-true-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
@ -465,8 +470,9 @@ 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=Prescaler,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation4 CH4,Channel-PWM Generation3 CH3,TIM_MasterOutputTrigger
TIM1.IPParameters=Prescaler,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation4 CH4,Channel-PWM Generation3 CH3,TIM_MasterOutputTrigger,RepetitionCounter
TIM1.Prescaler=0
TIM1.RepetitionCounter=20
TIM1.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
TIM11.IPParameters=Prescaler
TIM11.Prescaler=180-1
@ -486,10 +492,11 @@ TIM5.IPParameters=Prescaler
TIM5.Prescaler=90-1
TIM8.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM8.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM8.IPParameters=Prescaler,Period,TIM_MasterSlaveMode,TIM_MasterOutputTrigger,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,OC4Preload_PWM
TIM8.IPParameters=Prescaler,Period,TIM_MasterSlaveMode,TIM_MasterOutputTrigger,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,OC4Preload_PWM,RepetitionCounter
TIM8.OC4Preload_PWM=ENABLE
TIM8.Period=65535
TIM8.Prescaler=0
TIM8.RepetitionCounter=20
TIM8.TIM_MasterOutputTrigger=TIM_TRGO_RESET
TIM8.TIM_MasterSlaveMode=TIM_MASTERSLAVEMODE_DISABLE
USART3.IPParameters=VirtualMode
@ -510,6 +517,8 @@ 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
@ -524,8 +533,6 @@ VP_TIM5_VS_ClockSourceINT.Mode=Internal
VP_TIM5_VS_ClockSourceINT.Signal=TIM5_VS_ClockSourceINT
VP_TIM8_VS_ClockSourceINT.Mode=Internal
VP_TIM8_VS_ClockSourceINT.Signal=TIM8_VS_ClockSourceINT
VP_TIM8_VS_ClockSourceITR.Mode=TriggerSource_ITR0
VP_TIM8_VS_ClockSourceITR.Signal=TIM8_VS_ClockSourceITR
VP_TIM8_VS_ControllerModeTrigger.Mode=Trigger Mode
VP_TIM8_VS_ControllerModeTrigger.Signal=TIM8_VS_ControllerModeTrigger
VP_TIM8_VS_OPM.Mode=OPM_bit
VP_TIM8_VS_OPM.Signal=TIM8_VS_OPM
board=custom