ST电机库学习过程探索
电机控制相关资料汇总
如何在 MCSDK 5.x 中增加绝对位置编码器
Getting started with the X-NUCLEO-IHM16M1 three-phase brushless motor driver board based on STSPIN830 for STM32 Nucleo
新算法
FOC ST MediumFrequencyTask 分析
ST电机库v5.4.4源代码分析(4): 电角度和力矩方向分析
STM32 电机教程 24 - ST MCLIB实战之无感变绝对式位置传感器
文章目录
相关硬件如下:
1. 若想能够进行电机参数测试 需要以下条件:
- 配置时勾选 Application configuration->motor profiler
- 电机需要能够正常控制旋转
- 配置过程中一直出现错误"taking too time". 是因为电机控制不正常,所以不能正常进行测试,根据下面的叙述,电机能够正常转动后,就能成功进行测试了
2. 电机配置参数所在文件位置:
(1) Inc\pmsm_motor_parameters.h
motor parameters
/************************
*** Motor Parameters ***
************************/
/***************** MOTOR ELECTRICAL PARAMETERS ******************************/
#define POLE_PAIR_NUM 7 /* Number of motor pole pairs */
#define RS 5 /* Stator resistance , ohm*/
#define LS 0.001058 /* Stator inductance, H
For I-PMSM it is equal to Lq */
/* When using Id = 0, NOMINAL_CURRENT is utilized to saturate the output of the
PID for speed regulation (i.e. reference torque).
Transformation of real currents (A) into int16_t format must be done accordingly with
formula:
Phase current (int16_t 0-to-peak) = (Phase current (A 0-to-peak)* 32767 * Rshunt *
*Amplifying network gain)/(MCU supply voltage/2)
*/
#define MOTOR_MAX_SPEED_RPM 1572 /*!< Maximum rated speed */
#define MOTOR_VOLTAGE_CONSTANT 5.0 /*!< Volts RMS ph-ph /kRPM */
#define NOMINAL_CURRENT_A 2.1
#define ID_DEMAG_A -2.1 /*!< Demagnetization current */
/***************** MOTOR SENSORS PARAMETERS ******************************/
/* Motor sensors parameters are always generated but really meaningful only
if the corresponding sensor is actually present in the motor */
/*** Hall sensors ***/
#define HALL_SENSORS_PLACEMENT DEGREES_120 /*!<Define here the
mechanical position of the sensors
withreference to an electrical cycle.
It can be either DEGREES_120 or
DEGREES_60 */
#define HALL_PHASE_SHIFT 300 /*!< Define here in degrees
the electrical phase shift between
the low to high transition of
signal H1 and the maximum of
the Bemf induced on phase A */
/*** Quadrature encoder ***/
#define M1_ENCODER_PPR 400 /*!< Number of pulses per
revolution */
(2) Inc\mc_config.h
PWM Generation
电机idle状态时上管关,则启用# include “r3_1_g4xx_pwm_curr_fdbk.h”
若上管开,则启用 #include “r3_2_g4xx_pwm_curr_fdbk.h”
###(3)inc\main.h
所有硬件引脚相关的配置
/* Private defines -----------------------------------------------------------*/
#define Start_Stop_Pin GPIO_PIN_13
#define Start_Stop_GPIO_Port GPIOC
#define Start_Stop_EXTI_IRQn EXTI15_10_IRQn
#define M1_BUS_VOLTAGE_Pin GPIO_PIN_0 //总线电压
#define M1_BUS_VOLTAGE_GPIO_Port GPIOA
#define M1_CURR_AMPL_U_Pin GPIO_PIN_1 //电流U
#define M1_CURR_AMPL_U_GPIO_Port GPIOA
#define UART_TX_Pin GPIO_PIN_2
#define UART_TX_GPIO_Port GPIOA
#define UART_RX_Pin GPIO_PIN_3
#define UART_RX_GPIO_Port GPIOA
#define M1_TEMPERATURE_Pin GPIO_PIN_4
#define M1_TEMPERATURE_GPIO_Port GPIOC
#define M1_CURR_AMPL_W_Pin GPIO_PIN_0 //电流W
#define M1_CURR_AMPL_W_GPIO_Port GPIOB
#define M1_CURR_AMPL_V_Pin GPIO_PIN_1
#define M1_CURR_AMPL_V_GPIO_Port GPIOB
#define M1_DP_Pin GPIO_PIN_12 //保护
#define M1_DP_GPIO_Port GPIOB
#define M1_PWM_EN_U_Pin GPIO_PIN_13 //pwm引脚
#define M1_PWM_EN_U_GPIO_Port GPIOB
#define M1_PWM_EN_V_Pin GPIO_PIN_14
#define M1_PWM_EN_V_GPIO_Port GPIOB
#define M1_PWM_EN_W_Pin GPIO_PIN_15
#define M1_PWM_EN_W_GPIO_Port GPIOB
#define M1_PWM_UH_Pin GPIO_PIN_8
#define M1_PWM_UH_GPIO_Port GPIOA
#define M1_PWM_VH_Pin GPIO_PIN_9
#define M1_PWM_VH_GPIO_Port GPIOA
#define M1_PWM_WH_Pin GPIO_PIN_10
#define M1_PWM_WH_GPIO_Port GPIOA
#define TMS_Pin GPIO_PIN_13 //jtag
#define TMS_GPIO_Port GPIOA
#define TCK_Pin GPIO_PIN_14
#define TCK_GPIO_Port GPIOA
(4)Inc\drive_parameters.h
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef DRIVE_PARAMETERS_H
#define DRIVE_PARAMETERS_H
/************************
*** Motor Parameters ***
************************/
/******** MAIN AND AUXILIARY SPEED/POSITION SENSOR(S) SETTINGS SECTION ********/
/*** Speed measurement settings ***/
#define MAX_APPLICATION_SPEED_RPM 1572 /*!< rpm, mechanical */
#define MIN_APPLICATION_SPEED_RPM 0 /*!< rpm, mechanical,
absolute value */
#define M1_SS_MEAS_ERRORS_BEFORE_FAULTS 3 /*!< Number of speed
measurement errors before
main sensor goes in fault */
/****** State Observer + PLL ****/
#define VARIANCE_THRESHOLD 0.25 /*!<Maximum accepted
variance on speed
estimates (percentage) */
/* State observer scaling factors F1 */
#define F1 16384
#define F2 4096
#define F1_LOG LOG2((16384))
#define F2_LOG LOG2((4096))
/* State observer constants */
#define GAIN1 -22641
#define GAIN2 31494
/*Only in case PLL is used, PLL gains */
#define PLL_KP_GAIN 195
#define PLL_KI_GAIN 5
#define PLL_KPDIV 16384
#define PLL_KPDIV_LOG LOG2((PLL_KPDIV))
#define PLL_KIDIV 65535
#define PLL_KIDIV_LOG LOG2((PLL_KIDIV))
#define STO_FIFO_DEPTH_DPP 64 /*!< Depth of the FIFO used
to average mechanical speed
in dpp format */
#define STO_FIFO_DEPTH_DPP_LOG LOG2((64))
#define STO_FIFO_DEPTH_UNIT 64 /*!< Depth of the FIFO used
to average mechanical speed
in the unit defined by #SPEED_UNIT */
#define M1_BEMF_CONSISTENCY_TOL 64 /* Parameter for B-emf
amplitude-speed consistency */
#define M1_BEMF_CONSISTENCY_GAIN 64 /* Parameter for B-emf
amplitude-speed consistency */
/* USER CODE BEGIN angle reconstruction M1 */
#define PARK_ANGLE_COMPENSATION_FACTOR 0
#define REV_PARK_ANGLE_COMPENSATION_FACTOR 0
/* USER CODE END angle reconstruction M1 */
/************************** DRIVE SETTINGS SECTION **********************/
/* PWM generation and current reading */
#define PWM_FREQUENCY 30000
#define PWM_FREQ_SCALING 1
#define LOW_SIDE_SIGNALS_ENABLING ES_GPIO
/* Torque and flux regulation loops */
#define REGULATION_EXECUTION_RATE 1 /*!< FOC execution rate in
number of PWM cycles */
#define ISR_FREQUENCY_HZ (PWM_FREQUENCY/REGULATION_EXECUTION_RATE) /*!< @brief FOC execution rate in
Hz */
/* Gains values for torque and flux control loops */
#define PID_TORQUE_KP_DEFAULT 3547
#define PID_TORQUE_KI_DEFAULT 2234
#define PID_TORQUE_KD_DEFAULT 100
#define PID_FLUX_KP_DEFAULT 3547
#define PID_FLUX_KI_DEFAULT 2234
#define PID_FLUX_KD_DEFAULT 100
/* Torque/Flux control loop gains dividers*/
#define TF_KPDIV 1024
#define TF_KIDIV 4096
#define TF_KDDIV 8192
#define TF_KPDIV_LOG LOG2((1024))
#define TF_KIDIV_LOG LOG2((4096))
#define TF_KDDIV_LOG LOG2((8192))
#define TFDIFFERENTIAL_TERM_ENABLING DISABLE
/* Speed control loop */
#define SPEED_LOOP_FREQUENCY_HZ ( uint16_t )1000 /*!<Execution rate of speed
regulation loop (Hz) */
#define PID_SPEED_KP_DEFAULT 2730/(SPEED_UNIT/10) /* Workbench compute the gain for 01Hz unit*/
#define PID_SPEED_KI_DEFAULT 562/(SPEED_UNIT/10) /* Workbench compute the gain for 01Hz unit*/
#define PID_SPEED_KD_DEFAULT 0/(SPEED_UNIT/10) /* Workbench compute the gain for 01Hz unit*/
/* Speed PID parameter dividers */
#define SP_KPDIV 256
#define SP_KIDIV 16384
#define SP_KDDIV 16
#define SP_KPDIV_LOG LOG2((256))
#define SP_KIDIV_LOG LOG2((16384))
#define SP_KDDIV_LOG LOG2((16))
/* USER CODE BEGIN PID_SPEED_INTEGRAL_INIT_DIV */
#define PID_SPEED_INTEGRAL_INIT_DIV 1 /* */
/* USER CODE END PID_SPEED_INTEGRAL_INIT_DIV */
#define SPD_DIFFERENTIAL_TERM_ENABLING DISABLE
#define IQMAX_A 2.1
/* Default settings */
#define DEFAULT_CONTROL_MODE MCM_SPEED_MODE
#define DEFAULT_TARGET_SPEED_RPM 524
#define DEFAULT_TARGET_SPEED_UNIT (DEFAULT_TARGET_SPEED_RPM*SPEED_UNIT/U_RPM)
#define DEFAULT_TORQUE_COMPONENT_A 0
#define DEFAULT_FLUX_COMPONENT_A 0
/************************** FIRMWARE PROTECTIONS SECTION *****************/
#define OV_VOLTAGE_THRESHOLD_V 14 /*!< Over-voltage
threshold */
#define UD_VOLTAGE_THRESHOLD_V 7 /*!< Under-voltage
threshold */
#ifdef NOT_IMPLEMENTED
#define ON_OVER_VOLTAGE TURN_OFF_PWM /*!< TURN_OFF_PWM,
TURN_ON_R_BRAKE or
TURN_ON_LOW_SIDES */
#endif /* NOT_IMPLEMENTED */
#define OV_TEMPERATURE_THRESHOLD_C 110 /*!< Celsius degrees */
#define OV_TEMPERATURE_HYSTERESIS_C 10 /*!< Celsius degrees */
#define HW_OV_CURRENT_PROT_BYPASS DISABLE /*!< In case ON_OVER_VOLTAGE
is set to TURN_ON_LOW_SIDES
this feature may be used to
bypass HW over-current
protection (if supported by
power stage) */
#define OVP_INVERTINGINPUT_MODE INT_MODE
#define OVP_INVERTINGINPUT_MODE2 INT_MODE
#define OVP_SELECTION COMP_Selection_COMP1
#define OVP_SELECTION2 COMP_Selection_COMP1
/****************************** START-UP PARAMETERS **********************/
/* Phase 1 */
#define PHASE1_DURATION 1000 /*milliseconds */
#define PHASE1_FINAL_SPEED_UNIT (0*SPEED_UNIT/U_RPM)
#define PHASE1_FINAL_CURRENT_A 2.1
/* Phase 2 */
#define PHASE2_DURATION 1164 /*milliseconds */
#define PHASE2_FINAL_SPEED_UNIT (582*SPEED_UNIT/U_RPM)
#define PHASE2_FINAL_CURRENT_A 2.1
/* Phase 3 */
#define PHASE3_DURATION 0 /*milliseconds */
#define PHASE3_FINAL_SPEED_UNIT (582*SPEED_UNIT/U_RPM)
#define PHASE3_FINAL_CURRENT_A 2.1
/* Phase 4 */
#define PHASE4_DURATION 0 /*milliseconds */
#define PHASE4_FINAL_SPEED_UNIT (582*SPEED_UNIT/U_RPM)
#define PHASE4_FINAL_CURRENT_A 2.1
/* Phase 5 */
#define PHASE5_DURATION 0 /* milliseconds */
#define PHASE5_FINAL_SPEED_UNIT (582*SPEED_UNIT/U_RPM)
#define PHASE5_FINAL_CURRENT_A 2.1
#define ENABLE_SL_ALGO_FROM_PHASE 2
/* Sensor-less rev-up sequence */
#define STARTING_ANGLE_DEG 0 /*!< degrees [0...359] */
/* Observer start-up output conditions */
#define OBS_MINIMUM_SPEED_RPM 524
#define NB_CONSECUTIVE_TESTS 2 /* corresponding to
former NB_CONSECUTIVE_TESTS/
(TF_REGULATION_RATE/
MEDIUM_FREQUENCY_TASK_RATE) */
#define SPEED_BAND_UPPER_LIMIT 17 /*!< It expresses how much
estimated speed can exceed
forced stator electrical
without being considered wrong.
In 1/16 of forced speed */
#define SPEED_BAND_LOWER_LIMIT 15 /*!< It expresses how much
estimated speed can be below
forced stator electrical
without being considered wrong.
In 1/16 of forced speed */
#define TRANSITION_DURATION 25 /* Switch over duration, ms */
/****************************** BUS VOLTAGE Motor 1 **********************/
#define M1_VBUS_SAMPLING_TIME LL_ADC_SAMPLING_CYCLE(47)
/****************************** Temperature sensing Motor 1 **********************/
#define M1_TEMP_SAMPLING_TIME LL_ADC_SAMPLING_CYCLE(47)
/****************************** Current sensing Motor 1 **********************/
#define ADC_SAMPLING_CYCLES (6 + SAMPLING_CYCLE_CORRECTION)
(5)Src\stm32g4xx_hal_msp.c//Src\mc_parameters.c
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
const R3_1_Params_t R3_1_ParamsM1 =
{
/* Dual MC parameters --------------------------------------------------------*/
.FreqRatio = FREQ_RATIO,
.IsHigherFreqTim = FREQ_RELATION,
/* Current reading A/D Conversions initialization -----------------------------*/
.ADCx = ADC1,
.ADCConfig = {
(12U << ADC_JSQR_JSQ1_Pos)
| (15U << ADC_JSQR_JSQ2_Pos) | 1<< ADC_JSQR_JL_Pos
| (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
,(2U << ADC_JSQR_JSQ1_Pos)
| (15U << ADC_JSQR_JSQ2_Pos) | 1<< ADC_JSQR_JL_Pos
| (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
,(2U << ADC_JSQR_JSQ1_Pos)
| (15U << ADC_JSQR_JSQ2_Pos) | 1<< ADC_JSQR_JL_Pos
| (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
,(2U << ADC_JSQR_JSQ1_Pos)
| (12U << ADC_JSQR_JSQ2_Pos) | 1<< ADC_JSQR_JL_Pos
| (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
,(2U << ADC_JSQR_JSQ1_Pos)
| (12U << ADC_JSQR_JSQ2_Pos) | 1<< ADC_JSQR_JL_Pos
| (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
,(12U << ADC_JSQR_JSQ1_Pos)
| (15U << ADC_JSQR_JSQ2_Pos) | 1<< ADC_JSQR_JL_Pos
| (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
},
/* PWM generation parameters --------------------------------------------------*/
.RepetitionCounter = REP_COUNTER,
.Tafter = TW_AFTER,
.Tbefore = TW_BEFORE_R3_1,
.Tsampling = (uint16_t)SAMPLING_TIME,
.Tcase2 = (uint16_t)SAMPLING_TIME + (uint16_t)TDEAD + (uint16_t)TRISE,
.Tcase3 = ((uint16_t)TDEAD + (uint16_t)TNOISE + (uint16_t)SAMPLING_TIME)/2u,
.TIMx = TIM1,
/* Internal OPAMP common settings --------------------------------------------*/
.OPAMPParams = MC_NULL,
/* Internal COMP settings ----------------------------------------------------*/
.CompOCPASelection = MC_NULL,
.CompOCPAInvInput_MODE = NONE,
.CompOCPBSelection = MC_NULL,
.CompOCPBInvInput_MODE = NONE,
.CompOCPCSelection = MC_NULL,
.CompOCPCInvInput_MODE = NONE,
.DAC_OCP_ASelection = MC_NULL,
.DAC_OCP_BSelection = MC_NULL,
.DAC_OCP_CSelection = MC_NULL,
.DAC_Channel_OCPA = (uint32_t) 0,
.DAC_Channel_OCPB = (uint32_t) 0,
.DAC_Channel_OCPC = (uint32_t) 0,
.CompOVPSelection = MC_NULL,
.CompOVPInvInput_MODE = NONE,
.DAC_OVP_Selection = MC_NULL,
.DAC_Channel_OVP = (uint32_t) 0,
/* DAC settings --------------------------------------------------------------*/
.DAC_OCP_Threshold = 0,
.DAC_OVP_Threshold = 23830,
};
(6) Src\mc_configuration_registers.c
#define FIRMWARE_NAME_STR "ST MC SDK\tVer.6.2.1"
const char_t CTL_BOARD[] = "NUCLEO-G431RB";
static const char_t M1_PWR_BOARD[] = "X-NUCLEO-IHM16M1";
const char_t FIRMWARE_NAME [] = FIRMWARE_NAME_STR;
const GlobalConfig_reg_t globalConfig_reg =
{
.SDKVersion = SDK_VERSION,
.MotorNumber = 1 ,
.MCP_Flag = FLAG_MCP_OVER_STLINK + FLAG_MCP_OVER_UARTA + FLAG_MCP_OVER_UARTB,
.MCPA_UARTA_LOG = 10,
.MCPA_UARTB_LOG = 0,
.MCPA_STLNK_LOG = 0,
};
static const ApplicationConfig_reg_t M1_ApplicationConfig_reg =
{
.maxMechanicalSpeed = 1572,
.maxReadableCurrent = M1_MAX_READABLE_CURRENT,
.nominalCurrent = 2.1,
.nominalVoltage = 12,
.driveType = DRIVE_TYPE_M1,
};
//cstat !MISRAC2012-Rule-9.2
static const MotorConfig_reg_t M1_MotorConfig_reg =
{
.polePairs = 7,
.ratedFlux = 5.0,
.rs = 5,
.ls = 0.001058*1.000,
.ld = 0.001058,
.maxCurrent = 2.1,
.name = "GimBal GBM2804H-100T"
};
static const FOCFwConfig_reg_t M1_FOCConfig_reg =
{
.primarySensor = (uint8_t)PRIM_SENSOR_M1,
.auxiliarySensor = (uint8_t)AUX_SENSOR_M1,
.topology = (uint8_t)TOPOLOGY_M1,
.FOCRate = (uint8_t)FOC_RATE_M1,
.PWMFrequency = (uint32_t)PWM_FREQ_M1,
.MediumFrequency = (uint16_t)MEDIUM_FREQUENCY_TASK_RATE,
.configurationFlag1 = (uint16_t)configurationFlag1_M1, //cstat !MISRAC2012-Rule-10.1_R6
.configurationFlag2 = (uint16_t)configurationFlag2_M1, //cstat !MISRAC2012-Rule-10.1_R6
};
const char_t * PWR_BOARD_NAME[NBR_OF_MOTORS] = {M1_PWR_BOARD};
const FOCFwConfig_reg_t* FOCConfig_reg[NBR_OF_MOTORS] = {&M1_FOCConfig_reg};
const MotorConfig_reg_t* MotorConfig_reg[NBR_OF_MOTORS] = {&M1_MotorConfig_reg};
const ApplicationConfig_reg_t* ApplicationConfig_reg[NBR_OF_MOTORS] = {&M1_ApplicationConfig_reg};
(7) Src\mc_config.c
pwm模式的不同,电流采样通道的不同
每个组件的句柄:
PQD_MotorPowMeasM1,PIDSpeedHandle_M1
PIDIqHandle_M1,PIDIdHandle_M1
SpeednTorqCtrlM1,RevUpControlM1
PWM_Handle_M1,VirtualSpeedSensorM1
STO_PLL_M1,STO_M1
TempRegConv_M1,TempSensor_M1
VbusRegConv_M1,BusVoltageSensor_M1,
RampExtMngrHFParamsM1,CircleLimitationM1
RampExtMngrParamsSCC,SCC
RampExtMngrParamsOTT,OTT
#define FREQ_RATIO 1 /* Dummy value for single drive */
#define FREQ_RELATION HIGHEST_FREQ /* Dummy value for single drive */
#include "pqd_motor_power_measurement.h"
/* USER CODE BEGIN Additional define */
/* USER CODE END Additional define */
PQD_MotorPowMeas_Handle_t PQD_MotorPowMeasM1 =
{
.ConvFact = PQD_CONVERSION_FACTOR
};
/**
* @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 * SP_KIDIV),
.wLowerIntegralLimit = -(int32_t)(IQMAX * 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,
};
RevUpCtrl_Handle_t RevUpControlM1 =
{
.hRUCFrequencyHz = MEDIUM_FREQUENCY_TASK_RATE,
.hStartingMecAngle = (int16_t)((int32_t)(STARTING_ANGLE_DEG)* 65536/360),
.bFirstAccelerationStage = ENABLE_SL_ALGO_FROM_PHASE,
.hMinStartUpValidSpeed = OBS_MINIMUM_SPEED_UNIT,
.hMinStartUpFlySpeed = (int16_t)(OBS_MINIMUM_SPEED_UNIT/2),
.OTFStartupEnabled = false,
.OTFPhaseParams =
{
(uint16_t)500,
0,
(int16_t)PHASE5_FINAL_CURRENT,
(void*)MC_NULL
},
.ParamsData =
{
{(uint16_t)PHASE1_DURATION,(int16_t)(PHASE1_FINAL_SPEED_UNIT),(uint16_t)PHASE1_FINAL_CURRENT,&RevUpControlM1.ParamsData[1]},
{(uint16_t)PHASE2_DURATION,(int16_t)(PHASE2_FINAL_SPEED_UNIT),(uint16_t)PHASE2_FINAL_CURRENT,&RevUpControlM1.ParamsData[2]},
{(uint16_t)PHASE3_DURATION,(int16_t)(PHASE3_FINAL_SPEED_UNIT),(uint16_t)PHASE3_FINAL_CURRENT,&RevUpControlM1.ParamsData[3]},
{(uint16_t)PHASE4_DURATION,(int16_t)(PHASE4_FINAL_SPEED_UNIT),(uint16_t)PHASE4_FINAL_CURRENT,&RevUpControlM1.ParamsData[4]},
{(uint16_t)PHASE5_DURATION,(int16_t)(PHASE5_FINAL_SPEED_UNIT),(uint16_t)PHASE5_FINAL_CURRENT,(void*)MC_NULL},
},
};
/**
* @brief PWM parameters Motor 1 for one ADC.
*/
PWMC_R3_1_Handle_t PWM_Handle_M1 =
{
{
.pFctGetPhaseCurrents = &R3_1_GetPhaseCurrents,
.pFctSetADCSampPointSectX = &R3_1_SetADCSampPointSectX,
.pFctSetOffsetCalib = &R3_1_SetOffsetCalib,
.pFctGetOffsetCalib = &R3_1_GetOffsetCalib,
.pFctSwitchOffPwm = &R3_1_SwitchOffPWM,
.pFctSwitchOnPwm = &R3_1_SwitchOnPWM,
.pFctCurrReadingCalib = &R3_1_CurrentReadingPolarization,
.pFctTurnOnLowSides = &R3_1_TurnOnLowSides,
.pFctOCPSetReferenceVoltage = MC_NULL,
.pFctRLDetectionModeEnable = &R3_1_RLDetectionModeEnable,
.pFctRLDetectionModeDisable = &R3_1_RLDetectionModeDisable,
.pFctRLDetectionModeSetDuty = &R3_1_RLDetectionModeSetDuty,
.pFctRLTurnOnLowSidesAndStart = &R3_1_RLTurnOnLowSidesAndStart,
.LowSideOutputs = (LowSideOutputsFunction_t)LOW_SIDE_SIGNALS_ENABLING,
.pwm_en_u_port = M1_PWM_EN_U_GPIO_Port,
.pwm_en_u_pin = M1_PWM_EN_U_Pin,
.pwm_en_v_port = M1_PWM_EN_V_GPIO_Port,
.pwm_en_v_pin = M1_PWM_EN_V_Pin,
.pwm_en_w_port = M1_PWM_EN_W_GPIO_Port,
.pwm_en_w_pin = M1_PWM_EN_W_Pin,
.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,
.SingleShuntTopology = false,
.Ia = 0,
.Ib = 0,
.Ic = 0,
.LPFIqd_const = LPF_FILT_CONST,
.DTTest = 0,
.DTCompCnt = DTCOMPCNT,
.PWMperiod = PWM_PERIOD_CYCLES,
.Ton = TON,
.Toff = TOFF,
.OverCurrentFlag = false,
.OverVoltageFlag = false,
.BrakeActionLock = false,
.driverProtectionFlag = false,
},
.PhaseAOffset = 0,
.PhaseBOffset = 0,
.PhaseCOffset = 0,
.Half_PWMPeriod = PWM_PERIOD_CYCLES / 2u,
.ADC_ExternalPolarityInjected = 0,
.PolarizationCounter = 0,
.PolarizationSector = 0,
.ADCRegularLocked = false,
.pParams_str = &R3_1_ParamsM1
};
/**
* @brief SpeedNPosition sensor parameters Motor 1 - Base Class.
*/
VirtualSpeedSensor_Handle_t VirtualSpeedSensorM1 =
{
._Super =
{
.bElToMecRatio = POLE_PAIR_NUM,
.hMaxReliableMecSpeedUnit = (uint16_t)(1.15*MAX_APPLICATION_SPEED_UNIT),
.hMinReliableMecSpeedUnit = (uint16_t)(MIN_APPLICATION_SPEED_UNIT),
.bMaximumSpeedErrorsNumber = M1_SS_MEAS_ERRORS_BEFORE_FAULTS,
.hMaxReliableMecAccelUnitP = 65535,
.hMeasurementFrequency = TF_REGULATION_RATE_SCALED,
.DPPConvFactor = DPP_CONV_FACTOR,
},
.hSpeedSamplingFreqHz = MEDIUM_FREQUENCY_TASK_RATE,
.hTransitionSteps = (int16_t)((TF_REGULATION_RATE * TRANSITION_DURATION) / 1000.0),
};
/**
* @brief SpeedNPosition sensor parameters Motor 1 - State Observer + PLL.
*/
STO_PLL_Handle_t STO_PLL_M1 =
{
._Super =
{
.bElToMecRatio = POLE_PAIR_NUM,
.SpeedUnit = SPEED_UNIT,
.hMaxReliableMecSpeedUnit = (uint16_t)(1.15 * MAX_APPLICATION_SPEED_UNIT),
.hMinReliableMecSpeedUnit = (uint16_t)(MIN_APPLICATION_SPEED_UNIT),
.bMaximumSpeedErrorsNumber = M1_SS_MEAS_ERRORS_BEFORE_FAULTS,
.hMaxReliableMecAccelUnitP = 65535,
.hMeasurementFrequency = TF_REGULATION_RATE_SCALED,
.DPPConvFactor = DPP_CONV_FACTOR,
},
.hC1 = C1,
.hC2 = C2,
.hC3 = C3,
.hC4 = C4,
.hC5 = C5,
.hF1 = F1,
.hF2 = F2,
.PIRegulator =
{
.hDefKpGain = PLL_KP_GAIN,
.hDefKiGain = PLL_KI_GAIN,
.hDefKdGain = 0x0000U,
.hKpDivisor = PLL_KPDIV,
.hKiDivisor = PLL_KIDIV,
.hKdDivisor = 0x0000U,
.wUpperIntegralLimit = INT32_MAX,
.wLowerIntegralLimit = -INT32_MAX,
.hUpperOutputLimit = INT16_MAX,
.hLowerOutputLimit = -INT16_MAX,
.hKpDivisorPOW2 = PLL_KPDIV_LOG,
.hKiDivisorPOW2 = PLL_KIDIV_LOG,
.hKdDivisorPOW2 = 0x0000U,
},
.SpeedBufferSizeUnit = STO_FIFO_DEPTH_UNIT,
.SpeedBufferSizeDpp = STO_FIFO_DEPTH_DPP,
.VariancePercentage = PERCENTAGE_FACTOR,
.SpeedValidationBand_H = SPEED_BAND_UPPER_LIMIT,
.SpeedValidationBand_L = SPEED_BAND_LOWER_LIMIT,
.MinStartUpValidSpeed = OBS_MINIMUM_SPEED_UNIT,
.StartUpConsistThreshold = NB_CONSECUTIVE_TESTS,
.Reliability_hysteresys = M1_SS_MEAS_ERRORS_BEFORE_FAULTS,
.BemfConsistencyCheck = M1_BEMF_CONSISTENCY_TOL,
.BemfConsistencyGain = M1_BEMF_CONSISTENCY_GAIN,
.MaxAppPositiveMecSpeedUnit = (uint16_t)(MAX_APPLICATION_SPEED_UNIT * 1.15),
.F1LOG = F1_LOG,
.F2LOG = F2_LOG,
.SpeedBufferSizeDppLOG = STO_FIFO_DEPTH_DPP_LOG,
.hForcedDirection = 0x0000U
};
STO_Handle_t STO_M1 =
{
._Super = (SpeednPosFdbk_Handle_t *)&STO_PLL_M1, //cstat !MISRAC2012-Rule-11.3
.pFctForceConvergency1 = &STO_PLL_ForceConvergency1,
.pFctForceConvergency2 = &STO_PLL_ForceConvergency2,
.pFctStoOtfResetPLL = &STO_OTF_ResetPLL,
.pFctSTO_SpeedReliabilityCheck = &STO_PLL_IsVarianceTight
};
/**
* temperature sensor parameters Motor 1.
*/
RegConv_t TempRegConv_M1 =
{
.regADC = ADC2,
.channel = MC_ADC_CHANNEL_5,
.samplingTime = M1_TEMP_SAMPLING_TIME,
};
NTC_Handle_t TempSensor_M1 =
{
.bSensorType = REAL_SENSOR,
.hLowPassFilterBW = M1_TEMP_SW_FILTER_BW_FACTOR,
.hOverTempThreshold = (uint16_t)(OV_TEMPERATURE_THRESHOLD_d),
.hOverTempDeactThreshold = (uint16_t)(OV_TEMPERATURE_THRESHOLD_d - OV_TEMPERATURE_HYSTERESIS_d),
.hSensitivity = (int16_t)(ADC_REFERENCE_VOLTAGE/dV_dT),
.wV0 = (uint16_t)((V0_V * 65536) / ADC_REFERENCE_VOLTAGE),
.hT0 = T0_C,
};
/* Bus voltage sensor value filter buffer */
static uint16_t RealBusVoltageSensorFilterBufferM1[M1_VBUS_SW_FILTER_BW_FACTOR];
/**
* Bus voltage sensor parameters Motor 1.
*/
RegConv_t VbusRegConv_M1 =
{
.regADC = ADC1,
.channel = MC_ADC_CHANNEL_1,
.samplingTime = M1_VBUS_SAMPLING_TIME,
};
RDivider_Handle_t BusVoltageSensor_M1 =
{
._Super =
{
.SensorType = REAL_SENSOR,
.ConversionFactor = (uint16_t)(ADC_REFERENCE_VOLTAGE / VBUS_PARTITIONING_FACTOR),
},
.LowPassFilterBW = M1_VBUS_SW_FILTER_BW_FACTOR,
.OverVoltageThreshold = OVERVOLTAGE_THRESHOLD_d,
.OverVoltageThresholdLow = OVERVOLTAGE_THRESHOLD_d,
.OverVoltageHysteresisUpDir = true,
.UnderVoltageThreshold = UNDERVOLTAGE_THRESHOLD_d,
.aBuffer = RealBusVoltageSensorFilterBufferM1,
};
/** 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),
};
RampExtMngr_Handle_t RampExtMngrParamsSCC =
{
.FrequencyHz = TF_REGULATION_RATE
};
SCC_Handle_t SCC =
{
.pSCC_Params_str = &SCC_Params
};
RampExtMngr_Handle_t RampExtMngrParamsOTT =
{
.FrequencyHz = MEDIUM_FREQUENCY_TASK_RATE
};
OTT_Handle_t OTT =
{
.pOTT_Params_str = &OTT_Params
};
MCI_Handle_t Mci[NBR_OF_MOTORS];
SpeednTorqCtrl_Handle_t *pSTC[NBR_OF_MOTORS] = {&SpeednTorqCtrlM1};
NTC_Handle_t *pTemperatureSensor[NBR_OF_MOTORS] = {&TempSensor_M1};
PID_Handle_t *pPIDIq[NBR_OF_MOTORS] = {&PIDIqHandle_M1};
PID_Handle_t *pPIDId[NBR_OF_MOTORS] = {&PIDIdHandle_M1};
PQD_MotorPowMeas_Handle_t *pMPM[NBR_OF_MOTORS] = {&PQD_MotorPowMeasM1};
/* USER CODE BEGIN Additional configuration */
PWMC_R3_2_Handle_t PWM_Handle_M1 =
{
._Super =
{
.pFctGetPhaseCurrents = &R3_2_GetPhaseCurrents,
.pFctSetADCSampPointSectX = &R3_2_SetADCSampPointSectX,
.pFctSetOffsetCalib = &R3_2_SetOffsetCalib,
.pFctGetOffsetCalib = &R3_2_GetOffsetCalib,
.pFctSwitchOffPwm = &R3_2_SwitchOffPWM,
.pFctSwitchOnPwm = &R3_2_SwitchOnPWM,
.pFctCurrReadingCalib = &R3_2_CurrentReadingPolarization,
.pFctTurnOnLowSides = &R3_2_TurnOnLowSides,
.pFctOCPSetReferenceVoltage = MC_NULL,
.pFctRLDetectionModeEnable = &R3_2_RLDetectionModeEnable,
.pFctRLDetectionModeDisable = &R3_2_RLDetectionModeDisable,
.pFctRLDetectionModeSetDuty = &R3_2_RLDetectionModeSetDuty,
.pFctRLTurnOnLowSidesAndStart = &R3_2_RLTurnOnLowSidesAndStart,
.hT_Sqrt3 = (PWM_PERIOD_CYCLES*SQRT3FACTOR)/16384u,
.LowSideOutputs = (LowSideOutputsFunction_t)LOW_SIDE_SIGNALS_ENABLING,
.pwm_en_u_port = M1_PWM_EN_U_GPIO_Port,
.pwm_en_u_pin = M1_PWM_EN_U_Pin,
.pwm_en_v_port = M1_PWM_EN_V_GPIO_Port,
.pwm_en_v_pin = M1_PWM_EN_V_Pin,
.pwm_en_w_port = M1_PWM_EN_W_GPIO_Port,
.pwm_en_w_pin = M1_PWM_EN_W_Pin,
.Sector = 0,
.lowDuty = (uint16_t)0,
.midDuty = (uint16_t)0,
.highDuty = (uint16_t)0,
.CntPhA = 0,
.CntPhB = 0,
.CntPhC = 0,
.SWerror = 0,
.TurnOnLowSidesAction = false,
.OffCalibrWaitTimeCounter = 0,
.Motor = M1,
.RLDetectionMode = false,
.SingleShuntTopology = false,
.Ia = 0,
.Ib = 0,
.Ic = 0,
.LPFIqd_const = LPF_FILT_CONST,
.DTTest = 0,
.DTCompCnt = DTCOMPCNT,
.PWMperiod = PWM_PERIOD_CYCLES,
.Ton = TON,
.Toff = TOFF,
.OverCurrentFlag = false,
.OverVoltageFlag = false,
.BrakeActionLock = false,
.driverProtectionFlag = false,
},
.Half_PWMPeriod = PWM_PERIOD_CYCLES/2u,
.PhaseAOffset = 0,
.PhaseBOffset = 0,
.PhaseCOffset = 0,
.ADC_ExternalPolarityInjected = (uint8_t)0,
.PolarizationCounter = (uint8_t)0,
.PolarizationSector = (uint8_t)0,
.ADCRegularLocked = false,
.pParams_str = &R3_2_ParamsM1
};
(8)src/main.c
mx_adc1/adc2_init
3. 电流采样不同的配置,运行效果差异很大
-
(1)选用adc1作为电流采样通道,启动旋转两圈,即报“startup faulure".
-
(2)选择adc1/adc2作为采样通道,能够正常旋转,但加一点阻力,即报”speed Feedback"故障.
-
(3)2上增加profier功能,则启动不正常,有时不能启动,有时长时间之后能转起来,但速度值一直维持在高位,有时一旋转即报"speed feedback".
motor profier不能执行完成。 -
(4) 2上将speed sensor config–>Max Num. Errors before fault从2改成10.每次都能旋转,但开始时有几次旋转方向是反的,而且转速也不是设定的转速。
-motor profier执行时每次旋转都会急停,最后报"take too time." 将max current 从1.7A改为0.2A.
未有改善。将Max Speed 从16000改为2000,则能完成测试。 -
(5)将电机参数改进,并将Max Num恢复成3.
第一次启动时,会改变speed ref.后来都正常启动,但一吃负载,即报"speed feedback". -
(6) Fpwm从30k改成20k,结果一样。
-
(7) 打开start up中的on the fly,不能启动。
-
(8) 将 startup->phase 1/phase 2电流从2.1a改成1.0a,启动基本正常,但不吃负载。
-
(9) 将 startup->Consecutive correct measures:从2 改成5, 无效。
-
(10)将speed 的kp从2500 改成1000,无效