请叫我number_one 2021-09-29 15:36 采纳率: 0%
浏览 52

关于STM32F1控制步进电机,只能加速不能减速的问题。求解答

最近在做一个F1控制步进电机的T型加减速的实验。

遇到现象:加速→匀速→急停。没有减速的效果。找了很多遍程序,跟硬石的程序一样。但是只能加速,没有减速效果。请教是哪里的问题啊。附上代码。
按理说,能加速,也就能减速呀


void  MSD_PULSE_TIM_IRQHandler(void)
{
  // 保存下一个延时周期
  unsigned int new_step_delay;
  // 加速过程中最后一次延时.
  static int last_accel_delay;
  // 移动步数计数器
  static unsigned int step_count = 0;
  // 记录new_step_delay中的余数,提高下一步计算的精度
  static signed int rest = 0;

if (TIM_GetITStatus(MSD_PULSE_TIM, TIM_IT_Update) != RESET)
{
    /* Clear MSD_PULSE_TIM Capture Compare1 interrupt pending bit*/
    TIM_ClearITPendingBit(MSD_PULSE_TIM, TIM_IT_Update);

    MSD_PULSE_TIM->CCR4=srd.step_delay >> 1;//周期的一半
    MSD_PULSE_TIM->ARR=srd.step_delay;
    //如果禁止输出,电机则停止运动
    if(status.out_ena != TRUE)
    {
        srd.run_state = STOP;
    }
  switch(srd.run_state) {
    case STOP:
      step_count = 0;
      rest = 0;
      MSD_PULSE_TIM->CCER &= ~(1<<12); //禁止输出
      TIM_Cmd(MSD_PULSE_TIM, DISABLE);
      status.running = FALSE;
      break;

    case ACCEL:
      MSD_PULSE_TIM->CCER |= 1<<12; //使能输出
      MSD_StepCounter(srd.dir);
      step_count++;
      srd.accel_count++;
      new_step_delay = srd.step_delay - (((2 * (long)srd.step_delay) 
                       + rest)/(4 * srd.accel_count + 1));
      rest = ((2 * (long)srd.step_delay)+rest)%(4 * srd.accel_count + 1);  //%为求
      //检查是够应该开始减速
      if(step_count >= srd.decel_start) {
        srd.accel_count = srd.decel_val;
        srd.run_state = DECEL;
      }
      //检查是否到达期望的最大速度
      else if(new_step_delay <= srd.min_delay) {
        last_accel_delay = new_step_delay;
        new_step_delay = srd.min_delay;
        rest = 0;
        srd.run_state = RUN;
      }
      break;

    case RUN:
      MSD_PULSE_TIM->CCER |= 1<<12; //使能输出
      MSD_StepCounter(srd.dir);
      step_count++;
      new_step_delay = srd.min_delay;
      //检查是否需要开始减速
      if(step_count >= srd.decel_start) {
        srd.accel_count = srd.decel_val;

        //以最后一次加速的延时作为开始减速的延时
        new_step_delay = last_accel_delay;
        srd.run_state = DECEL;
      }
      break;

    case DECEL:

      MSD_PULSE_TIM->CCER |= 1<<12; //使能输出
      MSD_StepCounter(srd.dir);
      step_count++;
      srd.accel_count++;
      new_step_delay = srd.step_delay - (((2 * (long)srd.step_delay) 
                       + rest)/(1+4 * srd.accel_count ));
      rest = ((2 * (long)srd.step_delay)+rest)%(4 * srd.accel_count + 1);
      //检查是否为最后一步
      if(srd.accel_count >= 0){
        srd.run_state = STOP;
      }
      break;
  }
  srd.step_delay = new_step_delay;
  }
}

  • 写回答

1条回答 默认 最新

  • dceacho 2021-09-29 16:50
    关注

    买个几十块的逻辑分析仪看波形就知道是哪的问题了,比看代码直观多了

    评论

报告相同问题?

问题事件

  • 创建了问题 9月29日

悬赏问题

  • ¥15 echarts绘制图表
  • ¥15 根据企业名称 对照两个文件 样本筛选/匹配
  • ¥15 Linux环境下CA证书更新问题
  • ¥15 sqlserver语句提取结果以外数据
  • ¥60 微信小程序如何上传QQ聊天文件
  • ¥300 开发的系统遭到无良商家的破解,请问如何防止再次发生,并追回损失
  • ¥15 java代码写在记事本上后在cmd上运行时无报错但又没生成文件
  • ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
  • ¥15 PPOCRLabel
  • ¥15 混合键合键合机对准标识