STM32CubeIDE基础学习-舵机控制实验
文章目录
- STM32CubeIDE基础学习-舵机控制实验
- 前言
- 第1章 硬件介绍
- 第2章 工程配置
- 2.1 基础工程配置部分
- 2.2 生成工程代码部分
- 第3章 代码编写
- 第4章 实验现象
- 总结
前言
SG90、MG996舵机在机器人领域用得非常多,因为舵机有内置控制电路,它们的尺寸虽然很小,但输出力够大,但不同型号的舵机对应的力矩也有不同,具体要看具体参数选择。
例如:船舵、航模、机器人等都用得非常多。
STM32CubeIDE基础知识学习回顾
实验目的:
学习使用定时器输出PWM功能,从而实现控制舵机转动指定的角度。
第1章 硬件介绍
舵机控制接口采用定时器4通道3,配置时使能该通道即可。
SG90舵机实物如下图所示:
这款舵机的控制需要一个20ms为周期的脉冲信号,其中高电平的占比在0.5ms ~ 2.5ms之间,当高电平的脉宽在0.5ms ~ 2.5ms之间时舵机就可以对应旋转到0 ~ 180度不同的角度。所以可以通过控制控制信号的高电平宽度来调节输出角度,从而实现方向的控制。
时间和角度对应的控制关系如下:
当然,上面这些只是常用且比较好计算的时间和角度关系,如果需要旋转其它任意的角度,可以改变对应时间即可。
第2章 工程配置
2.1 基础工程配置部分
本实验采用LED实验的工程作为模板,直接在上面添加定时器PWM的功能配置即可。
第一步:配置定时器时钟源。
按照标号步骤依次选择即可,定时器4使用的是内部时钟源,通道3输出。
第二步:配置定时器和PWM相关参数。
计数配置:PSC取7199,ARR取199,向上计数模式。
PWM配置:采用PWM1模式,极性为高电平有效,参数Pulse的值可以设置也可以不设置,让其默认为0,这里问题不大,后面在使用时还是会改变该值的。
最终定时器及PWM功能配置完成之后,可以看到芯片的PA8引脚被配置为了TIM4_CH3,如下图所示:
2.2 生成工程代码部分
配置完功能之后就可以点击生成工程代码了。
可以看到main文件多了一个定时器的初始化函数和tim.c文件,如下图所示:
进入定时器初始化函数后如下图所示:
里面主要是设置定时器相关参数等。
到此,检查生成的初始化代码部分没有问题后就可以编写完成后面的控制功能代码就可以了。
第3章 代码编写
在输出PWM之前,需要使能输出通道才可以,即使能CC1E位,使能之后就可以输出PWM了。直接调用函数如下图所示:
根据舵机的控制原理及公式计算,比较值为5对应舵机是0度,15对应舵机是90度,代码编写如下图所示:
编译下载代码后,可以看到舵机先归零再转90度,如此往返旋转。
能单独控制指定角度之后,就可以控制常用的角度了,代码如下图所示:
代码片示例如下:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 5); /* 0度 */
HAL_Delay(1000); /* 旋转间隔时间 */
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 10); /* 45度 */
HAL_Delay(1000);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 15); /* 90度 */
HAL_Delay(1000);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 20); /* 135度 */
HAL_Delay(1000);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 25); /* 180度 */
HAL_Delay(1000);
/* USER CODE END WHILE */
}
注意:如果前面的PWM模式和极性选择不同,则这里的比较值大小也会不同,要结合具体情况分析代入。
第4章 实验现象
下载代码后,就可以看到舵机可以分别从0度旋转到180度了,每次递增45度,间隔1秒,当旋转到180度时则复位到0度,如此往返旋转。
总结
这款SG90舵机还是比较好玩的,只要能熟练PWM的使用就可以容易驱动舵机了,弄明白时间计算公式,把时间代进公式算即可。
注意:普通的(没做过电路特殊处理的)单片机开发板不建议接多个舵机,3个内一般还可以,3个以上可能会对板子造成损害,具体要根据板子自身来接。