STM32控制SG90舵机

article/2025/8/18 2:17:47

简介

通过使用STM32控制SG90舵机进行转动
PWM输出:PC6
定时器:TM3,通道1
接线如下:
在这里插入图片描述

控制原理及PWM配置

舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分

PWM周期为20ms = (7200*200)/72000000=0.02
所以TIM_Period = 199,TIM_Prescaler = 7199

占空比 = t / T 相关参数如下:
t = 0.5ms——————-舵机会转动 0 °
t = 1.0ms——————-舵机会转动 45°
t = 1.5ms——————-舵机会转动 90°
t = 2.0ms——————-舵机会转动 135°
t = 2.5ms——————-舵机会转动180°

PWM占空比是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,由于PWM周期为20ms,所以(以舵机会转动 45°为例),占空比就应该为1ms/20ms = 5%,所以TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值就为200-200*5% = 190

参考代码

#include "pwm.h"/*******************************************************************************
* 函 数 名         : pwm_init
* 函数功能		   : IO端口及TIM3初始化函数	   
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void pwm_init()
{GPIO_InitTypeDef GPIO_InitStructure;   //声明一个结构体变量,用来初始化GPIOTIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx/* 开启时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/*  配置GPIO的模式和IO口 */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;// PC6GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOC,&GPIO_InitStructure);//TIM3定时器初始化TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//设置用来作为TIMx时钟频率预分频值TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_timTIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//TIM向上计数模式TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射	//pC6//PWM初始化	  //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;TIM_OC1Init(TIM3,&TIM_OCInitStructure);//注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器TIM_Cmd(TIM3,ENABLE);//使能或者失能TIMx外设
}

#include "public.h"
#include "pwm.h"int main()
{	  pwm_init();	 //PWM初始化while(1){delay_ms(100);TIM_SetCompare1(TIM3, 195);//0度delay_ms(100);TIM_SetCompare1(TIM3, 190);//45度delay_ms(100);TIM_SetCompare1(TIM3, 185);//90度delay_ms(100);TIM_SetCompare1(TIM3, 180);//135度delay_ms(100);TIM_SetCompare1(TIM3, 175);//180度delay_ms(100);	}
}

参考

51单片机PWM双舵机控制详解
MG995舵机工作原理及基于STM32的驱动源代码


http://chatgpt.dhexx.cn/article/iLdiB7Un.shtml

相关文章

【mcuclub】舵机-SG90

一、实物图(SG90) 二、原理图 编号名称功能1GND电源地(棕色线)2VCC电源正(红色线)3I/O信号线(黄色线) 三、简介 舵机(英文叫Servo),是伺服电机的…

STM32外设系列—sg90(舵机)

文章目录 一、sg90简介二、引脚连接三、控制方法四、程序设计4.1 配置定时器4.2 编写控制程序 五、360舵机 一、sg90简介 首先介绍说一下什么是舵机。舵机是一种位置(角度)伺服的驱动器。适用于一些需要角度不断变化的,可以保持的控制系统。…

java基本类型与包装类型

基本数据类型:byte,int, short, long, boolean,char, float,double等 包装类型 : Byte,Integer,Short,Long&#xff…

java基本类型与包装类型区别

java基本类型与包装类型区别 Java中基本类型都有固定的存储空间,不像其他大多数语言那样随机器硬件架构的变化而变化,这种占存储空间大小的不变性是java程序比其他大多数语言编写的程序更具可移植性的原因之一。 java中基本类型和包装类的区别&#xff1…

【包装类型】

文章目录 包装类八种基本类型及其包装类手动装箱/拆箱自动装箱/拆箱整数型常量池 Integer方法 包装类 我们已经知道,Java的数据类型分两种: 基本类型:byte,short,int,long,boolean,…

Java为什么要有基本数据类型和包装类型

作为面向对象语言为代表的Java, 在很多任务场景中经常看到它的身影。那么,Java为什么要有基本数据类型和包装类型? 这个问题看似简单,其实也不好回答。毕竟这个问题不仅你我感觉到困惑,许多大佬也感觉到困惑,一些人希望…

基本类型和包装类型的区别详解

六年前,我从苏州回到洛阳,抱着一幅“海归”的心态,投了不少简历,也“约谈”了不少面试官,但仅有两三个令我感到满意。其中有一位叫老马,至今还活在我的手机通讯录里。他当时扔了一个面试题把我砸懵了&#…

Boolean类型(基本与包装类型)

前面的话 当 Number、String、Boolean使用new操作符时,它们就不仅仅是基本类型了,变成了基本的包装类型,即引用类型。Boolean类型应该算是这三种类型中最简单的类型,这篇文章将介绍Boolean类型。 定义 Boolean类型只有两个字面…

34、Java 中有了基本数据类型,为什么还需要有包装类型?包装类型是啥?

文章目录 一、引入(基本数据类型弊端)二、包装类(1) 模拟包装类的实现(2) 包装类(Wrapper Class)(3) 自动装箱、自动拆箱① 自动装箱② 自动拆箱 三、整数类型包装类细节 ☆ 一、引入(基本数据类型弊端) &…

包装类和基本类型

什么是包装类 所谓包装类,就是能够直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类。 包装类 包装类有以下用途 1.集合不允许存放基本数据类型,故常用包装类 2.包含了每种基本类型的相…

包装类型和基本类型

包装类型和基本类型 Java中有八种基本数据类型,分别对应着八大包装类型,因为包装类型的实例都存在于堆中,所以包装类型也称为引用类型。 基本类型属于原始数据类型,变量中存储的就是原始值。包装类型属于引用数据类型&#xff0…

Java 的八大基本类型及其包装类型(超级详细)

Java 中有八种内置的基本数据类型,他们分别是 byte、short、int、long、float、double、char 和 boolean,其中,byte、short、int 和 long 都是用来表示整数,float 和 double 是用来表示浮点数的,那它们之间有什么区别和…

Java 八大包装类(超详细!)

一、8种基本数据类型对应的包装类型名 基本数据类型包装类型bytejava.lang.Byte(父类Number)shortjava.lang.Short(父类Number)intjava.lang.Integer(父类Number)longjava.lang.Long(父类Numbe…

关于InnoDB的读写锁类型以及加锁方式

(本文为了方便,英文关键词都都采用小写方式,相关知识点会简单介绍,争取做到可以独立阅读) 文章开始我会先介绍本文需要的知识点如下: innodb的主键索引(一级索引)和二级索引&#x…

C++线程中的几类锁

C线程中的几类锁 多线程中的锁主要有五类:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,所得功能与性能成反比。而且我们一般不使用递归锁(C提供std::recursive_mutex),这里不做介绍。 互斥锁 互斥锁用于控制多…

Oracle - 锁

锁概念 锁出现在数据共享的环境中,它是一种机制,在访问相同资源时,可以防止事务之间的破坏性交互。例如,在多个会话同时操作某表时,优先操作的会话需要对其锁定。 事务的分离性要求当前事务不能影响其他的事务&#…

用友数据库错误“未能读取并闩锁页(1:3355)(用闩锁类型SH)”修复

客户硬盘无法识别,检测后,硬盘有坏道,由于数据库正在坏道上,所以恢复出来的用友数据库无法附加。 通过无日志附加后,做DBCC检测数据库出现以下错误: “消息8966,级别16,状态1&#x…

Mysql中锁的类型有哪些?

Mysql中锁的类型有哪些? 1. 基于锁的属性分类:共享锁、排他锁2. 基于锁的粒度分类:行级锁(INNODB)、表级锁(INNODB、MYISAM)、页级锁(BDB引擎)、记录锁、间隙锁、临键锁。…

mysql 常见锁的类型(一)

文章目录 一、锁的分类1.1 加锁的目的1.2 锁的类别 二、乐观锁和悲观锁2.1. 乐观锁2.2. 悲观锁: 三、共享锁与排他锁四、表锁五、意向锁六、行级锁七、记录锁(Record Locks)八、间隙锁(Gap Locks)九、临键锁&#xff0…

MySQL-InnoDB常用锁类型解析

Shared(乐观锁) and Exclusive Locks(互斥锁): InnoDB有两种锁类型,Shared(s) and Exclusive(x) Locks(乐观锁和互斥锁)。 Shared&…