使用STM32 HAL库驱动舵机的PWM控制

系列文章目录

【STM32】HAL库 新建MDK工程
【STM32】HAL库 定时器中断
【STM32】HAL库 PWM驱动LED呼吸灯

文章目录

  • 系列文章目录
  • 前言
  • 一、SG90舵机
  • 二、STM32CubeMX设置
  • 三、代码

  • 前言

    使用按键控制PWM,驱动舵机

    一、SG90舵机

    舵机的控制一般需要一个20ms左右的时基脉冲,脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:

    高电平时间 旋转角度
    0.5ms 0度
    1.0ms 45度
    1.5ms 90度
    2.0ms 135度
    2.5ms 180度

    计数器自动重装值为ARR,0.5ms的计数次数为h。
    ARR/ 20 = h / 0.5,h = ARR /40。

    1ms旋转45度,1ms的计数次数为0.5ms的两倍 ,求系数k
    ARR/ 40 * 2 = 45 *k + ARR/40,k = ARR/ 1800。

    1ms的占空比为1 / 20
    CCR = 占空比 * ARR = ARR / 20 = ARR/ 40 * 2
    CCR = 角度 * ARR / 1800 + ARR /40

    二、STM32CubeMX设置

    舵机的控制一般需要一个20ms左右的时基脉冲,所以一个周期的时间为20ms,50Hz。舵机的死区时间为5us,所以重装载值需要小于4000 = 20ms/5us。重装载值取2000,50Hz = 72MHz / 分频系数/2000 ,分频系数为720。

    按键引脚

    三、代码

      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
    
      while (1)
      {
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
       if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET)
    	 {
    			HAL_Delay(20);
    			while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET);
    			HAL_Delay(20);
    		 	Angle += 30;
    			if (Angle > 180)
    			{
    				Angle = 0;
    			}
    	 }
    	 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2,Angle  * (htim2.Init.Period + 1) / 1800 + (htim2.Init.Period + 1) / 40);
      }
      /* USER CODE END 3 */
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用STM32 HAL库驱动舵机的PWM控制

    发表评论