使用VSCode+CubeMx开发STM32,这里介绍使用PWM控制舵机SG90;

1.建立工程

1.1 创建项目文件

从已有的仓库中创建一个工程:

1
git clone https://github.com/makerinchina-iot/vscode_stm32cubemx_hello.git motor

使用VSCode打开工程后,需要更改如下名字:

  • 文件夹根目录下CMakeLists.txt 文件中修改工程名字为motor:
1
set(CMAKE_PROJECT_NAME motor)
  • stm32cubemx配置文件更改为 motor.ioc ,并更改以下文件名:
1
2
3
4
...
ProjectManager.ProjectFileName=motor.ioc
ProjectManager.ProjectName=motor
...
1.2 引脚配置

使用STM32CubeMx打开ioc配置文件,然后配置对应的PWM引脚;

这里定时器根据SG90舵机需要的PWM频率确定,SG90需要PWM频率为50Hz,因此设置定时器分频为640,计数值为2000,即可达到要求: 64MHz/640/2000 = 50Hz;

2. 编写代码

2.1 PWM控制舵机角度

舵机角度控制与占空比关系为:占空比为 2.5%12.5% 代表 0°180°

  • 舵机角度控制与占空比按照如下表格计算:
角度 占空比 脉冲周期(50Hz) 脉冲高电平时间 定时器比较值
0 2.5% 20ms 0.5ms 2000 * 2.50% = 50
90 7.5% 20ms 1.5ms 2000 * 7.50% = 150
180 12.5% 20ms 2.5ms 2000 * 12.5% = 250
  • 以下代码为控制舵机分别运行到0度、90度、180度:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
log_info("position midle");
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, 150);
HAL_Delay(1000);

log_info("position left");
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, 50);
HAL_Delay(1000);

log_info("position midle");
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, 150);
HAL_Delay(1000);

log_info("position right");
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, 250);
HAL_Delay(3000);
}

3.编译并烧录代码

3.1 编译和烧录
  • 点击生成按键即可编译工程;

  • 在VSCode中执行task:openocd-flash烧录;

3.2 硬件连接与结果
  • 按照如下方式连接硬件:
STM32 舵机
5V 红(+)
PA6 黄(S)
GND 棕(-)
  • 代码运行后可以看到舵机正确的按角度运行: