STM32外设系列—sg90(舵机)

文章介绍了SG90舵机的基本原理和引脚连接,讲解了如何通过STM32配置定时器产生PWM信号来控制舵机的角度,提供了程序设计示例,包括定时器初始化和控制舵机转动的代码,并对比了180°与360°舵机的区别。
摘要由CSDN通过智能技术生成


🎀 文章作者:二土电子

🌸 关注文末公众号获取其他资料和工程文件!

🐸 期待大家一起学习交流!


一、sg90简介

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

sg90

舵机的工作原理比较简单。舵机内部有一个基准电压,单片机产生的PWM信号通过信号线进入舵机,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。

二、引脚连接

sg90有三个引脚,分别是红线(VCC),棕线(GND)和橙线(信号线)。通常使用5V供电,信号线接单片机引脚,用老来接收单片机发送的PWM。

三、控制方法

控制sg90舵机旋转也比较简单,只需要给它输出PWM波,修改占空比就可以调整角度。sg90的控制一般需要一个20ms 左右的时基脉冲,脉冲的高电平部分一般在0.5ms~2.5ms。高电平持续时间与旋转角度的对应关系如下

高电平持续时间/ms舵机角度/°
0.50
1.045
1.590
2.0135
2.5180

四、程序设计

这里以180°的sg90,来展示一下程序设计

4.1 配置定时器

要使用sg90,首先要配置定时器,产生PWM。关于定时器和PWM相关知识,可以看博主STM32速成笔记定时器篇,这里就不再做详细介绍了。上面说,控制sg90需要一个20ms左右的脉冲,也就是说PWM的周期为20ms左右。计算一下可以知道,配置定时器时,预分频系数设置为7199,自动重装载值设置为200。我们初始化TIM3的通道1来控制sg90。PWM引输出脚映射到PC6。初始化程序如下

/*
 *==============================================================================
 *函数名称:TIM3_CH1_PWM_Init
 *函数功能:初始化定时器3的PWM通道1
 *输入参数:per:自动重装载值;psc:预分频系数
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void TIM3_CH1_PWM_Init (u16 per,u16 psc)
{
	// 结构体定义
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	// 开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	// 初始化GPIO
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽输出
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);   // 改变指定管脚的映射	
	
	// 初始化定时器参数
	TIM_TimeBaseInitStructure.TIM_Period = per;   // 自动装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler = psc;   // 分频系数
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;   // 设置向上计数模式
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);	
	
	// 初始化PWM参数
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   // 比较输出模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;   // 输出极性
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   // 输出使能
	TIM_OC1Init(TIM3,&TIM_OCInitStructure);   // 输出比较通道1初始化
	
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);   // 使能TIMx在 CCR1 上的预装载寄存器
	TIM_ARRPreloadConfig(TIM3,ENABLE);   // 使能预装载寄存器
	
	TIM_Cmd(TIM3,ENABLE);   // 使能定时器
}

初始化时,程序如下

TIM3_CH1_PWM_Init(200,7199);   // 初始化TIM3 PWM1

4.2 编写控制程序

根据高电平持续时间与角度关系对应表格来编写sg90的控制程序

  while(1)
  {
		TIM_SetCompare1(TIM3,195);   // 旋转到0°
		delay_ms(500);
		TIM_SetCompare1(TIM3,190);   // 旋转到45°
		delay_ms(500);
		TIM_SetCompare1(TIM3,185);   // 旋转到90°
		delay_ms(500);
		TIM_SetCompare1(TIM3,180);   // 旋转到135°
		delay_ms(500);
		TIM_SetCompare1(TIM3,175);   // 旋转到180°
		delay_ms(500);
	}

五、360°舵机

除了上面介绍的180°舵机之外,还有一种360°舵机。与180°舵机不同的是,360°舵机是无法控制角度的,它只能控制旋转方向和旋转速度。360°的舵机也是由脉冲宽度为20ms的PWM控制。高电平持续时间与舵机转向和转速的对应关系如下

高电平持续时间/ms舵机转向和转速
0.5~1.5正转,速度越来越慢
1.5停止
1.5~2.5反转,速度越来越快
Linux SG90是一个用于控制舵机的代码示例。代码中使用了wiringPi库来控制GPIO引脚,通过读取键盘输入的不同值来控制舵机的转动角度。具体地,根据输入的值,将舵机控制引脚设置为高电平或低电平,从而实现舵机的转动。这段代码使用了定时器来定时更新舵机的状态,通过设置定时器的间隔和启动时间来控制定时器的工作方式。代码中还使用了signal信号处理函数来处理定时器产生的信号,进一步实现定时器的功能。此外,代码中的itimerval结构体用于配置定时器的参数,包括定时器的初始值和下次定时器过期的时间。 另外,还提供了一个实现定时器功能的代码示例。该代码通过使用itimerval结构体和setitimer函数来生成定时信号,并使用signal信号处理函数来处理定时信号。代码中通过设置定时器的初始值和间隔时间来控制定时器的工作方式。这个例子中的定时器每隔1秒打印一次"hello"。 总结来说,这些代码示例都展示了如何在Linux中使用定时器来控制舵机或执行其他定时任务。通过设置定时器的参数和信号处理函数,可以灵活地实现定时器功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [linux-----SG90舵机工作原理](https://blog.csdn.net/m0_69211839/article/details/129074743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

二土电子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值