基于STM32的SG90舵机实验含代码(HAL库)

        前言:本篇文章为HAL库下的SG90舵机实验,舵机的使用是很常见的。其工作原理(PWM调节)与编程实现也是十分简单。作为智能小车的前轮控制,无人船的方向控制等,都离不开舵机的身影,对于这个简单的模块希望大家可以掌握。(文章末尾有实验代码

        实验硬件:STM32F103C8T6;SG90舵机

        硬件实物图:

          效果图:

 引脚连接:

VCC --> 5V

GND --> GND

PWM(信号线) --> PA0

一、SG90舵机模块简介 

         舵机是一种位置(角度伺服驱动器,适用于那些需要角度不断变化并可以保持的控制系统。在高档遥控玩具,如飞机、潜艇模型,遥控机器人中已经得到了普遍应用。

        “伺服”—词源于希腊语“奴隶”的意思。人们想把“伺服机构”当个得心应手的驯服工具,服从控制信号的要求而动作。在讯号来到之前,转子静止不动;讯号来到之后,转子立即转动;当讯号消失,转子能即时自行停转。由于它的“伺服”性能,因此而得名——伺服系统

舵机分类: 

        模拟舵机:需要不断地发送目的地PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要不断的发送90度的PWM信号直到到达指定位置才能停止。(我们使用的SG90就是一个模拟舵机)
        数字舵机:只需给一个目的地PWM信号,即可旋转到指定位置。例如:我现在让它旋转90度,我只需要发送一次90度的PWM信号,它就可以旋转到90度。

PWM信号:PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.

外观:

实物接线:

二、舵机工作原理

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

角度与脉冲时间关系
##############################################################
    0.5MS    1.0MS    1.5MS    2.0MS    2.5MS
     0°       45°      90°      135°     180°
##############################################################

 特别注意:市面上有180°舵机360°舵机,两者有所区别,读者朋友购买的时候需要注意一下。

180°舵机版本:可以控制旋转角度、有角度定位。上电后舵机自动复位到0°,通过一定参数的脉冲信号控制它的角度。

360°舵机版本:不可控制角度,只能顺时针旋转、逆时针旋转、停止、调节转速。无角度定位,上电不会复位到0°。因为这是360°任意旋转的,没有0。通过一定参数的脉冲信号控制它的选择。

        编程思路:读者朋友控制舵机的时候,只需要使用定时器去产生PWM调节。用PWM调节出对应ms数的脉冲即可实现对舵机的固定角度控制。

三、CubexMX配置

1、RCC配置外部高速晶振(精度更高)——HSE;

2、SYS配置:Debug设置成Serial Wire(否则可能导致芯片自锁);

 3、TIM2配置:使用TIM2的Channel1产生PWM信号(控制SG90);

数据参数意义:

        此时产生PWM波形频率:72M / (719 +1)/ (1999+1) = 50Hz

        定时器周期:1/50 = 20ms

4、时钟树配置:

5、工程配置

 四、代码

main函数:


int main(void)
{
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */
 
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);//***定时器2初始化
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  { 
      int i=1000; //循环时间间隔1s
      
      //★舵机指向0°
      __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,50); //相当于一个周期内(20ms)有0.5ms高脉冲
      HAL_Delay(i);
      //★舵机指向180°
      __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,250); //相当于一个周期内(20ms)有2.5ms高脉冲
      HAL_Delay(i);
 
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

注意事项:

        模拟舵机SG90的使用就是利用PWM的计数数值去控制舵机所指的角度。

        通过修改句柄__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,value)里的参数value可以实现舵机角度控制。

这里以SG90舵机为例给大家讲解:

        已知0.5ms指向位置,2.5ms指向180°位置。

        比如需要指向m°处:

        2.5-0.5=2ms  -->  对应于180°

        value/(1999+1)*20=0.5+(m/180)× 2

五、实验效果

SG90舵机实验

六、代码

链接:https://pan.baidu.com/s/1lphofKe9yepXJ5XPwHkdUQ 提取码:3doi

猜你喜欢

转载自blog.csdn.net/black_sneak/article/details/125824641