[FOC-Stm32]STM32平台三电阻采样

准备条件:

使用STM32 MOTORCONTROL WORKBENCH 软件新建FOC案例(控制板、驱动板按硬件选取),电流采样选三电阻模式。

 配置好电机参数生成工程代码。

打开项目文件夹中的.ioc文件

用定时器中断触发ADC采样,设置定时器TIM1的通道4为PWM Generation No Output,中断输出的Trigger Event Selection TRGO为输出比较模式,比较参考为OC4REF,即通道4上的参考量。

启用ADC注入通道,外部触发源选择定时器的触发事件,也就是我们上面设置的通道4比较。

打开Keil工程文件,r3_2_xxxx_pwm_curr_fdbk.c中存放电流采样的执行函数__weak void R3_2_GetPhaseCurrents( PWMC_Handle_t * pHdl, ab_t * Iab ),该函数的输入为PWM和电流反馈的数据结构体,输出为两相采样电流值。

以下代码分别获取当前扇区和两个ADC通道对应的采样值。

  Sector = ( uint8_t )pHandle->_Super.Sector;
  ADCDataReg1 = *pHandle->pParams_str->ADCDataReg1[Sector];
  ADCDataReg2 = *pHandle->pParams_str->ADCDataReg2[Sector];

接下来运行switch(Sector),每个扇区不对PWM下桥低电平占空比较小的相进行电流采样,避免去采样PWM占空比接近100%的那一相电流。

这里就很奇怪了,ADC通道内的数据是怎样与扇区对应上的?

搜索ADCDataReg1,发现里面存放了ADC采样数据的地址,而它上面ADCConfig1存放了通道的地址,可想而知,应该是不同扇区采样的通道不同。

  .ADCConfig1 = { MC_ADC_CHANNEL_7<<ADC_JSQR_JSQ1_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
                , MC_ADC_CHANNEL_1<<ADC_JSQR_JSQ1_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
                , MC_ADC_CHANNEL_1<<ADC_JSQR_JSQ1_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
                , MC_ADC_CHANNEL_1<<ADC_JSQR_JSQ1_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
                , MC_ADC_CHANNEL_1<<ADC_JSQR_JSQ1_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
                , MC_ADC_CHANNEL_7<<ADC_JSQR_JSQ1_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
                },
  .ADCConfig2 = { MC_ADC_CHANNEL_6<<ADC_JSQR_JSQ1_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
                , MC_ADC_CHANNEL_6<<ADC_JSQR_JSQ1_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
                , MC_ADC_CHANNEL_6<<ADC_JSQR_JSQ1_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
                , MC_ADC_CHANNEL_7<<ADC_JSQR_JSQ1_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
                , MC_ADC_CHANNEL_7<<ADC_JSQR_JSQ1_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
                , MC_ADC_CHANNEL_6<<ADC_JSQR_JSQ1_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT)
                },
  .ADCDataReg1 = { &ADC1->JDR1
                 , &ADC1->JDR1
                 , &ADC1->JDR1
                 , &ADC1->JDR1
                 , &ADC1->JDR1
                 , &ADC1->JDR1
                 },
  .ADCDataReg2 = { &ADC2->JDR1
                 , &ADC2->JDR1
                 , &ADC2->JDR1
                 , &ADC2->JDR1
                 , &ADC2->JDR1
                 , &ADC2->JDR1
                 },

继续搜索 ADCConfig1,发现它在__weak void * R3_2_TIMx_UP_IRQHandler( PWMC_R3_2_Handle_t * pHandle )函数中执行,这个函数由定时器1更新中断执行,ADC的注入采样通道通过扇区进行选择。然后开启通道四的比较触发和ADC采样触发。

  ADCx_1->JSQR = pHandle->pParams_str->ADCConfig1[pHandle->_Super.Sector] | (uint32_t) pHandle->ADC_ExternalPolarityInjected;
  ADCx_2->JSQR = pHandle->pParams_str->ADCConfig2[pHandle->_Super.Sector] | (uint32_t) pHandle->ADC_ExternalPolarityInjected;

  LL_TIM_SetTriggerOutput(TIMx, LL_TIM_TRGO_OC4REF);
   
  pHandle->ADC_ExternalPolarityInjected = (uint16_t)LL_ADC_INJ_TRIG_EXT_RISING;

最后就是采样点的选取问题,根据STM32的官方文件,通过比较PWM的宽度来选取采样点。 

uint16_t R3_2_SetADCSampPointSectX( PWMC_Handle_t * pHdl )函数中给出了具体代码。首先判断中间窗口区域是否足够大,这部分代码给出的采样点位置与官方说明略有不同,有兴趣的同学可以深入比较一下。

  /* Verify that sampling is possible in the middle of PWM by checking the smallest duty cycle */
   if ( ( uint16_t )( pHandle->Half_PWMPeriod - pHdl->lowDuty ) > pHandle->pParams_str->Tafter )
  {
    /* 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 which corresponds
     * to sector 4 or 5  */
    pHandle->_Super.Sector = SECTOR_5;

    /* set sampling  point trigger in the middle of PWM period */
    SamplingPoint =  pHandle->Half_PWMPeriod - (uint16_t) 1;
  }

  else
  {
    /* In this case it is necessary to convert phases with Maximum and variable complementary duty cycle.*/

    /* 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 */
    DeltaDuty = ( uint16_t )( pHdl->lowDuty - pHdl->midDuty );

    /* Definition of crossing point */
    if ( DeltaDuty > ( uint16_t )( pHandle->Half_PWMPeriod - pHdl->lowDuty ) * 2u )
    {
      SamplingPoint = pHdl->lowDuty - pHandle->pParams_str->Tbefore;
    }
    else
    {
      SamplingPoint = pHdl->lowDuty + pHandle->pParams_str->Tafter;

      if ( SamplingPoint >= pHandle->Half_PWMPeriod )
      {
         /* ADC trigger edge must be changed from positive to negative */
        pHandle->ADC_ExternalPolarityInjected = (uint16_t) LL_ADC_INJ_TRIG_EXT_FALLING;
        SamplingPoint = ( 2u * pHandle->Half_PWMPeriod ) - SamplingPoint - (uint16_t) 1;
      }
    }
  }

最后输出采样点:R3_2_WriteTIMRegisters( &pHandle->_Super, SamplingPoint );

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: STM32F103单电阻采样FOC (Field Oriented Control)是一种在无刷直流电机中使用的电机控制技术。单电阻采样FOC算法中的一种简化版本,可以有效地减少处理电机控制的计算量和开销。这种技术采用磁场定向控制的方法来实现快速、高效的电机控制,从而提高系统的效率和精度。 在单电阻采样FOC中,电机工作的状态被描述为一个向量空间,并通过控制相电流和电机旋转轴之间的角度来实现磁场的旋转。由于电流和角度是电机状态的唯一参数,通过特定的计算方法和控制算法,可以实现对电机的精确控制。此外,单电阻采样还可以通过减少反馈控制的开销来实现低功耗和高性能的电机控制。 综上所述,STM32F103单电阻采样FOC是一种高效、精确和节能的电机控制技术,可以广泛应用于各种无刷直流电机控制的领域,如工业、家用电器、航空航天等。由于其在节能和提高电机效率方面的优势,单电阻采样FOC技术在未来的电机控制领域中将会有广泛的应用和前景。 ### 回答2: STM32F103是一款基于ARM Cortex-M3内核的32位微控制器。单电阻采样FOC(磁场定向控制)是一种通过对电机的磁场进行测量控制电机转速和位置的方法。 单电阻采样FOC的基本思路是利用电机的电流与位置之间存在的比例关系,通过测量电流和电机位置,来计算磁场位置和磁场强度,从而控制电机的运转。这种方法相比于传统的双电阻采样FOC具有更简单的硬件结构、更高的抗干扰能力和更好的转速响应速度。 在STM32F103上实现单电阻采样FOC,可以通过配置ADC采样电流和位置信号,使用计算机模拟电机模型、进行数学计算和调试等方式来实现。同时,还需要使用定时器和PWM信号控制电机的电压和电流,以达到控制电机转速和位置的目的。 总之,STM32F103单电阻采样FOC是一种高效、可靠、精准的控制电机转速和位置的方法,应用于电机控制领域有着广泛的应用前景。 ### 回答3: STM32F103单电阻采样FOC是一种控制器驱动电机的方式,它采用单电阻采样方法,实现了电机的稳定运行和高效能的效果。 FOC是一种基于磁场定向控制的技术,它通过精确地控制电机的电流,从而实现对电机转速、扭矩等参数的调节。传统的FOC技术通常使用个霍尔传感器来检测电机位置,但单电阻采样FOC采用了一种更为简洁的方法,只需要使用一根电阻就能完成电机的位置检测。 在STM32F103单电阻采样FOC中,电机驱动器会接收到电机转动时的电流和电压,并通过一系列的算法计算出应该输出的PWM波形,从而实现对电机的控制。与传统的FOC技术相比,它的控制效果更为稳定,精度更高,因而在工业及商用电机控制等领域具有广泛的应用前景。 需要注意的是,在实现STM32F103单电阻采样FOC时,需要对硬件进行适当的配置,并且要根据电机的具体特性定制相应的控制算法。而且若要实现更为高效的控制效果,则需要提高电路和控制算法设计的可靠性和精度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GarminWilliam

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值