赞
踩
如何在 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实战之无感变绝对式位置传感器
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 */
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
/* 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)
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, };
#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};
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 };
mx_adc1/adc2_init
(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,无效
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。