基于STM32的SG90舵机实验含代码(HAL库)
基于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指向0°位置,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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)