舵机控制(STM32F103C8T6)

article/2025/8/18 18:39:47

前言

        本文是以STM32F103C8T6作为主控芯片,通过PB6端口输出PWM,实现控制180°舵机。

一、舵机控制原理

(一)概述

        舵机是一种位置伺服驱动器器,是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只在控制信号持续不变,伺服机构就会保持相对的角度位置不变。如果控制信号发生变化,输出轴的位置也会相应发生变化。舵机的控制大部分都是通过PWM信号控制的。

        注:舵机按角度分为90°、180°、270°、360°舵机,其中360°舵机只能控制旋转速度不能固定在某一角度上。

(二)PWM

        PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占整个信号周期的百分比。如下图

(三)控制原理

        通过向舵机的信号线发送PWM信号控制舵机的输出量,一般来说,PWM的周期及占空比,可通过程序控制的。

        当我们向舵机发送脉冲宽度为1.5ms时,舵机的输出轴将移至中间位置0°;

        当脉冲宽度为1ms时,舵机的输出轴将移至中间位置-45°;

        脉冲宽度为2ms时,舵机的输出轴将移至中间位置45°。

        注:不同类型和品牌的伺服电机之间最大位置和最小位置的角度可能会不同。许多伺服器仅旋转约170度(或者只有90度),但宽度为1.5 ms的伺服脉冲通常会将伺服设置为中间位置(通常是指定全范围的一半);具体参考下图

占空比 = t / T 相关参数如下:

t = 0.5ms —————— 舵机会转到 -90 °
t = 1.0ms —————— 舵机会转到 -45°
t = 1.5ms —————— 舵机会转到 0°
t = 2.0ms —————— 舵机会转到 45°
t = 2.5ms —————— 舵机会转到 90°

 PWM周期为20ms = (2000*720)/72000000 = 0.2,通过程序设置的TIM_Period = 719,TIM_Prescaler = 1999(本文程序)

二、硬件连接

(一)舵机线说明

(二)引脚连接

主控舵机
5V+5V
GNDGND
PB6PWM

 

三、参考代码

1、初始化

void TIM4_CH1_PWM_Init(u16 arr,u16 psc)
{GPIO_InitTypeDef GPIO_InitStruct;TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;TIM_OCInitTypeDef TIM_OCInitTypeStruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//要开启复用功能的时钟才能重映射RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  ,ENABLE); //TIM3部分重映射/**查看数据手册,引脚的定时器通道是完全映射,还是部分映射*二者调用参数不相同*完全映射 :GPIO_FullRemap_TIM4*部分映射 :GPIO_PartialRemap_TIM4*///设置该引脚为复用输出功能GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);//初始化TIM4TIM_TimeBaseStruct.TIM_Period = arr;//重装载值 TIM_TimeBaseStruct.TIM_Prescaler = psc;//预分频值 TIM_TimeBaseStruct.TIM_ClockDivision = 0; //时钟分频1、2、4分频	TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置计数模式TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStruct);//初始化输出比较参数TIM_OCInitTypeStruct.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式TIM_OCInitTypeStruct.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能TIM_OCInitTypeStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性TIM_OC1Init(TIM4,&TIM_OCInitTypeStruct); //选择定时器输出通道 TIM4_CH1//使能预装载寄存器TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);//使能定时器TIM_Cmd(TIM4,ENABLE);
}

2、主函数

int main(void)
{TIM4_CH1_PWM_Init(1999,719);//PWM频率=72000000/(719+1)/(1999+1)=50hz=20mswhile(1){//-90度TIM_SetCompare1(TIM4,1750);//占空比(2000-1750)/2000*20ms=2.5ms//45度//TIM_SetCompare1(TIM4,1800);//占空比(2000-1800)/2000*20ms=2ms//0度//TIM_SetCompare1(TIM4,1850);//占空比(2000-1850)/2000*20ms=1.5ms//-45度//TIM_SetCompare1(TIM4,1900);//占空比(2000-1900)/2000*20ms=1ms//-90度//TIM_SetCompare1(TIM4,1945);//占空比(2000-1945)/2000*20ms=0.5ms  	}
}

相关代码,有需要可以自行下载(实现了能过串只发送控制旋转)
网盘链接:
链接:https://pan.baidu.com/s/1p-lAXJ4pS6-Tw3DFqxdQhQ 
提取码:ml04
如有什么问题欢迎指出来,有什么模块可以联系博主,博主会查询资料分享出来。


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

相关文章

Java 源代码怎么执行的

许多 Java 虚拟机的执行引擎在执行 Java 代码的时候都是解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)混合运行。 大体流程为: 编写 java 文件源码通过 javac 编译器将 java 源码编译为字节码流…

Java基础-java程序代码截取字符串及判断字符串是否包含某个字符(串)

文章目录 有一串字符串,是一串拼接码,如何截取获取想要的字段?判断字符串是否包含某个字符(串)indexOf方法 有一串字符串,是一串拼接码,如何截取获取想要的字段? public class Inte…

编写高质量JAVA程序代码的建议

--------------------------------------------------------------------------------------------------- 前言:原著《改善JAVA程序的151个建议》有151个建议,我在拜读的过程根据自己的理解合并了其中的几个,并将每个建议的核心要义进行了一…

java简单记事本代码_简单记事本的java程序代码

展开全部 天啊, 冖_Na0 为什么会有62616964757a686964616fe4b893e5b19e31333262343038我编的记事本代码呢???呵呵……你肯定是“请教”过我的吧?? 呵呵……我自己编了一个,不过呢,没…

IntelliJ IDEA 写java程序代码

快捷键 注释 单行:选中代码 ctrl/ 再来一次就是取消 多行:选中代码 ctrlshift/ 再来一次就是取消 格式化 CtrlAltL

Android studio如何运行java程序代码

先看Java程序类 public class GGG {public static void main(String[] args) {System.out.println("我是java程序");} }就是这么简单的一个java程序,在之前studio上可以直接运行,但是像现在升级studio后就发现运行报错: 首先java…

怎样使用lntelliJ IDEA 编写Java程序代码?

下面使用IDEA创建一个Java程序,实现在控制台上打印HelloWorld!的功能,具体步骤如下。 1.创建Java项目 进入New Project界面后,单击New Project选项按钮创建新项目,弹出New Project对话框,如下图所示。 New Projeet 对…

Java学习代码合集

其实我学习java最根本的原因是:我是一个挺关注外在的人,虽然是个程序员,所以我很喜欢写出那些带有漂亮的界面的程序,因为C总是控制台,我不是很喜欢,在这份java代码合集中,我会记录自己学习Java界…

Java开发常用代码

一.获取UUID UUID uuid UUID.randomUUID(); String str uuid.toString(); // 去掉“-” String s str.replaceAll("-", "");二.获取固定格式的时间字符串 第一种 //获取当前时间对象 Date d new Date(); //创建日期格式化类对象,”yyyy/MM/dd HH:mm…

一个简单的Java例程

编写一个程序,输出如下: 1.在IDEA中新建一个helloworld类,注意Java中严格区分大小写 2.在文件中添加如下代码: 源代码如下: public class helloworld{public static void main(String[] args){System.out.println(&q…

Python3读取大文件的方法

Python3读取大文件的方法 1. 方法一:利用yield生成器2. 方法二:利用open()自带方法生成迭代对象,这个是一行一行的读取3. 二者的比较 1. 方法一:利用yield生成器 def readPart(filePath, size1024, encoding"utf-8"):w…

大文件处理(上传,下载)思考

文件处理一直都是前端人的心头病,如何控制好文件大小,文件太大上传不了,文件下载时间太长,tcp直接给断开了😱😱😱等 效果 为了方便大家有意义的学习,这里就先放效果图,如…

python拆分大文件(大文件分割)

python拆分大文件 前言实现过程实验结果 前言 在工作中常常会遇见一些大文件,由于内容太多,使用比如记事本、notePad等软件也打不开,无法查看内容,最好是将整个文件进行拆分,分开处理,现在处理的文件原本是…

如何快速地向服务器传大文件,大文件如何快速传输

在这个互联网时代,信息更新速度逐渐加快。用户在进行文件传输时,一定是希望既稳定又快速的,并且还能够保证安全。但是通常来讲,FTP文件传输并不能同时实现这三点的,特别是上传大文件时,FTP上传文件速度明显…

Linux - 怎么实现大文件传输

一 前言 博文《PageCache》中介绍了 PageCache 的优缺点,其实在处理大文件中 PageCache 作用反而没有那么好。所以本文介绍 Linux 是怎么处理大文件的。 二 起因 首先看一下一个 read() 系统调用流程发生了什么,如下图: 当调用 read 方法时…

如何快速传输大文件:4 种大文件传输有效的方法

文件大小正在爆炸式增长,随之而来的挑战是如何仍然以快速、安全的方式发送。从这个意义上说,弄清楚如何快速传输大文件似乎是一项几乎不可能完成的任务。随着工作流程不断适应数字化,这对于自由职业者、业余视频编辑、后期制作公司和广播公司…

win 10计算机查找大文件,教你如何在Win10系统中查找大文件?

Win10系统如何查找大文件?Win10系统内置有搜索功能,可以帮助用户快速找到所需文件,一般我们都是输入名称进行查找文件的。当然也有其他的搜索方式,比如按照文件大小搜索,相信大家比较少见吧。那么在Win10系统中该如何查…

如何进行大文件传输?

本文首发微信公众号:码上观世界 网络文件传输的应用场景很多,如网络聊天的点对点传输、文件同步网盘的上传与下载、文件上传到分布式文件存储器等,其传输速度主要受限于网络带宽、存储器大小、CPU处理速度以及磁盘读写速度,尤其是…

大文件分片上传

前言 前端进行文件大小分割 &#xff0c;按10M分割进行分片上传&#xff0c;使用的项目还是前面文档介绍的poi同一个项目 另一篇poi导出文章,使用的同一个项目 poi的使用和工具类&#xff08;一&#xff09; 开发 1、maven依赖 <!--文件分片上传使用到依赖 start --&g…

HTTP传输大文件

一 概述 早期网络传输的文件非常小&#xff0c;只是一些几K大小的文本和图片&#xff0c;随着网络技术的发展&#xff0c;传输的不仅有几M的图片&#xff0c;还有可以达到几G和几十G的视频。 在这些大文件传输的情况下&#xff0c;100M的光纤或者4G移动网络都会因为网络压力导致…