stm32 智能避障小车(二)之sg90

本文详细介绍了如何使用STM32控制SG90舵机,从实物讲解、模块工作原理到代码实现。SG90舵机接线包括信号线、电源线和地线,接线时需注意。文中还对比了模拟舵机与数字舵机的区别,并解释了PWM信号与舵机角度的关系。通过配置GPIO为推挽输出模式,实现了舵机0度、-90度和90度的旋转,适合避障小车应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一篇我要先写sg90这篇,因为比hsr04简单。总体的介绍思路是:实物讲解、模块原理、代码详解
1、实物讲解
首先我们先来看sg90的样子:
在这里插入图片描述
然后再看看它的接线,买过来的sg90舵机模块引出来了三根线,分别为黄色、红色、棕色,他们分别为信号线、3.3V电源线和地线,接的时候要注意,不要接错了。
2、模块原理
1、其实舵机可以分为两种,一种是模拟舵机,一种是数字舵机,这两者的区别是:模拟舵机需要一直给与要转的角度命令,直到到自己想要的角度,注意这个给定的时间许多不许少,就像是小孩子一样,你要不断的给与鼓励和奖赏,才会达到自己的要求;而数字舵机是只需要给定一次角度命令就行了,就像是长大了的孩子,你可以把事情很放心的交给他,说一次就好。
2、说了半天,那么角度命令是什么呢?其实就是我们熟悉的pwm信号,下面给出占空比与旋转的角度之间的关系:

高电平低电平旋转角度
0.5ms19.5ms-90度
1.0ms19ms-45度
1.5ms18.5ms0度
2.0ms18ms45度
2.5ms17.5ms90度

我要对这个表格做一些说明:
1)、高电平加上低电平等于 20ms,那是因为要求的pwm频率是50hz,1s/50 = 20ms,所以周期就是20ms。
2)、角度怎么看,想象自己站在xy轴的0坐标上,正对着y轴,y轴就是0度。负度在左手边,正度在右手边。
3)、其实低电平的时间并没有那么死板,只要在0.5ms和20ms之间就可以。
3、代码详解
我使用的是野火指南者开发板,黄色信号线连接的是pb8。
先来看gpio配置,配置为推挽输出模式

void SG90_GPIO_Config(void)
{		
		/*定义一个GPIO_InitTypeDef类型的结构体*/
		GPIO_InitTypeDef GPIO_InitStructure;

		/*开启LED相关的GPIO外设时钟*/
		RCC_APB2PeriphClockCmd( SG90_GPIO_CLK , ENABLE);
		/*选择要控制的GPIO引脚*/
		GPIO_InitStructure.GPIO_Pin = SG90_GPIO_PIN;	

		/*设置引脚模式为通用推挽输出*/
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

		/*设置引脚速率为50MHz */   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

		/*调用库函数,初始化GPIO*/
		GPIO_Init(SG90_GPIO_PORT, &GPIO_InitStructure);	
		
		
		GPIO_ResetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
}

接着是主函数里的代码,我实现的功能是先0度,在-90度,在90度旋转。

int main(void)
{	
	int i;
	/* LED 端口初始化 */
	LED_GPIO_Config();
	/* 配置SysTick 为10us中断一次 */
	SysTick_Init();
	SG90_GPIO_Config();
     i = 0;
	{
//舵机的左转,50,1950         舵机的正向 130,1860        舵机的右转 230,1750
		//舵机的正向
		for(;i<35;i++)
		{
			GPIO_SetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
			Delay_us(130);//延时一毫秒
			GPIO_ResetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
			Delay_us(1860);//延时一毫秒
		}
		i= 0;
//		//舵机的左转
		for(;i<30;i++)
		{
			GPIO_SetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
			Delay_us(50);//延时一毫秒
			GPIO_ResetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
			Delay_us(1950);//延时一毫秒
				
		}
		//
		i = 0;
		//舵机的右转
		for(;i<30;i++)
		{
			GPIO_SetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
			Delay_us(230);//延时一毫秒
			GPIO_ResetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
			Delay_us(1860);//延时一毫秒
				
		}
//		
	}

}

附上代码包链接快上车
打完收工。。。。。。

### STM32智能避障小车实现方案 #### 主要组成部分 基于STM32控制器的智能循迹避障小车主要由多个组件构成,这些组件共同协作完成车辆的各项功能。具体来说,该系统包括但不限于车体、电池模块、主控制器(即STM32)、外接电路扩展板、电机驱动模块、电机本身以及各种类型的传感器如红外对管传感器模块、OpenMV摄像头、碰撞传感器和测距传感器等[^1]。 #### 软件框架概述 对于软件部分而言,整个项目的入口为主函数,在这里初始化了必要的硬件资源并进入无限循环等待处理事件。通过调用`Motor_Init()`来设置电机控制相关的寄存器配置,并利用`Avoid_Init()`准备好了障碍物检测所需的功能模块。之后在一个持续运行的任务里执行`Follow_Run()`方法来进行路径跟随逻辑的操作[^2]。 #### 定时器应用实例 为了更好地管理和调度不同任务之间的时间间隔,项目中引入了一个自定义的定时器库文件——`timer.h`。此头文件不仅包含了标准C语言预处理器指令用于防止重复包含,还声明了一些全局变量与函数原型以便其他源码能够访问到计时服务。特别值得注意的是其中定义了一种名为`Times`的数据结构用来存储微秒级至分钟级别的时间量值;另外还有一个重要的接口叫做`TIM3_Int_Init()`负责启动指定编号的高级定时器中断服务例程[^3]。 #### SG90舵机的应用案例 当涉及到方向调整或者机械臂操作等功能需求时,则需要用到SG90这样的小型伺服马达作为执行机构之一。这类设备通常具备三根连接导线分别对应着电源正极(VCC)、接地(GND)还有PWM信号输入端子(Signal),它们的颜色一般分别是红/棕代表供电线路而黄则指示脉宽调制波形传输通道。根据工作模式的不同可区分为模拟型与数字化版本,前者需要连续不断地发送位置设定指令直至到达目标方位为止,后者仅需一次性告知期望转动的角度即可自动保持稳定状态。至于具体的电气特性方面,可以通过改变PWM周期内的高电平宽度从而精确调控转轴偏移角范围从负九十度一直到正九十度不等[^4]。 ```c // 示例:初始化SG90舵机的位置为零度 void sg90_init() { // 假设已经完成了GPIO及TIMx的基础配置... // 设置初始角度对应的PWM占空比 (此处假设使用定时器产生的PWM) TIM_SetCompare2(TIM2, 1500); // 中间位置约等于1.5ms // 开启相应通道的PWM输出 TIM_Cmd(TIM2, ENABLE); } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值