欢迎光临散文网 会员登陆 & 注册

STM32编程L298N驱动直流有刷电机实现PID位置、速度双闭环控制实现

2022-11-30 11:29 作者:老-_-白  | 我要投稿

为实现完成PID控制需要使用STM32定时器的输出通道和互补输出通道共同控制引脚链接驱动器驱动电机和编码器链接STM32 MCU定时器的编码器接口来实现一个完成的驱动、反馈闭环,根据STM32MCU的数据手册可以查询定时器的各引脚的功能。


STM32F103ZET6MCU定时器引脚功能定义
使用功能引脚在芯片上的位置对照


在相应的.h资源文件利用宏定义实现功能引脚和指定功能的一一对应

电机驱动控制引脚定义代码
MCU编码器反馈引脚定义代码

为了调试我们还定义了串口输出引脚和按键控制引脚的定义

串口调试引脚定义
按键控制引脚定义

根据定义的引脚初始化以后就可以控制运行状态的进程里编辑PID控制代码了

  uwTick++;

  if((uwTick % 50) == 0)

  {

//    /* 获取当前位置值,编码器4倍频之后的数值 */

    Sample_Pulse = (OverflowCount*CNT_MAX) + (int32_t)__HAL_TIM_GET_COUNTER(&htimx_Encoder);


    /* 计算PID结果 */

    if(Start_flag == 1)

    {

      tmpPWM_DutySpd = LocPIDCalc(Sample_Pulse);


      /* 设定速度环的目标值 */

      if(tmpPWM_DutySpd >= TARGET_SPEED)

        tmpPWM_DutySpd = TARGET_SPEED;

      if(tmpPWM_DutySpd <= -TARGET_SPEED)

        tmpPWM_DutySpd = -TARGET_SPEED;

    }

  }

      /* 速度环周期50ms */

  if(uwTick % 50 == 0)

  {

    /* 获得当前速度 */

    Sample_Pulse = (OverflowCount*CNT_MAX) + (int32_t)__HAL_TIM_GET_COUNTER(&htimx_Encoder);

    Spd_PPS = Sample_Pulse - LastSample_Pulse;

    LastSample_Pulse = Sample_Pulse ;


    /* 11线编码器,270减速比,一圈脉冲信号是11*270*4 PPR */

    Spd_RPM = ((((float)Spd_PPS/(float)PPR)*20.0f)*(float)60);//单位是rpm

//

    /* 计算PID结果 */

    if(Start_flag == 1)

    {

      sPID.SetPoint = tmpPWM_DutySpd;

      PWM_Duty = SpdPIDCalc(Spd_RPM);

      if(PWM_Duty < 0)

      {

        Motor_Dir = CW;

        BDDCMOTOR_DIR_CW();

        PWM_Duty = -PWM_Duty;

      }

      else

      {

        Motor_Dir = CCW;

        BDDCMOTOR_DIR_CCW();

      }

      __HAL_TIM_SET_COMPARE(&htimx_BDCMOTOR,TIM_CHANNEL_1,PWM_Duty );

    }

    printf("LOC:%d Sped: %2.2f r/m \n",Sample_Pulse,Spd_RPM );

  }




STM32编程L298N驱动直流有刷电机实现PID位置、速度双闭环控制实现的评论 (共 条)

分享到微博请遵守国家法律