上一期我们介绍了单片机如何驱动180°的舵机。以SG90为例,它利用外部PWM信号与内部信号做比较,利用比较电压的差异来让舵机转动。当舵机转动到一定的角度使得电压差为0,这时候舵机就会停止运动。

  利用这种方式,我们就可以实现舵机的特定角度旋转。

但是360°舵机的运动方式和180°舵机驱动方式不同。

  大部分360°舵机都是无限位的。而180°电机是有限位的。即180°电机转动到特定位置时会有机械结构限制其运动。

  360°电机则可以在一个方向无限制的旋转。


360°电机根据基准脉宽(1.5ms)当脉宽朝2.5ms增加的时候会正向旋转越来越快。

  超过2.5ms(超过一点大概0.1ms)的时候则会停止。反之越接近0.5ms则会反转的越来越快。

  而1.5ms周围也有死区,大概0.05ms左右,大于这个值电机才会微微转动。

因此其实360度舵机可以看作一个稍微复杂的电机。

 CubeMX配置不多说,自然是开启一个定时器的PWM通道,我们按照上期配置PB9即TIM4的CHANNEL4

 不过在这基础上,本期我们再开启一个定时器。不用做任何基础设置。

仅将分频系数修改为主频数719,每次定时器计数增加的时间都是10us,最大计时655350us即655.35ms。

查阅资料得MG90S的转速为0.11s/60度,1.8ms/°因此我们可以根据这个数据利用开环调节来设置角度:

 不过由于我们没有限位装置和反馈装置,这是一种误差较大且无法修正的调节。

  根据上述定时器的最大定时时间655.35ms,可以计算出角度最大旋转为363°

  为其我们编写设置旋转一定角度的代码(仅测试使用,实际情况请选择合适舵机)。

void SetAngle360(float Angle,int Direct)
{
  //已知2500是0.11s/60°即1.8ms/°
  int t = 1.8*Angle*100;//转化为微秒
  __HAL_TIM_SET_COUNTER(&htim1,0);//清空计数
  HAL_TIM_Base_Start(&htim1);//启动定时器
  __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_4,500 + (Direct)*1000);//开启最大速度
  // Direct = 1 设置比较值为2500  Direct = 0 设置比较值为0  
  while(__HAL_TIM_GET_COUNTER(&htim1)
  
  
 

  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */    
    SetAngle360(180);    
    HAL_Delay(2000);  
  }

  之后我们设置转动角度为180°来看看测试效果。仅作测试嗷,大家千万别学着用,开环控制效果很差。

嘉立创PCB

还没有评论,抢个沙发!