/**
******************************************************************************
* @file mc_config.c
* @author Motor Control SDK Team, ST Microelectronics
* @brief Motor Control Subsystem components configuration and handler structures.
******************************************************************************
* @attention
*
*
© Copyright (c) 2019 STMicroelectronics.
* All rights reserved.
*
* This software component is licensed by ST under Ultimate Liberty license
* SLA0044, the "License"; You may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* www.st.com/SLA0044
*
******************************************************************************
*/
#include "main.h"
#include "mc_type.h"
#include "parameters_conversion.h"
#include "mc_parameters.h"
#include "mc_config.h"
/* USER CODE BEGIN Additional include */
/* USER CODE END Additional include */
#define FREQ_RATIO 1 /* Dummy value for single drive */
#define FREQ_RELATION HIGHEST_FREQ /* Dummy value for single drive */
#define OFFCALIBRWAIT_MS 0
#define OFFCALIBRWAIT_MS2 0
#include "pqd_motor_power_measurement.h"
/* USER CODE BEGIN Additional define */
/* USER CODE END Additional define */
PQD_MotorPowMeas_Handle_t PQD_MotorPowMeasM1 =
{
.wConvFact = PQD_CONVERSION_FACTOR
};
PQD_MotorPowMeas_Handle_t *pPQD_MotorPowMeasM1 = &PQD_MotorPowMeasM1;
/**
* @brief PI / PID Speed loop parameters Motor 1
*/
PID_Handle_t PIDSpeedHandle_M1 =
{
.hDefKpGain = (int16_t)PID_SPEED_KP_DEFAULT,
.hDefKiGain = (int16_t)PID_SPEED_KI_DEFAULT,
.wUpperIntegralLimit = (int32_t)IQMAX * (int32_t)SP_KIDIV,
.wLowerIntegralLimit = -(int32_t)IQMAX * (int32_t)SP_KIDIV,
.hUpperOutputLimit = (int16_t)IQMAX,
.hLowerOutputLimit = -(int16_t)IQMAX,
.hKpDivisor = (uint16_t)SP_KPDIV,
.hKiDivisor = (uint16_t)SP_KIDIV,
.hKpDivisorPOW2 = (uint16_t)SP_KPDIV_LOG,
.hKiDivisorPOW2 = (uint16_t)SP_KIDIV_LOG,
.hDefKdGain = 0x0000U,
.hKdDivisor = 0x0000U,
.hKdDivisorPOW2 = 0x0000U,
};
/**
* @brief PI / PID Iq loop parameters Motor 1
*/
PID_Handle_t PIDIqHandle_M1 =
{
.hDefKpGain = (int16_t)PID_TORQUE_KP_DEFAULT,
.hDefKiGain = (int16_t)PID_TORQUE_KI_DEFAULT,
.wUpperIntegralLimit = (int32_t)INT16_MAX * TF_KIDIV,
.wLowerIntegralLimit = (int32_t)-INT16_MAX * TF_KIDIV,
.hUpperOutputLimit = INT16_MAX,
.hLowerOutputLimit = -INT16_MAX,
.hKpDivisor = (uint16_t)TF_KPDIV,
.hKiDivisor = (uint16_t)TF_KIDIV,
.hKpDivisorPOW2 = (uint16_t)TF_KPDIV_LOG,
.hKiDivisorPOW2 = (uint16_t)TF_KIDIV_LOG,
.hDefKdGain = 0x0000U,
.hKdDivisor = 0x0000U,
.hKdDivisorPOW2 = 0x0000U,
};
/**
* @brief PI / PID Id loop parameters Motor 1
*/
PID_Handle_t PIDIdHandle_M1 =
{
.hDefKpGain = (int16_t)PID_FLUX_KP_DEFAULT,
.hDefKiGain = (int16_t)PID_FLUX_KI_DEFAULT,
.wUpperIntegralLimit = (int32_t)INT16_MAX * TF_KIDIV,
.wLowerIntegralLimit = (int32_t)-INT16_MAX * TF_KIDIV,
.hUpperOutputLimit = INT16_MAX,
.hLowerOutputLimit = -INT16_MAX,
.hKpDivisor = (uint16_t)TF_KPDIV,
.hKiDivisor = (uint16_t)TF_KIDIV,
.hKpDivisorPOW2 = (uint16_t)TF_KPDIV_LOG,
.hKiDivisorPOW2 = (uint16_t)TF_KIDIV_LOG,
.hDefKdGain = 0x0000U,
.hKdDivisor = 0x0000U,
.hKdDivisorPOW2 = 0x0000U,
};
/**
* @brief SpeednTorque Controller parameters Motor 1
*/
SpeednTorqCtrl_Handle_t SpeednTorqCtrlM1 =
{
.STCFrequencyHz = MEDIUM_FREQUENCY_TASK_RATE,
.MaxAppPositiveMecSpeedUnit = (uint16_t)(MAX_APPLICATION_SPEED_UNIT),
.MinAppPositiveMecSpeedUnit = (uint16_t)(MIN_APPLICATION_SPEED_UNIT),
.MaxAppNegativeMecSpeedUnit = (int16_t)(-MIN_APPLICATION_SPEED_UNIT),
.MinAppNegativeMecSpeedUnit = (int16_t)(-MAX_APPLICATION_SPEED_UNIT),
.MaxPositiveTorque = (int16_t)NOMINAL_CURRENT,
.MinNegativeTorque = -(int16_t)NOMINAL_CURRENT,
.ModeDefault = DEFAULT_CONTROL_MODE,
.MecSpeedRefUnitDefault = (int16_t)(DEFAULT_TARGET_SPEED_UNIT),
.TorqueRefDefault = (int16_t)DEFAULT_TORQUE_COMPONENT,
.IdrefDefault = (int16_t)DEFAULT_FLUX_COMPONENT,
};
PWMC_R3_2_Handle_t PWM_Handle_M1 =
{
{
.pFctGetPhaseCurrents = &R3_2_GetPhaseCurrents,
.pFctSwitchOffPwm = &R3_2_SwitchOffPWM,
.pFctSwitchOnPwm = &R3_2_SwitchOnPWM,
.pFctCurrReadingCalib = &R3_2_CurrentReadingPolarization,
.pFctTurnOnLowSides = &R3_2_TurnOnLowSides,
.pFctSetADCSampPointSectX = &R3_2_SetADCSampPointSectX,
.pFctIsOverCurrentOccurred = &R3_2_IsOverCurrentOccurred,
.pFctOCPSetReferenceVoltage = MC_NULL,
.pFctRLDetectionModeEnable = MC_NULL,
.pFctRLDetectionModeDisable = MC_NULL,
.pFctRLDetectionModeSetDuty = MC_NULL,
.hT_Sqrt3 = (PWM_PERIOD_CYCLES*SQRT3FACTOR)/16384u,
.Sector = 0,
.CntPhA = 0,
.CntPhB = 0,
.CntPhC = 0,
.SWerror = 0,
.TurnOnLowSidesAction = false,
.OffCalibrWaitTimeCounter = 0,
.Motor = M1,
.RLDetectionMode = false,
.Ia = 0,
.Ib = 0,
.Ic = 0,
.DTTest = 0,
.DTCompCnt = DTCOMPCNT,
.PWMperiod = PWM_PERIOD_CYCLES,
.OffCalibrWaitTicks = (uint16_t)((SYS_TICK_FREQUENCY * OFFCALIBRWAIT_MS)/ 1000),
.Ton = TON,
.Toff = TOFF
},
.Half_PWMPeriod = PWM_PERIOD_CYCLES/2u,
.PhaseAOffset = 0,
.PhaseBOffset = 0,
.PhaseCOffset = 0,
.pParams_str = &R3_2_ParamsM1
};
/**
* @brief SpeedNPosition sensor parameters Motor 1 - HALL
*/
HALL_Handle_t HALL_M1 =
{
._Super = {
.bElToMecRatio = POLE_PAIR_NUM,
.hMaxReliableMecSpeedUnit = (uint16_t)(1.15*MAX_APPLICATION_SPEED_UNIT),
.hMinReliableMecSpeedUnit = (uint16_t)(MIN_APPLICATION_SPEED_UNIT),
.bMaximumSpeedErrorsNumber = MEAS_ERRORS_BEFORE_FAULTS,
.hMaxReliableMecAccelUnitP = 65535,
.hMeasurementFrequency = TF_REGULATION_RATE_SCALED,
.DPPConvFactor = DPP_CONV_FACTOR,
},
.SensorPlacement = HALL_SENSORS_PLACEMENT,
.PhaseShift = (int16_t)(HALL_PHASE_SHIFT * 65536/360),
.SpeedSamplingFreqHz = MEDIUM_FREQUENCY_TASK_RATE,
.SpeedBufferSize = HALL_AVERAGING_FIFO_DEPTH,
.TIMClockFreq = HALL_TIM_CLK,
.TIMx = TIM2,
.ICx_Filter = M1_HALL_IC_FILTER,
.PWMFreqScaling = PWM_FREQ_SCALING,
.HallMtpa = HALL_MTPA,
.H1Port = M1_HALL_H1_GPIO_Port,
.H1Pin = M1_HALL_H1_Pin<<8,
.H2Port = M1_HALL_H2_GPIO_Port,
.H2Pin = M1_HALL_H2_Pin<<8,
.H3Port = M1_HALL_H3_GPIO_Port,
.H3Pin = M1_HALL_H3_Pin<<8,
};
/**
* Virtual temperature sensor parameters Motor 1
*/
NTC_Handle_t TempSensorParamsM1 =
{
.bSensorType = VIRTUAL_SENSOR,
.hExpectedTemp_d = 555,
.hExpectedTemp_C = M1_VIRTUAL_HEAT_SINK_TEMPERATURE_VALUE,
};
/* Bus voltage sensor value filter buffer */
uint16_t RealBusVoltageSensorFilterBufferM1[M1_VBUS_SW_FILTER_BW_FACTOR];
/**
* Bus voltage sensor parameters Motor 1
*/
RDivider_Handle_t RealBusVoltageSensorParamsM1 =
{
._Super =
{
.SensorType = REAL_SENSOR,
.ConversionFactor = (uint16_t)(ADC_REFERENCE_VOLTAGE / VBUS_PARTITIONING_FACTOR),
},
.VbusRegConv =
{
.regADC = ADC1,
.channel = MC_ADC_CHANNEL_3,
.samplingTime = M1_VBUS_SAMPLING_TIME,
},
.LowPassFilterBW = M1_VBUS_SW_FILTER_BW_FACTOR,
.OverVoltageThreshold = OVERVOLTAGE_THRESHOLD_d,
.UnderVoltageThreshold = UNDERVOLTAGE_THRESHOLD_d,
.aBuffer = RealBusVoltageSensorFilterBufferM1,
};
UI_Handle_t UI_Params =
{
.bDriveNum = 0,
};
/** RAMP for Motor1.
*
*/
RampExtMngr_Handle_t RampExtMngrHFParamsM1 =
{
.FrequencyHz = TF_REGULATION_RATE
};
/**
* @brief CircleLimitation Component parameters Motor 1 - Base Component
*/
CircleLimitation_Handle_t CircleLimitationM1 =
{
.MaxModule = MAX_MODULE,
.MaxVd = (uint16_t)(MAX_MODULE * 950 / 1000),
.Circle_limit_table = MMITABLE,
.Start_index = START_INDEX,
};
UFCP_Handle_t pUSART =
{
._Super.RxTimeout = 0,
.USARTx = USART1,
};
/* USER CODE BEGIN Additional configuration */
/* USER CODE END Additional configuration */
/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/