STM32 FOC R3_2_SetADCSampPointSectX函数分析

       本文分析STM32 FOC库R3_2_SetADCSampPointSectX函数。

        R3_2_SetADCSampPointSectX用于确认ADC采样时刻。

        3电阻电流采样以下图为例,电阻只能测量下管导通电流,理想电流采样点大概有如下图粉色方框的3个区域。AX、BY、CZ分别对应定时器1的通道1-3的互补PWM输出。波形图左侧起始对应定时器CNT=ARR。

图1

__weak uint16_t R3_2_SetADCSampPointSectX( PWMC_Handle_t * pHdl )
{
  PWMC_R3_2_Handle_t * pHandle = ( PWMC_R3_2_Handle_t * )pHdl;

  uint16_t hCntSmp;
  uint16_t hDeltaDuty;
  register uint16_t lowDuty = pHdl->lowDuty;
  register uint16_t midDuty = pHdl->midDuty;

  /* Check if sampling AB in the middle of PWM is possible */
  if ( ( uint16_t )( pHandle->Half_PWMPeriod - lowDuty ) > pHandle->pParams_str->hTafter )
  {
    /* When it is possible to sample in the middle of the PWM period, always sample the same phases
     * (AB are chosen) for all sectors in order to not induce current discontinuities when there are differences
     * between offsets */

    /* sector number needed by GetPhaseCurrent, phase A and B are sampled wIch corresponds
     * to sector 4 */
    pHandle->_Super.Sector = SECTOR_4;

    /* set sampling  point trigger in the middle of PWM period */
    hCntSmp = ( uint32_t )( pHandle->Half_PWMPeriod ) - 1u;
  }
  else
  { // lowDuty + pHandle->pParams_str->hTafter >= pHandle->Half_PWMPeriod
    /* ADC Injected sequence configuration. The stator phase with minimum value of complementary
    duty cycle is set as first. In every sector there is always one phase with maximum complementary duty,
    one with minimum complementary duty and one with variable complementary duty. In this case, phases
    with variable complementary duty and with maximum duty are converted and the first will be always
    the phase with variable complementary duty cycle */

    /* Crossing Point Searching */
    hDeltaDuty = ( uint16_t )( lowDuty - midDuty );

    /* Definition of crossing point */
    if ( hDeltaDuty > ( uint16_t )( pHandle->Half_PWMPeriod - lowDuty ) * 2u )
    {
      /* hTbefore = 2*Ts + Tc, where Ts = Sampling time of ADC, Tc = Conversion Time of ADC */
      hCntSmp = lowDuty - pHandle->pParams_str->hTbefore;
    }
    else
    {
      /* hTafter = DT + max(Trise, Tnoise) */
      hCntSmp = lowDuty + pHandle->pParams_str->hTafter;

      if ( hCntSmp >= pHandle->Half_PWMPeriod )
      {
          /* It must be changed the trigger direction from positive to negative
               to sample after middle of PWM*/
        pHandle->ADCTriggerEdge = LL_ADC_INJ_TRIG_EXT_FALLING;

        hCntSmp = ( 2u * pHandle->Half_PWMPeriod ) - hCntSmp - 1u;
      }
    }
  }

  return R3_2_WriteTIMRegisters( &pHandle->_Super, hCntSmp );
}

 函数用到两个关键参数pHandle->pParams_str->hTafter、pHandle->pParams_str->hTbefore,它们定义如下图

图2

图3

hTafter定义为PWM死区时间+MOS管开关引起的电流振铃时间。每次开关管动作后需要经过hTafter时间后才能触发ADC电流采样。

hTbefore定义为ADC触发延迟+ADC采样保持时间。触发电流采样的时刻到MOS管动作之间时间不能小于hTbefore。

hTafter、hTbefore时间单位为定时器时钟个数。

TW_BEFORE = (ADC_TRIG_CONV_LATENCY_CYCLES + ADC_SAMPLING_CYCLES) * ADV_TIM_CLK_MHz) / ADC_CLK_MHz  + 1

                       = (3 + 28) * 168 / 21 + 1 = 249

TW_AFTER = ((DEADTIME_NS+MAX_TNTR_NS)*ADV_TIM_CLK_MHz)/1000ul)

                    = (800 + 2550) * 168 / 1000 =  563

hTafter大于hTbefore。

区域1

图1中区域1对应代码如下:

图4

如下图\Delta1起始对应ABC三项最后一个下桥臂MOS管打开。从\Delta1起始延时Tafter定时器CNT增计数还没有到ARR,这种情况就可以把电流采样ADC触发时刻定位hCntSmp = ( uint32_t )( pHandle->Half_PWMPeriod ) - 1u,此时ABC三项的都是下桥臂MOS管打开,3项电流采样电阻都符合采样条件,STM32F407只有两个ADC,所以只能同时采样两路,这里决定将扇区确定为4,同时采样AB。总是采样相同的相位(选择AB),以便在存在差异时不会引起电流不连续。

图5

区域2

        图1中区域2对应代码如下:

图6

        区域2对应图5,\Delta2 > \Delta1, ADC触发采样时刻取CCR4=CCRmax - hTbefore, 对应程序中hCntSmp = lowDuty - pHandle->pParams_str->hTbefore;

区域3

        图1中区域3对应代码如下:

区域3对应\Delta1<=2*hTafter且\Delta2 <= \Delta1,取电流采样时刻CCR4=2*ARR - (CCRmax+hTbefore),同时区域3对应通道4的下降沿,所以ADC修改为下降沿触发。

即hCntSmp = ( 2u * pHandle->Half_PWMPeriod ) - hCntSmp - 1u;粉色方框中 if (hCntSmp >= pHandle->Half_PWMPeriod )恒为真。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
V5.4.4/19-2020年5月 主要变化 版本5.4.4主要是X-Cube-MCSDKv5.4.3版本的bug修复版。还介绍了一些新的功能。 在STM32F3上增加对PFC的支持。这种支持是增加作为一个例子的Steval-CTM010V1双电机演示板。 Atolic TrueSTUDIO&SW4STM32降级。Atolic TrueSTUDIO和SW4STM32 IDE不再积极开发,ST的战略是用STM32CubeIDE取代它们。最近的STM 32系列,例如STM32G4设备,已经不支持所有这些IDE。在不久的将来发布的MotorControlSDK中,对这些IDE的支持将被放弃,不再可能从Workbench为它们生成一个项目。 介绍了STM32G4xx剪切2.2设备上存在的注入ADC转换问题的解决方法。见专用区段下面是更多细节。 重新引入了正确的STMotorProfiler版本(与SDK的5.4.1版本相同)。与MCSDK 5.4.2和5.4.3一起交付的马达剖面仪是不完整的。 修正了双驱动配置中第二个驱动器的最大应用电流设置错误的问题。 修正了使用绝对位置编码器(带有Z信号)的位置控制配置的问题。 修正了位置控制的另一个问题,在这个问题上,除以0是可能的。 修正了ICS配置中的自举电容器电荷问题 修正了在偏移测量回路中可能发生的SW误差。 修正了一个代码生成问题,当启用开环时会导致编译错误。 修正了STM32H7示例编译问题--缺少的文件已经被添加。 修正了一些STM32G0和STM32F0设备的生成问题,这些设备中不存在TIM2,但是在代码中还是引用了TIM2。这导致编译失败。 修正了STM32F1高清设备在单分流配置中的一个问题 在工作台中,最大PWM频率现在可以设置为500 kHz。 修正了一个问题,因为有限的RShunt决议。现在,接受0.00025Ω之类的值。 修正了IHM34V2逆变板的N维也纳配置问题。 修正了一个工作台问题,在创建基于Nucleo-G431RB控制板的新项目时导致错误的引脚分配。见部分用Nucleo-G431RB分配引脚更多细节。 修正了导致某些电源板过电流设置不正确的问题。见部分某些电源板的过流设置校正 使用户能够使用STM32L452选择DAC通道2

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值