步进电机设计

第一步:
开始定时器+比较值【比较输出-反转电平】
  /* 步进电机定时器初始化*/
  STEPMOTOR_TIMx_Init();
  /* 启动定时器 */
  HAL_TIM_Base_Start(&htimx_STEPMOTOR);
  /* 启动比较输出并使能中断 */
  HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
注意以前用溢出中断的话只需要一句话  HAL_TIM_Base_Start_IT 我们现在是比较中断用上面2句话
第二部:
修改回调函数 修改比较值 即可
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
  uint16_t count;
  count=__HAL_TIM_GET_COUNTER(&htimx_STEPMOTOR);
  __HAL_TIM_SET_COMPARE(&htimx_STEPMOTOR,TIM_CHANNEL_1,count+Toggle_Pulse);
}
A-读出当前计数值比如是200-设置下次计数值为200+220 这样下次计数到420的时候就会匹配,就会滞后一点-----做了2件事情
B-暴力设置当前计数值为0---设置下次计数值为200+20  这样前面计数清零了再次计数比较是在220的时候 滞后一点-做了2件事情
方案B没有技巧 而且如果不需要调频的话 它只需要做一件事 也即是清零即可 更加方便
方案A有草船借鉴的技巧 因为count是U16的是65535的MAX 它给通道送数的时候也就是自动循环的 所以有可能送65535进去
我们在设置定时器的时候就务必要求计数的上限也是65535 也就是
#define STEPMOTOR_TIM_PERIOD                   0xFFFF   // 定义定时器周期,输出比较模式周期设置为0xFFFF
htimx_STEPMOTOR.Init.Period = STEPMOTOR_TIM_PERIOD;     // 定时器周期
这样的波行
----     ------        
	-----      -------
	
现在关心细节:
__IO uint16_t Toggle_Pulse = 3000;         // 比较输出周期,值越小输出频率越快【注定的 越小的话定时器比较翻转越频繁】	
需要一个控制这个参数的接口
/**
  * 函数功能: 步进电机运动控制
  * 输入参数: Dir:步进电机运动方向 0:反转 1正转
  *           Speed:步进电机速度  
  * 返 回 值: void
  * 说    明: 无
  */
void STEPMOTOR_Motion_Ctrl(uint8_t Dir , uint16_t Speed)
{
  uint16_t Step_Delay;  //步进延时
  if(Speed == 0)
    STEPMOTOR_OUTPUT_DISABLE();
  else
  {
    if(Dir==CCW)
      STEPMOTOR_DIR_REVERSAL();
    else 
	  STEPMOTOR_DIR_FORWARD();//方向控制
    
    //1:步进电机在丝杠上的单步距离--也就是转一下或者说一个脉冲会带来的移动距离【参数最好是它的倍数】
    //x = (MPR*α)/2π;  MPR:单圈距离 α:步距角
    //单步距离的周期
    //2:T = C/Ft;  C:定时器计数周期 Ft:定时器频率
    //∴ V = x/T =(MPR*α*Ft)/(2π*C);
    //得 C = (MPR*α*Ft)/(2π*V);
    //其中 α = (2π)/spr;     spr:步进电机旋转一圈需要的脉冲数
    //∴ C= (MPR*Ft)/(spr*V);
    //Step_Delay = C/2; 步进电机脉宽
	//通过速度计算成延时间隔---我考考距离
    Step_Delay = (uint16_t)((MPR_FREQ_SPR_X_10/Speed)>>1);//#define MPR_FREQ_SPR_X_10    (((MPR*T1_FREQ)*10)/SPR) //这里做扩大10倍处理
    
    STEPMOTOR_OUTPUT_ENABLE();
    Toggle_Pulse = Step_Delay;
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/89953942