STM32单片机+SG90舵机+OLED屏幕+舵机旋转角度数据发送到串口调试助手+源代码

目录

一、SG90舵机模块介绍

二、SG90舵机模块接线说明

三、测试说明、SG90舵机驱动代码

四、串口调试助手把采集的SG90舵机数据发送出来

五、源代码

六、串口调试助手软件

七、舵机原理图资料 


一、SG90舵机模块介绍

        首先介绍说一下什么是舵机。舵机是一种位置(角度)伺服的驱动器。适用于一些需要角度不断变化的,可以保持的控制系统。sg90就是舵机的一种。

        舵机的工作原理比较简单。舵机内部有一个基准电压,单片机产生的PWM信号通过信号线进入舵机,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。 “舵机是一种直流微型伺服电机,它能够接收并响应控制信号,实现角度或位置的精确控制。舵机通常由直流电机、电机控制器、电位器和减速器等部分构成,并封装在一个便于安装的外壳中。它通过闭环控制系统来工作,能够根据输入的信号精确地控制输出轴的角度,并在负载变化时自动调节以保持稳定的控制状态。舵机的应用非常广泛,包括在自动驾驶仪中操纵飞机舵面,以及在智能小车和机器人中实现转向和关节运动等功能。舵机可以分为不同的类型和角度,其中180°舵机最为常见。”

        舵机一般可以再0-180度或0-360度转动任意角度,经常用于小车小船转向控制和机械臂的关节等。舵机的转动角度范围不是固定的,请购买时问问商家,到底是哪个范围的。实际使用中,我们对舵机有两个基本需求:

  1. 舵机转动一定角度。
  2. 舵机转动时,控制者要求舵机转到一个新的角度。

机器如何给舵机发送其转动角度呢?首先,要低成本,信号线要少。其次,要满足任意角度和中途打断。设计者推出了一个简单的方法:用一个时长为20ms的信号去控制舵机,信号的前一段为高电平,持续时间0.5ms到2.5ms,代表转动角度0-180或者360度,后半段为低电平,这就是PWM信号,具体如下图:

在这里插入图片描述
 

        容易看出来,PWM信号利用前段为高电平持续时间控制旋转角度,本质用占空比控制了旋转角度。运转时,舵机转到你指定的角度需要一定的时间,转动的角度越大,需要的时间越久,所以你可能需要等待一定的时间。如果你刚刚给舵机发送指令转到180度,紧接着又发送指令转到90度,舵机会不转到180度再转到90度,而是在接受到信号时直接在当前的角度直接转到90度去。

二、SG90舵机模块接线说明

1 红色线 外接3.3V-5V

2 黑色线 外接GND

3 橙色线  接单片机PA1引脚

三、测试说明、SG90舵机驱动代码

编译环境:keil5

测试单片机: STM32F103C8T6

功能:功能1:按键控制舵机旋转              功能2:0-180°循环旋转

PWM.c文件编写舵机驱动代码如下:

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
}

void PWM_SetCompare2(uint16_t Compare)
{
	TIM_SetCompare2(TIM2, Compare);
}

PWM.h文件,对舵机驱动函数经行了声明:

#ifndef __PWM_H
#define __PWM_H

void PWM_Init(void);
void PWM_SetCompare2(uint16_t Compare);

#endif

四、串口调试助手把采集的SG90舵机数据发送出来

printf("舵机旋转角度= %d °\r\n",Angle);

五、源代码

《STM32单片机+SG90舵机+OLED屏幕+舵机旋转角度数据发送到串口调试助手》源代码_sg90舵机资源-CSDN文库

六、串口调试助手软件

串口调试助手-keil5调试工具资源-CSDN文库

七、舵机原理图资料 

SG90舵机原理图、模块资料资源-CSDN文库

  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32是一种32位微控制器,SG90舵机是一种小型舵机,常用于模型、机器人等小型项目中。在STM32控制SG90舵机时,需要使用PWM信号来控制舵机的位置。 以下是一个简单的STM32控制SG90舵机的代码示例: ```c #include "stm32f10x.h" #define SG90_PORT GPIOA #define SG90_PIN GPIO_Pin_1 void Delay(__IO uint32_t nCount); int main(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); GPIO_InitStructure.GPIO_Pin = SG90_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SG90_PORT, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = 19999; TIM_TimeBaseStructure.TIM_Prescaler = 719; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 1500; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); while (1) { // 控制舵机旋转到指定位置 TIM_SetCompare1(TIM2, 1000); // 最小位置 Delay(1000000); TIM_SetCompare1(TIM2, 1500); // 中间位置 Delay(1000000); TIM_SetCompare1(TIM2, 2000); // 最大位置 Delay(1000000); } } void Delay(__IO uint32_t nCount) { for (; nCount != 0; nCount--); } ``` 该代码使用了STM32的定时器TIM2和PWM信号来控制SG90舵机的位置。在主函数中,使用了`TIM_SetCompare1`函数来设置PWM信号的占空比,从而控制舵机的位置。同时在函数`Delay`中添加了延时函数,以保证舵机能够到达指定的位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

STM32单片机定制

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值