SG90舵机的使用--STM32F103C8T6

这篇具有很好参考价值的文章主要介绍了SG90舵机的使用--STM32F103C8T6。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.接线

SG90带有一个3P的接头
根据颜色分为
sg90舵机三根线怎么接,STM32,学习,stm32,单片机,嵌入式硬件

  • 黄线(信号线)
  • 红线(电源线)
  • 棕色 (地线)

舵机的工作电压4.8V-6V,接在STM32系统板上驱动不了,所以需要接电源模块单独的5V供电,我使用的是如图所示的电源模块
sg90舵机三根线怎么接,STM32,学习,stm32,单片机,嵌入式硬件
注:
如果STM32系统板供电和舵机供电不为同一模块,则需要共地,否则控制不成功!!!

2.舵机的控制

舵机的控制需要一个20ms左右的时基脉冲,该脉冲的高电平部分0.5ms到2.5ms控制舵机转动角度0°-180°呈线性变化。

控制原理:舵机内部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,通过比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。

知道原理之后,让我们来编写驱动代码,首先需要一个总周期为20ms的时基脉冲,这里采用TIM3CH2(定时器3通道2)对应的GPIOB5作为输出控制信号

首先是PWM的基础配置

void TIM3_PWM_Init(u16 arr,u16 psc)//GPIOB5	
{
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
	TIM_OCInitTypeDef TIM_OCInitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//RCC配置GPIO,复用时钟 ->APB2	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//TIM3->APB1
	//GPIO初始化
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;//GPIOB5 
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;	
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//设置部分重映射

	//初始化TIM3
	TIM_TimeBaseStruct.TIM_Period=arr;//定时器周期
	TIM_TimeBaseStruct.TIM_Prescaler=psc;//预分频系数定时器周期                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
	TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStruct);
	//设置比较通道CH2
	/*
	PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为
	有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
	PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为
	无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平,否则为有效电平。
	*/
	//PWM1极性高 向上记数 CNT小于CCR为高电平	
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;			//PWM输出模式选择
	TIM_OCInitStruct.TIM_Pulse=0;							//通道比较值设定,可以自己设定
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;	//极性选择 (有效电平为高/低)
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//输出状态使能
	TIM_OC2Init(TIM3,&TIM_OCInitStruct);					//通道CH2 GPIOB5		
	//使能预装载寄存器
	 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //通道CH2 GPIOB5
	//定时器使能
	TIM_Cmd(TIM3,ENABLE);
}

然后根据需要的周期设置总记数值以及分频系数

void Sg90_Init(void){
	//舵机控制总周期要求为20ms
	//通过改变脉宽0.5ms-2.5ms代表0-180°
	TIM3_PWM_Init(2000-1,720-1);
	//2000*720/72M = 20000us = 20ms
}

然后通过改变比较值来改变舵机转动的角度

void SetAngle(int angle){
	//angle 范围为0-180
	if(angle >= 0 || angle <= 180){
		//总记数值为2000 比较值50-250代表0°-180°
		TIM_SetCompare2(TIM3,50+(200*angle/180));//修改定时器3通道2的比较值
	}
}

附带一个测试函数

void Sg90_Test(void){//运行一次角度+10° 大于180°时重新从0开始
	static int n = 0;
	n += 10;
	SetAngle(n%180);	
}

main.c

sys.h为官方库函数文件

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "sg90.h"
int main()
{
	delay_init();
	LedInit();
	Sg90_Init();	
	while(1)
	{	
		delay_ms(500);
		LED1 = ~LED1;
		Sg90_Test();		
	}
}

这里使用了板载的LED灯,监测运行是否正常。

sg90.c

#include "sg90.h"
/*********
SG90控制
GPIOB5 
*********/
void Sg90_Init(void){
	//舵机控制总周期要求为20ms
	//通过改变脉宽0.5ms-2.5ms代表0-180°
	TIM3_PWM_Init(1999,719);
	//2000*720/72M = 20000us = 20ms

}
void TIM3_PWM_Init(u16 arr,u16 psc)//GPIOB5	
{
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
	TIM_OCInitTypeDef TIM_OCInitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//RCC配置GPIO,复用时钟 ->APB2	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//TIM3->APB1
	//GPIO初始化
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;//GPIOB5 
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;	
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//设置部分重映射

	//初始化TIM3
	TIM_TimeBaseStruct.TIM_Period=arr;//定时器周期
	TIM_TimeBaseStruct.TIM_Prescaler=psc;//预分频系数定时器周期                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
	TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStruct);
	//设置比较通道CH2
	/*
	PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为
	有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
	PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为
	无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平,否则为有效电平。
	*/
	//PWM1极性高 向上记数 CNT小于CCR为高电平	
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;			//PWM输出模式选择
	TIM_OCInitStruct.TIM_Pulse=0;							//通道比较值设定,可以自己设定
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;	//极性选择 (有效电平为高/低)
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//输出状态使能
	TIM_OC2Init(TIM3,&TIM_OCInitStruct);					//通道CH2 GPIOB5		
	//使能预装载寄存器
	 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //通道CH2 GPIOB5
	//定时器使能
	TIM_Cmd(TIM3,ENABLE);
}
void SetAngle(int angle){
	//angle 范围为0-180
	if(angle >= 0 || angle <= 180){
		//总记数值为2000 比较值50-250代表0°-180°
		TIM_SetCompare2(TIM3,50+(200*angle/180));//修改定时器3通道2的比较值
	}
}
void Sg90_Test(void){//运行一次角度+10° 大于180°时重新从0开始
	static int n = 0;
	n += 10;
	SetAngle(n%180);	
}

sg90.h

#ifndef  __SG90_H_
#define  __SG90_H_
#include "sys.h"

void Sg90_Init(void);
void SetAngle(int angle);
void Sg90_Test(void);
void TIM3_PWM_Init(u16 arr,u16 psc);
#endif //__SG90_H_

led.c

#include "led.h"
void LedInit(void)
{
	//库函数版本
	GPIO_InitTypeDef GPIO_InitStructor;
	//开启硬件时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	//配置IO 推挽输出,输出速度
	GPIO_InitStructor.GPIO_Pin=GPIO_Pin_13;
	GPIO_InitStructor.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructor.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStructor);
}

led.h

#ifndef  __LED_H_
#define  __LED_H_
#include "sys.h"
#define LED1 PCout(13)

void LedInit(void);
#endif //__LED_H_

附带项目总体文件
点击下载项目文件
链接:https://pan.baidu.com/s/1SlVU4H5foOcHIOLDQ_t5NQ?pwd=6666
提取码:6666文章来源地址https://www.toymoban.com/news/detail-776427.html

到了这里,关于SG90舵机的使用--STM32F103C8T6的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32驱动SG90舵机

    SG90是一种小型伺服电机,通常用于模型制作和小型机械应用中: 问题 答案 SG90的工作电压是多少 SG90的工作电压通常为3V至7.2V SG90最大扭矩是多少 SG90的最大扭矩约为1.5kg/cm SG90的工作温度范围是多少 SG90的工作温度范围通常为0°C至55°C SG90的控制方式是什么 SG90的控制方式通常为

    2024年02月12日
    浏览(15)
  • STM32外设系列—sg90(舵机)

    🎀 文章作者:二土电子 🌸 关注文末公众号获取其他资料和工程文件! 🐸 期待大家一起学习交流! 首先介绍说一下什么是舵机。舵机是一种位置(角度)伺服的驱动器。适用于一些需要角度不断变化的,可以保持的控制系统。sg90就是舵机的一种。 舵机的工作原理比较简

    2024年02月15日
    浏览(20)
  • STM32+SG90舵机详解(详细)

    上一次使用舵机只是草草了解,只大概知道是pwm控制的,这次又使用到了舵机,本以为复制上次代码就可以调试成功,没想到却弄了很久。 我使用的是STM32f103c8t6,用的是定时器4。这个f1板子的定时器各个通道io口如下图所示: 在开始之前我们要了解控制舵机需要的一个周期

    2024年02月08日
    浏览(27)
  • 基于STM32 SG90 9g舵机控制

    产品参数 名称:9克舵机180度 尺寸:23mm X 12.2mm X 29mm 重量:9克 扭矩:1.5kg/cm 工作电压:4.2 - 6V 温度范围:0 - 55℃ 运行速度:0.3s/60℃ 死带宽:10ms 舵机有三条线定义: 暗灰:GND 红色:VCC 4.8V - 7.2V 橙黄线:脉冲输入 在机器人机电控制系统中,舵机控制效果是性能的重要影响

    2024年02月14日
    浏览(15)
  • STM32第七课:PWM控制SG90舵机

            学习完上一课的PWM控制LED小灯实现呼吸灯的效果,我们就可以进一步学习PWM控制舵机的效果了。PWM控制舵机相信会是一个更有意思的小实验的。          舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档

    2024年04月17日
    浏览(14)
  • STM32---SG90舵机控制(HAL库,含源码)

    写在前面: 在嵌入式的项目中,舵机是一个十分常见的元器件模块,其主要的功能是实现机械转动,实质上舵机是一个伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。例如在机器人的电控制器系统中,飞行器设计,遥控机器人等。舵机的使用需要PWM信号

    2024年04月13日
    浏览(11)
  • 小白入门STM32(2)---控制SG90舵机---基础工作原理详解

    本人一枚软件编程人员,有一定C语言基础,目前自学STM32单片机,写下此篇一巩固所学二交流分享。 按照惯例,先介绍理论再实战上手,穿插习题,最后给出我的愚见。 SG90属于一种舵机,最适合小白入门,可直接由单片机驱动。另外,单片机中给我们封装了很多东西,所以

    2023年04月10日
    浏览(18)
  • 关于四足行走机器人步态分析STM32+SG90舵机控制

    最近逛某站看了很多国赛大佬的赛车,下面评论区一堆大佬在感叹“老师看到赛车都摇头。”作为一个初入STM32坑的萌新,我在某些站上查阅了相关资料后,确定给我自己的机器人搞成四足行走(ps,其实是L298N烧了)。 目前手上的板子是C8T6,学习的视频是江科协,主要代码

    2024年01月21日
    浏览(22)
  • 【STM32单片机】STM32控制SG90舵机的PWM部分参数的设置解答

    我们要知道,SG90舵机接收的PWM信号的参数:f=50Hz,T=1/f,所以周期为20ms。 当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。 换句话说,我们要用单片机产生一个 周期(20ms) 的PWM波,然后获得对应这些时长(分别是 0.5ms 、 1ms 、 1.5ms 、 2ms 、 2.5ms )的 高电

    2024年02月13日
    浏览(20)
  • Openmv+STM32F103C8T6视觉巡线小车

    机器视觉巡线处理是参考openmv官方代码 Openmv官网源代码:book. openmv.cc/project/follow-lines.html 根据官网视频及教程将源码注入openmv中。 小车巡的是黑线,所以颜色阈值要更改。 在文件示例中打开helloworld.py。 打开工具/机器视觉/阈值编辑器/缓冲区。 将我们需要寻迹的黑线调至全

    2023年04月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包