电流
直播中

fanB

8年用户 1446经验值
擅长:20615
私信 关注
[问答]

怎样去修改STM32 FOC 5.2电机库的电流采样

怎样去使用STM32 FOC 5.2的电机库?

怎样去修改STM32 FOC 5.2电机库的电流采样?

回帖(1)

梅宁琛

2021-10-11 14:53:55
  使用STM32 FOC 5.2的电机库,硬件做电流采样时使用的是海外放大,但电机库中使用的是同向放大,ST的配置上位机中的电流采样参考图:不过是
  
  我们的电流采样威廉希尔官方网站 如下:
  
  所以要修改ST的FOC电机库源码,路径是:。./MCSDK_v5.2.0-Full/MotorControl/MCSDK/MCLib/F1xx/Src/r3_hd2_pwm_curr_fdbk.c对应如下内容:
  void R3HD2_GetPhaseCurrents( PWMC_Handle_t * pHdl, Curr_Components* pStator_Currents )
  {
  uint8_t bSector;
  int32_t wAux;
  PWMC_R3_HD2_Handle_t * pHandle = (PWMC_R3_HD2_Handle_t *) pHdl;
  /* Deactivate TIMx CH4 to disable next triggers using bit-banding access */
  *(uint32_t*) (pHandle-》wTIMxCH4_BB_Addr) = 0u;
  /* Reset the SOFOC flag to indicate the start of FOC algorithm*/
  pHandle-》bSoFOC = 0u;
  bSector = (uint8_t) pHdl-》hSector;
  switch ( bSector )
  {
  case SECTOR_4:
  case SECTOR_5:
  /* Current on Phase C is not accessible */
  /* Ia = PhaseAOffset - ADC converted value) */
  wAux = (int32_t)( ADC1-》JDR1 );
  wAux *= 2;
  wAux = wAux - (int32_t)( pHandle-》wPhaseAOffset ) ;
  /* Saturation of Ia */
  if ( wAux 《 -INT16_MAX )
  {
  pStator_Currents-》qI_Component1 = -INT16_MAX;
  }
  else if ( wAux 》 INT16_MAX )
  {
  pStator_Currents-》qI_Component1 = INT16_MAX;
  }
  else
  {
  pStator_Currents-》qI_Component1 = (int16_t) wAux;
  }
  /* Ib = PhaseBOffset - ADC converted value) */
  wAux = (int32_t)( pHandle-》pParams_str-》ADCx2-》JDR1 );
  wAux *= 2;
  wAux = wAux - (int32_t)( pHandle-》wPhaseBOffset ) ;
  /* Saturation of Ib */
  if ( wAux 《 -INT16_MAX )
  {
  pStator_Currents-》qI_Component2 = -INT16_MAX;
  }
  else if ( wAux 》 INT16_MAX )
  {
  pStator_Currents-》qI_Component2 = INT16_MAX;
  }
  else
  {
  pStator_Currents-》qI_Component2 = (int16_t) wAux;
  }
  break;
  case SECTOR_6:
  case SECTOR_1:
  /* Current on Phase A is not accessible */
  /* Ib = PhaseBOffset - ADC converted value) */
  wAux = (int32_t)( ADC1-》JDR1 );
  wAux *= 2;
  wAux = wAux - (int32_t)( pHandle-》wPhaseBOffset ) ; //Ib
  /* Saturation of Ib */
  if ( wAux 《 -INT16_MAX )
  {
  pStator_Currents-》qI_Component2 = -INT16_MAX;
  }
  else if ( wAux 》 INT16_MAX )
  {
  pStator_Currents-》qI_Component2 = INT16_MAX;
  }
  else
  {
  pStator_Currents-》qI_Component2 = (int16_t) wAux;
  }
  /* Ia = -Ic -Ib */
  wAux = (int32_t)( pHandle-》pParams_str-》ADCx2-》JDR1 );
  wAux *= 2;
  wAux = (int32_t) pHandle-》wPhaseCOffset - wAux; //Ic
  wAux -= (int32_t) pStator_Currents-》qI_Component2; //-Ic-Ib wAux = -wAux-pStator_Currents-》qI_Component2
  /* Saturation of Ia */
  if ( wAux 》 INT16_MAX )
  {
  pStator_Currents-》qI_Component1 = INT16_MAX;
  }
  else if ( wAux 《 -INT16_MAX )
  {
  pStator_Currents-》qI_Component1 = -INT16_MAX;
  }
  else
  {
  pStator_Currents-》qI_Component1 = (int16_t) wAux;
  }
  break;
  case SECTOR_2:
  case SECTOR_3:
  /* Current on Phase B is not accessible */
  /* Ia = PhaseAOffset - ADC converted value) */
  wAux = (int32_t)( ADC1-》JDR1 );
  wAux *= 2;
  wAux = wAux - (int32_t)( pHandle-》wPhaseAOffset ) ;
  /* Saturation of Ia */
  if ( wAux 《 -INT16_MAX )
  {
  pStator_Currents-》qI_Component1 = -INT16_MAX;
  }
  else if ( wAux 》 INT16_MAX )
  {
  pStator_Currents-》qI_Component1 = INT16_MAX;
  }
  else
  {
  pStator_Currents-》qI_Component1 = (int16_t) wAux;
  }
  /* Ib = -Ic -Ia */
  wAux = (int32_t)( pHandle-》pParams_str-》ADCx2-》JDR1 );
  wAux *= 2;
  wAux = (int32_t) pHandle-》wPhaseCOffset - wAux;
  wAux -= (int32_t) pStator_Currents-》qI_Component1;
  /* Saturation of Ib */
  if ( wAux 》 INT16_MAX )
  {
  pStator_Currents-》qI_Component2 = INT16_MAX;
  }
  else if ( wAux 《 -INT16_MAX )
  {
  pStator_Currents-》qI_Component2 = -INT16_MAX;
  }
  else
  {
  pStator_Currents-》qI_Component2 = (int16_t) wAux;
  }
  break;
  default:
  break;
  }
  pHandle-》_Super.hIa = pStator_Currents-》qI_Component1;
  pHandle-》_Super.hIb = pStator_Currents-》qI_Component2;
  pHandle-》_Super.hIc = -pStator_Currents-》qI_Component1 - pStator_Currents-》qI_Component2;
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分