10222|14

1411

帖子

3

TA的资源

版主

楼主
 

【基于NUCLEO-F746ZG电机开发应用】14.参数配置-电机参数配置 [复制链接]

 
本帖最后由 annysky2012 于 2021-10-20 21:59 编辑

好几天没有更新了,天气变冷了,完全不想动,手都是冰冰的,好了,废话不说了。今天主要来概述一下电机参数的配置,这才是重点。

电机参数的配置包括PID在速度模式、扭矩模式、速度扭矩模式参数的配置,PWM的参数配置,电机本身的参数配置,STO状态机配置,温度传感器配置,总线电压配置、极限参数配置等。也就是要把电机运行的所有参数进行实例化,给定范围和初始值,让电机在设定的参数里进行运行。

 

1.程序函数MX_MotorControl_Init

该程序主要是调用电机相关的函数,包括SYSTICK初始化,电机初始化,UI初始化。主要看MCboot()函数的内容。

__weak void MX_MotorControl_Init(void)
{
  /* Reconfigure the SysTick interrupt to fire every 500 us. */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/SYS_TICK_FREQUENCY);//配置SYSTICK时钟
  /* Initialize the Motor Control Subsystem */
  MCboot(pMCI,pMCT);//初始化电机参数
  mc_lock_pins();//锁定电机相关的引脚

  /* Initialize the MC User Interface */
  UI_TaskInit(wConfig,NBR_OF_MOTORS,pMCI,pMCT,s_fwVer);
}

 

2.电机初始化MCboot()

以下为整个程序:

__weak void MCboot( MCI_Handle_t* pMCIList[NBR_OF_MOTORS],MCT_Handle_t* pMCTList[NBR_OF_MOTORS] )
{
  /* USER CODE BEGIN MCboot 0 */

  /* USER CODE END MCboot 0 */

  /**************************************/
  /*    State machine initialization    */
  /**************************************/
  STM_Init(&STM[M1]);//初始化电机状态变量参数
                     //1.状态机:当前状态的变量
                     //2.当前故障:当前存在的故障的变量 
                     //3.历史故障:历史故障的变量  
  
  bMCBootCompleted = 0;//电机初始化完成变量
  
  pCLM[M1] = &CircleLimitationM1; //初始化电机运行的参数限制值
                                  //.MaxModule          = MAX_MODULE,
                                  //.MaxVd          	  = (uint16_t)(MAX_MODULE * 950 / 1000),
                                  //.Circle_limit_table = MMITABLE,
                                  //.Start_index        = START_INDEX,   

  /**********************************************************/
  /*    PWM and current sensing component initialization    */
  /**********************************************************/
  //PWM 和电流传感器组件初始化
  pwmcHandle[M1] = &PWM_Handle_M1._Super;//初始化PWM 和电流传感器组件结构体
  
  R3_2_Init(&PWM_Handle_M1);//STM32F7XX 在三个分流配置中初始化 TIM、ADC、GPIO、DMA 和 NVIC 以用于电流读取和 PWM 生成
  /* USER CODE BEGIN MCboot 1 */

  /* USER CODE END MCboot 1 */

  /**************************************/
  /*    Start timers synchronously      */
  /**************************************/
  startTimers();//开启定时器TIM2
                //利用 TIM2 作为临时定时器来实现 PWM 信号之间的同步

  /******************************************************/
  /*   PID component initialization: speed regulation   */
  /******************************************************/
  //PID初始化
  PID_HandleInit(&PIDSpeedHandle_M1);//初始化PID参数
                                      //hKpGain:10
                                      //hKiGain:7
                                      //hKdGain:0
                                      //wIntegralTerm:0
                                      //wPrevProcessVarError:0
  pPIDSpeed[M1] = &PIDSpeedHandle_M1;//初始化PID参数

  /******************************************************/
  /*   Main speed sensor component initialization       */
  /******************************************************/
  //主速度传感器组件初始化
  pSTC[M1] = &SpeednTorqCtrlM1;//电机的速度、扭矩参数设置
  STO_PLL_Init (&STO_PLL_M1);//位置传感器的参数设置
                             //本例程没有使用霍尔传感器

  /******************************************************/
  /*   Speed & torque component initialization          */
  /******************************************************/
  //初始化用户参数
  STC_Init(pSTC[M1],pPIDSpeed[M1], &STO_PLL_M1._Super);

  /****************************************************/
  /*   Virtual speed sensor component initialization  */
  /****************************************************/
  //虚拟速度传感器组件初始化
  VSS_Init (&VirtualSpeedSensorM1);

  /**************************************/
  /*   Rev-up component initialization  */
  /**************************************/
  //升级组件初始化
  RUC_Init(&RevUpControlM1,pSTC[M1],&VirtualSpeedSensorM1, &STO_M1, pwmcHandle[M1]);

  /********************************************************/
  /*   PID component initialization: current regulation   */
  /********************************************************/
  //PID 组件初始化:电流调节(扭矩模式)
  PID_HandleInit(&PIDIqHandle_M1);//初始化Iq参数
  PID_HandleInit(&PIDIdHandle_M1);//初始化Id参数
  pPIDIq[M1] = &PIDIqHandle_M1;
  pPIDId[M1] = &PIDIdHandle_M1;

  /********************************************************/
  /*   Bus voltage sensor component initialization        */
  /********************************************************/
  //总线电压传感器组件初始化
  pBusSensorM1 = &RealBusVoltageSensorParamsM1;//总线电压传感器配置
  RVBS_Init(pBusSensorM1);//初始化参数

  /*************************************************/
  /*   Power measurement component initialization  */
  /*************************************************/
  pMPM[M1] = &PQD_MotorPowMeasM1;//初始化功率转化系数:1000*3*3.3/(1.732*0.33*1.53)
  pMPM[M1]->pVBS = &(pBusSensorM1->_Super);//总线电压传感器参数配置
  pMPM[M1]->pFOCVars = &FOCVars[M1];//FOC的参数赋值

  /*******************************************************/
  /*   Temperature measurement component initialization  */
  /*******************************************************/
  //温度传感器参数配置
  NTC_Init(&TempSensorParamsM1);//配置NTC传感器的参数
  pTemperatureSensor[M1] = &TempSensorParamsM1;//初始化NTC的参数

  pREMNG[M1] = &RampExtMngrHFParamsM1;//电机1的斜坡值
  REMNG_Init(pREMNG[M1]);//初始化电机 1的斜坡值

  FOC_Clear(M1);//重新初始化电流和电压变量
  FOCVars[M1].bDriveInput = EXTERNAL;//参考源为外部
  FOCVars[M1].Iqdref = STC_GetDefaultIqdref(pSTC[M1]);//获取Iq,Id值
  FOCVars[M1].UserIdref = STC_GetDefaultIqdref(pSTC[M1]).d;//获取用户设置的Id值
  oMCInterface[M1] = & Mci[M1];//初始化电机的控制参数
  MCI_Init(oMCInterface[M1], &STM[M1], pSTC[M1], &FOCVars[M1] );//初始化所有对象变量
  MCI_ExecSpeedRamp(oMCInterface[M1],//设置电机速度斜坡的缓冲
  STC_GetMecSpeedRefUnitDefault(pSTC[M1]),0); /*First command to STC*///机械转子速度参考
  pMCIList[M1] = oMCInterface[M1];
  MCT[M1].pPIDSpeed = pPIDSpeed[M1];//初始化PID参数
  MCT[M1].pPIDIq = pPIDIq[M1];//初始化PID参数
  MCT[M1].pPIDId = pPIDId[M1];//初始化PID参数
  MCT[M1].pPIDFluxWeakening = MC_NULL; /* if M1 doesn't has FW */
  MCT[M1].pPWMnCurrFdbk = pwmcHandle[M1];
  MCT[M1].pRevupCtrl = &RevUpControlM1;              /* only if M1 is sensorless*/
  MCT[M1].pSpeedSensorMain = (SpeednPosFdbk_Handle_t *) &STO_PLL_M1;
  MCT[M1].pSpeedSensorAux = MC_NULL;
  MCT[M1].pSpeedSensorVirtual = &VirtualSpeedSensorM1;  /* only if M1 is sensorless*/
  MCT[M1].pSpeednTorqueCtrl = pSTC[M1];
  MCT[M1].pStateMachine = &STM[M1];
  MCT[M1].pTemperatureSensor = (NTC_Handle_t *) pTemperatureSensor[M1];
  MCT[M1].pBusVoltageSensor = &(pBusSensorM1->_Super);
  MCT[M1].pBrakeDigitalOutput = MC_NULL;   /* brake is defined, oBrakeM1*/
  MCT[M1].pNTCRelay = MC_NULL;             /* relay is defined, oRelayM1*/
  MCT[M1].pMPM =  (MotorPowMeas_Handle_t*)pMPM[M1];
  MCT[M1].pFW = MC_NULL;
  MCT[M1].pFF = MC_NULL;

  MCT[M1].pPosCtrl = MC_NULL;

  MCT[M1].pSCC = MC_NULL;
  MCT[M1].pOTT = MC_NULL;
  pMCTList[M1] = &MCT[M1];

  /* USER CODE BEGIN MCboot 2 */

  /* USER CODE END MCboot 2 */

  bMCBootCompleted = 1;//电机初始化完成标志置1
}

 

2.1电机状态初始化

(1)STM_Init()函数

该函数主要是初始化状态机为空闲、初始化当前的故障状态为无故障,初始化历史的故障状态为无故障:

__weak void STM_Init( STM_Handle_t * pHandle )
{

  pHandle->bState = IDLE;
  pHandle->hFaultNow = MC_NO_FAULTS;
  pHandle->hFaultOccurred = MC_NO_FAULTS;
}

 

(2)bMCBootCompleted变量

该变量为电机初始化完成的标志,记录电机是否已经初始化完成,在中频任务中会对该变量进行检测。

 

(3)数组pCLM[]

该变量是为了初始化电机运行的参数限制值,读取设置的极限值。

 

2.2PWM 和电流传感器组件初始化

(1)变量结构体pwmcHandle,将系统设置的PWM相关的所有参数进行赋值,该参数可以通过软件MotorControl Workbench进行设置,对某些参数,也可以自己进行更改,前提是必须对这部分参数非常熟悉,否则会出现意想不到的结局。

PWMC_R3_2_Handle_t PWM_Handle_M1=
{
  {
    .pFctGetPhaseCurrents              = &R3_2_GetPhaseCurrents,//返回电机相电流
    .pFctSwitchOffPwm                  = &R3_2_SwitchOffPWM,//关闭定时器生成PWM
    .pFctSwitchOnPwm                   = &R3_2_SwitchOnPWM,//打开定时器,生成PWM,占空比为50%
    .pFctCurrReadingCalib              = &R3_2_CurrentReadingCalibration,//读取 Ia 和 Ib 电流反馈模拟通道上存在的电压
    .pFctTurnOnLowSides                = &R3_2_TurnOnLowSides,//打开底边开关,给启动电容充电
    .pFctSetADCSampPointSectX          = &R3_2_SetADCSampPointSectX,//设置ADC采样的扇区
    .pFctIsOverCurrentOccurred         = &R3_2_IsOverCurrentOccurred,//检查自上次调用以来是否发生过电流
    .pFctOCPSetReferenceVoltage        = MC_NULL,//设置参考电压
    .pFctRLDetectionModeEnable         = &R3_2_RLDetectionModeEnable,//使能 R/L 检测的 PWM 模式。
    .pFctRLDetectionModeDisable        = &R3_2_RLDetectionModeDisable,//失能 R/L 检测的 PWM 模式。
    .pFctRLDetectionModeSetDuty        = &R3_2_RLDetectionModeSetDuty,//设置 RL 检测模式期间的 PWM 占空比。
    .hT_Sqrt3 = (PWM_PERIOD_CYCLES*SQRT3FACTOR)/16384u,//PWM 算法使用的常数,(108MHz/16KHz)*(16384 * 1.732051 * 2)/16384
    .Sector = 0,//空间矢量扇区数
    .CntPhA = 0,//A相PWM占空比
    .CntPhB = 0,//B相PWM占空比
    .CntPhC = 0,//C相PWM占空比
    .SWerror = 0,//包含有关软件错误的状态
    .TurnOnLowSidesAction = false,//TurnOnLowSides当前状态
    .OffCalibrWaitTimeCounter = 0,//计数器在电机电流测量偏移校准之前等待固定时间。 
    .Motor = 0,//电机数量
    .RLDetectionMode = false,//失能RL 检测模式
    .Ia = 0,//A相电流
    .Ib = 0,//B相电流
    .Ic = 0,//C相电流
    .DTTest = 0,
    .DTCompCnt = DTCOMPCNT,//半死区时间:1000*108MHZ/2000
    .PWMperiod          = PWM_PERIOD_CYCLES,//(108MHz/16KHz)
    .OffCalibrWaitTicks = (uint16_t)((SYS_TICK_FREQUENCY * OFFCALIBRWAIT_MS)/ 1000),// 当前读数校准前的等待时间,以 PWMC_CurrentReadingCalibr() 的调用次数表示,并带有动作
    .Ton                 = TON,//开启时间500*108MHz/2000
    .Toff                = TOFF//关闭时间500*108MHz/2000
  },
  .PhaseAOffset = 0,//A相电流偏移值
  .PhaseBOffset = 0,//B相电流偏移值
  .PhaseCOffset = 0,//C相电流偏移值
  .Half_PWMPeriod = PWM_PERIOD_CYCLES/2u,//定时器时钟计数中的半个 PWM 周期
  .PolarizationCounter = 0,//校准阶段执行的转换次数
  .ADCTriggerEdge = 0,//触发边沿选择
  .pParams_str = &R3_2_ParamsM1,

};

(2)函数R3_2_Init()的作用是在三个分流配置中初始化 TIM、ADC、GPIO、DMA 和 NVIC 以用于电流读取和 PWM 生成。

 

2.3开启定时器

  函数startTimers()的作用是,初始化TIM2。利用 TIM2 作为临时定时器来实现 PWM 信号之间的同步。调用此函数时,TIM1 和/或 TIM8 必须处于冻结状态,并且正确设置了 CNT、ARR、REP RATE 和触发器(这些设置通常在 Init 方法中进行相应地与配置)。

__weak void startTimers( void )
{
  uint32_t isTIM2ClockOn;
  uint32_t trigOut;

  isTIM2ClockOn = LL_APB1_GRP1_IsEnabledClock ( LL_APB1_GRP1_PERIPH_TIM2 );
  if ( isTIM2ClockOn == 0 )
  {
    /* Temporary Enable TIM2 clock if not already on */
    LL_APB1_GRP1_EnableClock ( LL_APB1_GRP1_PERIPH_TIM2 );
    LL_TIM_GenerateEvent_UPDATE ( TIM2 );
    LL_APB1_GRP1_DisableClock ( LL_APB1_GRP1_PERIPH_TIM2 );
  }
  else
  {
    trigOut = LL_TIM_ReadReg( TIM2, CR2 ) & TIM_CR2_MMS;
    LL_TIM_SetTriggerOutput( TIM2, LL_TIM_TRGO_UPDATE );
    LL_TIM_GenerateEvent_UPDATE ( TIM2 );
    LL_TIM_SetTriggerOutput( TIM2, trigOut );
  }
}

 

2.4 PID初始化

函数PID_HandleInit()初始化默认设置的PID的值。将结构体PIDSpeedHandle_M1中的参数进行赋值。

__weak void PID_HandleInit( PID_Handle_t * pHandle )
{
  pHandle->hKpGain =  pHandle->hDefKpGain;
  pHandle->hKiGain =  pHandle->hDefKiGain;
  pHandle->hKdGain =  pHandle->hDefKdGain;
  pHandle->wIntegralTerm = 0x00000000UL;
  pHandle->wPrevProcessVarError = 0x00000000UL;
}
PID_Handle_t PIDSpeedHandle_M1 =
{
  .hDefKpGain          = (int16_t)PID_SPEED_KP_DEFAULT,//默认速度KP的值为10
  .hDefKiGain          = (int16_t)PID_SPEED_KI_DEFAULT,//默认速度Ki的值为7
  .wUpperIntegralLimit = (int32_t)IQMAX * (int32_t)SP_KIDIV,//积分饱和的上限值:10026*256
  .wLowerIntegralLimit = -(int32_t)IQMAX * (int32_t)SP_KIDIV,//积分饱和的下限值:-10026*256
  .hUpperOutputLimit       = (int16_t)IQMAX,//PI输出饱和的上限:10026
  .hLowerOutputLimit       = -(int16_t)IQMAX,//PI输出饱和的下限:-10026
  .hKpDivisor          = (uint16_t)SP_KPDIV,//Kp 增益除数:16
  .hKiDivisor          = (uint16_t)SP_KIDIV,//Ki 增益除数:256
  .hKpDivisorPOW2      = (uint16_t)SP_KPDIV_LOG,//Kp 增益除数表示为 2 的幂
  .hKiDivisorPOW2      = (uint16_t)SP_KIDIV_LOG,//Ki 增益除数表示为 2 的幂
  .hDefKdGain           = 0x0000U,//默认速度KP的值为0
  .hKdDivisor           = 0x0000U,//Kd 增益除数:0
  .hKdDivisorPOW2       = 0x0000U,//Kd 增益除数表示为 2 的幂
};

变量pPIDSpeed[]同样是把结构体PIDSpeedHandle_M1中的参数进行赋值。

 

2.5 主速度传感器组件初始化

变量pSTC[]把结构体SpeednTorqCtrlM1中的参数进行赋值。对电机运行的转速范围、扭矩范围进行设置。

SpeednTorqCtrl_Handle_t SpeednTorqCtrlM1 =
{
  .STCFrequencyHz =           		MEDIUM_FREQUENCY_TASK_RATE,//用户更新扭矩频率,以 Hz 表示,1000
  .MaxAppPositiveMecSpeedUnit =	(uint16_t)(MAX_APPLICATION_SPEED_UNIT),//正转最大速度:1000r/min
  .MinAppPositiveMecSpeedUnit =	(uint16_t)(MIN_APPLICATION_SPEED_UNIT),//正转最小速度:0r/min
  .MaxAppNegativeMecSpeedUnit =	(int16_t)(-MIN_APPLICATION_SPEED_UNIT),//反转最小速度:0r/min
  .MinAppNegativeMecSpeedUnit =	(int16_t)(-MAX_APPLICATION_SPEED_UNIT),//反转最大速度:1000r/min
  .MaxPositiveTorque =				(int16_t)NOMINAL_CURRENT,//正转最大扭矩:10026
  .MinNegativeTorque =				-(int16_t)NOMINAL_CURRENT,//反转最小扭矩:10026
  .ModeDefault =					DEFAULT_CONTROL_MODE,//默认控制模式:速度模式
  .MecSpeedRefUnitDefault =		(int16_t)(DEFAULT_TARGET_SPEED_UNIT),//目标速度:500r/min
  .TorqueRefDefault =				(int16_t)DEFAULT_TORQUE_COMPONENT,//默认扭矩:0
  .IdrefDefault =					(int16_t)DEFAULT_FLUX_COMPONENT,//默认Id电流:0
};

 

函数STO_PLL_Init()的作用是根据结构体STO_PLL_M1初始化状态观察器的参数。结构体STO_PLL_M1的参数如下:

STO_PLL_Handle_t STO_PLL_M1 =
{
  ._Super = {
	  .bElToMecRatio                     =	POLE_PAIR_NUM,//电机极对数为4
    .SpeedUnit                         = SPEED_UNIT,//速度单位
    .hMaxReliableMecSpeedUnit          =	(uint16_t)(1.15*MAX_APPLICATION_SPEED_UNIT),//有效的机械速度最大值:1.15*1000
    .hMinReliableMecSpeedUnit          =	(uint16_t)(MIN_APPLICATION_SPEED_UNIT),//有效的机械速度最小值:0
    .bMaximumSpeedErrorsNumber         =	MEAS_ERRORS_BEFORE_FAULTS,//报告错误前无效测量的最大值:3
    .hMaxReliableMecAccelUnitP         =	65535,//测量加速度的最大值:65535
    .hMeasurementFrequency             =	TF_REGULATION_RATE_SCALED,//测量转子电角的频率:16000/(3*1)
    .DPPConvFactor                     =  DPP_CONV_FACTOR,
  },
  .hC1                         =	C1,//状态观察器常数 C1 的变量:1024*0.29/((1600/3)*0.00008)
  .hC2                         =	C2,//状态观测器常数 C2 的变量: -1014
  .hC3                         =	C3,//状态观测器常数 C3 的变量: 1024*((1000*1.2*13.9*√2)/(1000*√3))/(0.00008*(3.3/(2*0.33*1.53))*(16000/3))
  .hC4                         =	C4,//状态观测器常数 C4 的变量: 1126
  .hC5                         =	C5,//状态观测器常数 C5 的变量: 1024*(3.3/(0.0522*√3))/(0.00008*(3.3/(2*0.33*1.53))*(16000/3))
  .hF1                         =	F1,//状态观察器比例因子 F1 的变量 :1024
  .hF2                         =	F2,//状态观察器比例因子 F2 的变量 :16384
  .PIRegulator = {
    .hDefKpGain = PLL_KP_GAIN,//PLL的KP值为399
    .hDefKiGain = PLL_KI_GAIN,//PLL的Ki值为53
    .hDefKdGain = 0x0000U,//PLL的Kd值为0
    .hKpDivisor = PLL_KPDIV,//PLL的KP分频系数为16384
    .hKiDivisor = PLL_KIDIV,//PLL的Ki分频系数为65535
    .hKdDivisor = 0x0000U,//PLL的Kd分频系数为0
    .wUpperIntegralLimit = INT32_MAX, //积分饱和的上限:2147483647
    .wLowerIntegralLimit = -INT32_MAX,//积分饱和的下限:-2147483647
    .hUpperOutputLimit = INT16_MAX,//PI输出饱和的上限:32767
    .hLowerOutputLimit = -INT16_MAX,//PI输出饱和的下限:-32767
    .hKpDivisorPOW2 = PLL_KPDIV_LOG,//Kp 增益除数表示为 2 的幂
    .hKiDivisorPOW2 = PLL_KIDIV_LOG,//Ki 增益除数表示为 2 的幂
    .hKdDivisorPOW2       = 0x0000U,//Kd 增益除数表示为 2 的幂
   },
 .SpeedBufferSizeUnit                =	STO_FIFO_DEPTH_UNIT,//平均估计速度的 FIFO 深度:64
 .SpeedBufferSizeDpp                 =	STO_FIFO_DEPTH_DPP,//FIFO 的深度:64
 .VariancePercentage                 =	PERCENTAGE_FACTOR,//速度估计的最大允许方差:0.1*128
 .SpeedValidationBand_H              =	SPEED_BAND_UPPER_LIMIT,//在启动过程中估计速度可以超过多少强制定子电频率而不会被认为是错误的: 17
 .SpeedValidationBand_L              =	SPEED_BAND_LOWER_LIMIT,//在启动过程中估计速度可以超过多少强制定子电频率而不会被认为是错误的: 15
 .MinStartUpValidSpeed               =	OBS_MINIMUM_SPEED_UNIT,//启动所需的最小机械速度的绝对值: 580r/min
 .StartUpConsistThreshold            =	NB_CONSECUTIVE_TESTS,//启动之前要通过的连续速度一致性测试次数 :2
 .Reliability_hysteresys             =	OBS_MEAS_ERRORS_BEFORE_FAULTS,//速度检查故障返回连续测试失败的次数:3
 .BemfConsistencyCheck               =	BEMF_CONSISTENCY_TOL,//观察到的反电动势的一致性程度:64
 .BemfConsistencyGain                =	BEMF_CONSISTENCY_GAIN,//反电动势一致性时应用的增益; 
 .MaxAppPositiveMecSpeedUnit         =	(uint16_t)(MAX_APPLICATION_SPEED_UNIT*1.15),//转子机械转速的最大正值: 1000*1.15
 .F1LOG                              =	F1_LOG,//状态观察器比例因子 F1 的增益除数表示为 2 的幂
 .F2LOG                              =	F2_LOG,//状态观察器比例因子 F2 的增益除数表示为 2 的幂
 .SpeedBufferSizeDppLOG              =	STO_FIFO_DEPTH_DPP_LOG,//bSpeedBufferSizedpp 表示为 2 的幂
 .hForcedDirection                   =  0x0000U
};

 

2.6 初始化用户参数

函数STC_Init()的作用是初始化2.1~2.5实例化的参数。

 

2.7虚拟速度传感器组件初始化

函数VSS_Init()的作用是设置一个虚拟的速度传感器。在本例程中,没有使用真实的传感器进行读取,系统设置一个虚构的速度传感器,读取电机的实际转速。

 

2.8PID 组件初始化:电流调节(扭矩模式)

初始化Iq和Id。电流模式下Iq的对应的PID参数初始化如下:

PID_Handle_t PIDIqHandle_M1 =
{
  .hDefKpGain          = (int16_t)PID_TORQUE_KP_DEFAULT,//默认扭矩KP的值为714
  .hDefKiGain          = (int16_t)PID_TORQUE_KI_DEFAULT,//默认扭矩Ki的值为485
  .wUpperIntegralLimit = (int32_t)INT16_MAX * TF_KIDIV,//积分饱和的上限值:32767*16384
  .wLowerIntegralLimit = (int32_t)-INT16_MAX * TF_KIDIV,//积分饱和的下限值:-32767*16384
  .hUpperOutputLimit       = INT16_MAX,//PI输出饱和的上限:32767
  .hLowerOutputLimit       = -INT16_MAX,//PI输出饱和的下限:-32767
  .hKpDivisor          = (uint16_t)TF_KPDIV,//Kp 增益除数:16384
  .hKiDivisor          = (uint16_t)TF_KIDIV,//Ki 增益除数:16384
  .hKpDivisorPOW2      = (uint16_t)TF_KPDIV_LOG,//Kp 增益除数表示为 2 的幂
  .hKiDivisorPOW2      = (uint16_t)TF_KIDIV_LOG,//Ki 增益除数表示为 2 的幂
  .hDefKdGain           = 0x0000U,
  .hKdDivisor           = 0x0000U,
  .hKdDivisorPOW2       = 0x0000U,
};

电流模式下Id的对应的PID参数初始化如下:

PID_Handle_t PIDIdHandle_M1 =
{
  .hDefKpGain          = (int16_t)PID_FLUX_KP_DEFAULT,//默认扭矩KP的值为714
  .hDefKiGain          = (int16_t)PID_FLUX_KI_DEFAULT,//默认扭矩Ki的值为485
  .wUpperIntegralLimit = (int32_t)INT16_MAX * TF_KIDIV,//积分饱和的上限值:32767*16384
  .wLowerIntegralLimit = (int32_t)-INT16_MAX * TF_KIDIV,//积分饱和的下限值:-32767*16384
  .hUpperOutputLimit       = INT16_MAX,//PI输出饱和的上限:32767
  .hLowerOutputLimit       = -INT16_MAX,//PI输出饱和的下限:-32767
  .hKpDivisor          = (uint16_t)TF_KPDIV,//Kp 增益除数:16384
  .hKiDivisor          = (uint16_t)TF_KIDIV,//Ki 增益除数:16384
  .hKpDivisorPOW2      = (uint16_t)TF_KPDIV_LOG,//Kp 增益除数表示为 2 的幂
  .hKiDivisorPOW2      = (uint16_t)TF_KIDIV_LOG,//Ki 增益除数表示为 2 的幂
  .hDefKdGain           = 0x0000U,
  .hKdDivisor           = 0x0000U,
  .hKdDivisorPOW2       = 0x0000U,
};

 

2.9总线电压传感器组件初始化

 变量pBusSensorM1 将结构体RealBusVoltageSensorParamsM1中的参数进行赋值。对总线电压范围进行设置,后续ADC读取总线采样值后进行计算的参数均来源于此。
 函数 RVBS_Init()的作用是初始化参数。

RDivider_Handle_t RealBusVoltageSensorParamsM1 =
{
  ._Super                =
  {
    .SensorType          = REAL_SENSOR,//真实传感器
    .ConversionFactor    = (uint16_t)(ADC_REFERENCE_VOLTAGE / VBUS_PARTITIONING_FACTOR),//电压转化系数:3.3/0.0522
  },

  .VbusRegConv =
  {
    .regADC = ADC1,//ADC1
    .channel = MC_ADC_CHANNEL_1,//ADC1的通道1采集总线电压
    .samplingTime = M1_VBUS_SAMPLING_TIME,//采样周期:28
  },
  .LowPassFilterBW       =  M1_VBUS_SW_FILTER_BW_FACTOR,//低通滤波器带宽:10
  .OverVoltageThreshold  = OVERVOLTAGE_THRESHOLD_d,//最大电压:48V
  .UnderVoltageThreshold =  UNDERVOLTAGE_THRESHOLD_d,//最小电压:5V
  .aBuffer = RealBusVoltageSensorFilterBufferM1,//总线电压传感器值过滤缓冲器
};

 

2.10功率转化系数初始化

为简化功率的计算,在此处将功率计算的相关参数进行设置。

PQD_MotorPowMeas_Handle_t PQD_MotorPowMeasM1 =
{
  .wConvFact = PQD_CONVERSION_FACTOR
};

其中PQD_CONVERSION_FACTOR = 1000*3*3.3/(1.732*0.33*1.53)=11320.925

 

2.11温度传感器参数配置

函数NTC_Init()将结构体TempSensorParamsM1中的参数进行赋值。

NTC_Handle_t TempSensorParamsM1 =
{
  .bSensorType = REAL_SENSOR,//真实传感器
  .TempRegConv =
  {
    .regADC = ADC1,//ADC1
    .channel = MC_ADC_CHANNEL_12,//ADC1的通道12为采集温度
    .samplingTime = M1_TEMP_SAMPLING_TIME,//温度采样时间:28
  },
  .hLowPassFilterBW        = M1_TEMP_SW_FILTER_BW_FACTOR,//低通滤波器带宽:250
  .hOverTempThreshold      = (uint16_t)(OV_TEMPERATURE_THRESHOLD_d),//最大温度值:(1.055+0.023*(50-25))*65535/3.3
  .hOverTempDeactThreshold = (uint16_t)(OV_TEMPERATURE_THRESHOLD_d - OV_TEMPERATURE_HYSTERESIS_d),//(1.055+0.023*(50-25))*65535/3.3-(0.023*10*65535/3.3)
  .hSensitivity            = (uint16_t)(ADC_REFERENCE_VOLTAGE/dV_dT),//NTC灵敏度:3.3/0.023
  .wV0                     = (uint16_t)(V0_V *65536/ ADC_REFERENCE_VOLTAGE),//V0电压常数:1.055*65535/3.3
  .hT0                     = T0_C,//T0 温度常数值:25 
};

2.12 初始化FOC的参数

此处函数中,将上述实例化的参数赋值给FOC相关的所对应的变量或结构体,在电机运行时进行计算,控制电机运行。

  FOC_Clear(M1);//重新初始化电流和电压变量
  FOCVars[M1].bDriveInput = EXTERNAL;//参考源为外部
  FOCVars[M1].Iqdref = STC_GetDefaultIqdref(pSTC[M1]);//获取Iq,Id值
  FOCVars[M1].UserIdref = STC_GetDefaultIqdref(pSTC[M1]).d;//获取用户设置的Id值
  oMCInterface[M1] = & Mci[M1];//初始化电机的控制参数
  MCI_Init(oMCInterface[M1], &STM[M1], pSTC[M1], &FOCVars[M1] );//初始化所有对象变量
  MCI_ExecSpeedRamp(oMCInterface[M1],//设置电机速度斜坡的缓冲
  STC_GetMecSpeedRefUnitDefault(pSTC[M1]),0); /*First command to STC*///机械转子速度参考
  pMCIList[M1] = oMCInterface[M1];
  MCT[M1].pPIDSpeed = pPIDSpeed[M1];//初始化PID参数
  MCT[M1].pPIDIq = pPIDIq[M1];//初始化PID参数
  MCT[M1].pPIDId = pPIDId[M1];//初始化PID参数
  MCT[M1].pPIDFluxWeakening = MC_NULL; /* if M1 doesn't has FW */
  MCT[M1].pPWMnCurrFdbk = pwmcHandle[M1];
  MCT[M1].pRevupCtrl = &RevUpControlM1;              /* only if M1 is sensorless*/
  MCT[M1].pSpeedSensorMain = (SpeednPosFdbk_Handle_t *) &STO_PLL_M1;
  MCT[M1].pSpeedSensorAux = MC_NULL;
  MCT[M1].pSpeedSensorVirtual = &VirtualSpeedSensorM1;  /* only if M1 is sensorless*/
  MCT[M1].pSpeednTorqueCtrl = pSTC[M1];
  MCT[M1].pStateMachine = &STM[M1];
  MCT[M1].pTemperatureSensor = (NTC_Handle_t *) pTemperatureSensor[M1];
  MCT[M1].pBusVoltageSensor = &(pBusSensorM1->_Super);
  MCT[M1].pBrakeDigitalOutput = MC_NULL;   /* brake is defined, oBrakeM1*/
  MCT[M1].pNTCRelay = MC_NULL;             /* relay is defined, oRelayM1*/
  MCT[M1].pMPM =  (MotorPowMeas_Handle_t*)pMPM[M1];
  MCT[M1].pFW = MC_NULL;
  MCT[M1].pFF = MC_NULL;

  MCT[M1].pPosCtrl = MC_NULL;

  MCT[M1].pSCC = MC_NULL;
  MCT[M1].pOTT = MC_NULL;
  pMCTList[M1] = &MCT[M1];

 

至此,电机所有相关参数均配置完成了。

此帖出自电机控制论坛

最新回复

电机版主   详情 回复 发表于 2022-4-16 17:16
点赞 关注(1)
个人签名

没有什么不可以,我就是我,不一样的烟火! 

 
 

回复
举报

6802

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

F746ZG电机所有相关参数均配置讲的很细了

 

此帖出自电机控制论坛

点评

谢谢支持  详情 回复 发表于 2021-10-21 12:32
 
 
 

回复

1942

帖子

2

TA的资源

版主

板凳
 

这电机配置还真不少啊!

此帖出自电机控制论坛

点评

电机配置起来参数非常多,很多人都卡这里了  详情 回复 发表于 2021-10-21 12:33
 
 
 

回复

1411

帖子

3

TA的资源

版主

4
 
F746ZG电机所有相关参数均配置讲的很细了

 

谢谢支持
此帖出自电机控制论坛
 
 
 

回复

1411

帖子

3

TA的资源

版主

5
 
这电机配置还真不少啊!

电机配置起来参数非常多,很多人都卡这里了
此帖出自电机控制论坛

点评

不了解的人还配置不了呀。  详情 回复 发表于 2021-10-21 13:06
 
 
 

回复

1942

帖子

2

TA的资源

版主

6
 
annysky2012 发表于 2021-10-21 12:33 电机配置起来参数非常多,很多人都卡这里了

不了解的人还配置不了呀。

此帖出自电机控制论坛

点评

是的,的却如此。所以电机驱动复杂  详情 回复 发表于 2021-10-21 17:24
 
 
 

回复

1411

帖子

3

TA的资源

版主

7
 
annysky2012 发表于 2021-10-21 12:33
电机配置起来参数非常多,很多人都卡这里了

不了解的人还配置不了呀。

是的,的却如此。所以电机驱动复杂
此帖出自电机控制论坛
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

8
 

你这个注释有点意思,把结构体展开了注释,不用记忆太多东西!点赞!

此帖出自电机控制论坛

点评

谢谢夸奖和支持。最近在想着做下一贴,可是看到数学公式给我难住了。想发个帖子真是好难呀。首先自己得明白,才能写出来,如果自己不清楚不懂,写出来也是一塌糊涂  详情 回复 发表于 2021-10-26 22:59
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

1411

帖子

3

TA的资源

版主

9
 
freebsder 发表于 2021-10-26 17:10 你这个注释有点意思,把结构体展开了注释,不用记忆太多东西!点赞!

谢谢夸奖和支持。最近在想着做下一贴,可是看到数学公式给我难住了。想发个帖子真是好难呀。首先自己得明白,才能写出来,如果自己不清楚不懂,写出来也是一塌糊涂

此帖出自电机控制论坛

点评

数学公式本身不算复杂,park和clark两个变换,然后一般是pid调控制吧,然后有个观察器之类的。个人觉得这个东西工程比算式难一些,哈哈。  详情 回复 发表于 2021-10-27 13:44
个人签名

没有什么不可以,我就是我,不一样的烟火! 

 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

10
 
annysky2012 发表于 2021-10-26 22:59 谢谢夸奖和支持。最近在想着做下一贴,可是看到数学公式给我难住了。想发个帖子真是好难呀。首先自己得明 ...

数学公式本身不算复杂,park和clark两个变换,然后一般是pid调控制吧,然后有个观察器之类的。个人觉得这个东西工程比算式难一些,哈哈。

此帖出自电机控制论坛

点评

自己能够理解别人才能理解  详情 回复 发表于 2021-10-31 22:35
是的是的,工程化后的却很复杂,后面我都不知道如何来写帖子了,因为涉及的参数非常多,还要计算等等  详情 回复 发表于 2021-10-31 22:34
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

1411

帖子

3

TA的资源

版主

11
 
freebsder 发表于 2021-10-27 13:44 数学公式本身不算复杂,park和clark两个变换,然后一般是pid调控制吧,然后有个观察器之类的。个人觉得这 ...

是的是的,工程化后的却很复杂,后面我都不知道如何来写帖子了,因为涉及的参数非常多,还要计算等等

此帖出自电机控制论坛

点评

是的,太多参数,梳理起来都是一个不小的工程。  详情 回复 发表于 2021-11-2 13:42
个人签名

没有什么不可以,我就是我,不一样的烟火! 

 
 
 

回复

1411

帖子

3

TA的资源

版主

12
 
freebsder 发表于 2021-10-27 13:44 数学公式本身不算复杂,park和clark两个变换,然后一般是pid调控制吧,然后有个观察器之类的。个人觉得这 ...

自己能够理解别人才能理解

此帖出自电机控制论坛
个人签名

没有什么不可以,我就是我,不一样的烟火! 

 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

13
 
annysky2012 发表于 2021-10-31 22:34 是的是的,工程化后的却很复杂,后面我都不知道如何来写帖子了,因为涉及的参数非常多,还要计算等等

是的,太多参数,梳理起来都是一个不小的工程。

此帖出自电机控制论坛
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
你好我有些问题,就是R/L检测模式是什么?
此帖出自电机控制论坛
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

15
 

电机版主

此帖出自电机控制论坛
个人签名

能吃会睡,未来可期

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表