舵机控制(STM32F103C8T6)

2023-05-16

前言

        本文是以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);
	
	//初始化TIM4
	TIM_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=20ms
	
	while(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
如有什么问题欢迎指出来,有什么模块可以联系博主,博主会查询资料分享出来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

舵机控制(STM32F103C8T6) 的相关文章

  • 舵机控制(0°与90°之间反复)

  • STM32F103C8T6汇编点灯

    最简单的结构 只有一个数据段 只是为了不报错而已 area Reset span class token punctuation span data span class token punctuation span readonly sp
  • stm32f103c8t6最小系统

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言stm32f103c8t6构成二 xff1a 电源电路稳压模块注意 复位电路NRST 时钟电路程序下载电路JTAGSWD 启
  • 第9章 舵机控制

    有一种电机可以在程序的控制下 xff0c 在一定范围内连续改变输出轴角度 并且可以保持住 这种电机最早被用在航模和船模等遥控模型中 xff0c 控制各种舵面的转动 xff0c 这就是舵机 现在舵机除了运用在 遥控模型中 xff0c 也大量的
  • 舵机控制c语言程序,舵机控制C程序

    舵机控制C程序 由会员分享 xff0c 可在线阅读 xff0c 更多相关 舵机控制C程序 4页珍藏版 请在人人文库网上搜索 1 舵机控制C程序 include define uchar unsigned char define uint u
  • 舵机控制(STM32F103C8T6)

    前言 本文是以STM32F103C8T6作为主控芯片 xff0c 通过PB6端口输出PWM xff0c 实现控制180 舵机 一 舵机控制原理 xff08 一 xff09 概述 舵机是一种位置伺服驱动器器 xff0c 是一种带有输出轴的小装
  • stm32F103C8T6基于FreeRTOS操作系统的多任务

    目录 一 FreeRTOS简介1 什么是FreeRTOS 2 FreeRTOS特点 二 创建项目三 编写代码四 编译烧录五 总结参考链接 一 FreeRTOS简介 1 什么是FreeRTOS 我们看一下FreeRTOS的名字 xff0c 可
  • STM32F103ZET6和STM32F103C8T6芯片的区别

    是这样的 xff0c 一个具体的STM32F103系列芯片的内存有多大 xff0c 你看一下芯片上的型号就行了 STM32F103XY 注意 xff0c XY是个代号 xff0c X是表示封装有多少个引脚 xff0c 比如 xff0c 如果
  • stm32F103C8T6核心板 使用ST-Link无法烧写程序的解决方案

    stm32F103C8T6核心板 使用ST Link无法烧写程序的解决方案 本人也是小白一名 希望我的回答能对你有所帮助 以下是我遇到的问题 1 首先是插入连接线 电脑显示如图 网上找了很久还没有找到解决方案 不过不影响烧写 其次是FlyM
  • 【stm32CubeMX】基于STM32F103C8T6的LED闪烁并用Keil的软件仿真逻辑分析仪功能观察

    stm32CubeMX 基于STM32F103C8T6的LED闪烁并用Keil的软件仿真逻辑分析仪功能观察 一 安装STM32CubeMX二 安装HAL库三 新建项目四 keil仿真调试五 实现六 总结七 参考资料 一 安装STM32Cub
  • 【STM32】STM32F103C8T6+L298N通过PWM控制直流电机转速

    系列文章目录 STM32 新建工程模板及配置 STM32 STM32与PC端 HC 06 ROS进行USART串口通信 ROS ROS上位机使用Serial库和boost asio库与STM32进行USART通讯 STM32 STM32F1
  • 【STM32】STM32F103C8T6使用外部中断法和输入捕获法进行编码器测速

    系列文章目录 STM32 新建工程模板及配置 STM32 STM32与PC端 HC 06 ROS进行USART串口通信 ROS ROS上位机使用Serial库和boost asio库与STM32进行USART通讯 STM32 STM32F1
  • Altium Designer绘制stm32f103c8t6最小系统原理图

    文章目录 前言芯片封装自定义封装原理图绘制总结 前言 本文提供了初学者绘制stm32最小系统 xff0c 同时初学者的同学可以跟着小白学习绘制原理图哦 芯片封装 提示 xff1a 下载安装好Altium Designer之后才能进行以下操作
  • 【stm32CubeMX】STM32F103c8t6串口通信

    stm32CubeMX STM32F103c8t6串口通信发送 39 hello windows 39 一 串口通信协议1 UART协议2 RS 2323 RS 485 二 USB转TTL三 配置CubeMX并建立工程四 串口通信实现五 k
  • 【STM32CubeMX】使用STM32F103C8T6输出PWM波形实现呼吸灯

    STM32CubeMX 使用STM32F103C8T6输出PWM波形实现呼吸灯 一 关于PWM二 Cube MX创建工程三 修改代码四 效果展示五 总结六 参考与代码下载 一 关于PWM 1 关于PWM 含义 PWM xff08 Pulse
  • 【STM32】STM32F103C8T6串口通信,实现3个串口收发数据

    串口通信 xff08 Serial Communications xff09 实现单片机与电脑或者其它外设进行通信 xff0c 通信时只需两根线 xff08 TX xff0c RX xff09 就可以实现数据传输 STM32f103有三个串
  • 基于STM32F103C8T6的USART1串口的中断接收

    一 串口介绍 二 项目所需硬件 1 USB转串口模块 三 项目代码 一 串口介绍 USART Universal Synchronous Asynchronous Receiver Transmitter 通用同步 异步串行接收 发送器 U
  • STM32F103C8T6 PWM驱动舵机(SG90)

    小知识 xff1a 同一个定时器 xff0c 不同通道输出不同输出PWM的特点 对于同一个定时器的不同通道输出PWM xff0c 因为它们是共用一个计数器的 xff0c 所以频率必须一样 xff0c 而占空比由各自的CCR决定 xff0c
  • STM32F103C8T6 gps串口数据处理

    基于stm32f10x系列单片机demo程序修改 配置串口 void USART1 Config void GPIO InitTypeDef GPIO InitStructure USART InitTypeDef USART InitSt
  • stm32f103c8t6新建环境+点灯

    stm32f103c8t6新建环境 43 点灯 简介步骤一 新建文件二 建立启动 43 用户端本身文件三 mdk内部设置四 实现基础工作效果五 点灯 总结 简介 STM32F103C8T6是一款由意法半导体公司 xff08 ST xff09

随机推荐

  • stm32——4、中断exti

    这里是基于正点原子开发板的学习记录 首先你要加入固件库 stm32f10x exti h 和 stm32f10x exti c 1 STM32中每个io口都可以作为外部中断的中断输入口 2 STM32F103的中断控制器支持19个外部中断
  • Android Q 获取设备唯一ID(UDID\GUID\UUID\SSAID\GAID)

    Android Q获取设备唯一ID xff08 UDID GUID UUID SSAID GAID xff09 一 简介1 1 问题背景1 2 关键技术 二 解决方案2 1 谷歌官方推荐方案 4种 2 2 实现方案1 GUID方案2 3 实
  • @RunWith(SpringRunner.class)测试SpringRunner.class找不到报红的解决办法

    SpringRunner报红无法添加类 上pom xml文件中去掉scope标签内容即可 如下图所示 问题解决
  • 搭建Hadoop分布式集群的详细教程

    目录 写在前面 一 创建虚拟机 xff0c 安装Centos 二 VMware VMnet8模式共享主机网络配置 三 克隆集群节点HadoopSlave1与HadoopSlave2 四 Linux系统配置 五 Hadoop的部署配置 六 H
  • PTA基础编程题 7-26单词长度 (15 分)

    题目 xff1a 你的程序要读入一行文本 xff0c 其中以空格分隔为若干个单词 xff0c 以 结束 你要输出每个单词的长度 这里的单词与语言无关 xff0c 可以包括各种符号 xff0c 比如it 39 s算一个单词 xff0c 长度为
  • 单链表逆置(头插法图解)

    算法思想 xff1a 首先将头结点摘下 xff0c 重新构造链表 xff0c 然后原链表中的结点依次头插到新链表中 xff0c 如此循环 xff0c 直到链表为空 xff0c 即可逆置链表 代码 xff1a 链表逆置 include lt
  • Java-如何理解new A();

    在leetcode 541 反转字符串中有这样一种解法 xff1a public class reverse string public static String reverseStr String s int k char ch 61
  • C++中main函数如何调用类内函数

    C 43 43 中main函数调用类内函数的方法 以力扣209题为例 include lt iostream gt include lt vector gt using namespace std class minimum size su
  • 堆排序——手工模拟+程序实现

    堆排序的算法思想 xff1a 将待排序列构造成一个大顶堆 xff0c 此时 xff0c 整个序列的最大值就是堆顶元素 输出堆顶元素 xff0c 将堆顶元素与堆底最后一个元素进行交换 xff0c 然后 xff0c 将剩余n 1个元素重新构造成
  • 设计模式详解:原型模式

    本篇来看一下创建型模式中的第四种模式 xff1a 原型模式 仍然是先看两张图 xff0c 复习模式类型 xff0c 加深记忆 定义 xff1a 原型模式 xff1a 使用原型实例指定待创建对象的类型 xff0c 并且 通过复制这个原型来创建
  • maven镜像源及代理配置

    在公司使用网络一般需要设置代理 xff0c 我在idea中创建springboot工程时 xff0c 发现依赖下载不了 xff0c 原以为只要浏览器设置代理 xff0c 其他的网络访问都会走代理 xff0c 经过查资料设置了以下几个地方后工
  • IDEA SpotBugs代码安全审计插件

    IDEA SpotBugs代码安全审计插件 在寻找idea代码审计插件的时候 xff0c 发现Findbugs已经停止更新 xff0c 无法在idea2020 01版本运行 xff0c 由此找到SpotBugs SpotBugs介绍 Spo
  • 洛谷P1233 木棍加工

    题目描述 一堆木头棍子共有n根 xff0c 每根棍子的长度和宽度都是已知的 棍子可以被一台机器一个接一个地加工 机器处理一根棍子之前需要准备时间 准备时间是这样定义的 xff1a 第一根棍子的准备时间为1分钟 xff1b 如果刚处理完长度为
  • 如何用python写一个计算日期间隔的程序?

    如何用python写一个计算日期间隔的程序 xff1f 文章目录 如何用python写一个计算日期间隔的程序 xff1f 前言问题梳理问题解决写在后面 前言 为什么想起来写一个这样的程序呢 xff1f 前几天聊天的时候 xff0c 突然想计
  • Ubuntu 中软件包缓存文件损坏问题

    终端输入 xff1a sudo apt get update 出现如下问题 解决方法 xff1a 输入 sudo rm rf var lib apt lists
  • linux开机自启系统服务的大致原理

    Linux启动系统服务 init启动 init读取 etc inittab文件 xff0c 获取运行等级 span class token comment The default runlevel 启动时的运行等级 span id 5 in
  • apache2 配置https

    配置Apache2 https 开启ssl模块 span class token function sudo span a2enmod ssl 启用ssl站点 span class token function sudo span a2en
  • JAVA对数字+字符串,中文一二三四等特殊格式字符串进行特殊排序

    提示 xff1a 对数字 43 字符串 中文一二三四 格式字符串去重 排序 重组 可以对customSort 类的46 53行进行修改 查看新排序效果 代码如下 xff08 示例 xff09 1 SortTest 类 xff1a span
  • Linux安装Jenkins

    手把手教你在Linux上安装jenkins xff0c 废话不多说 xff0c 直接上教程 1 xff0c 用windows到官网下载jenkins 2 346 1 1 noarch rpm xff0c 下载链接 xff1a https w
  • 舵机控制(STM32F103C8T6)

    前言 本文是以STM32F103C8T6作为主控芯片 xff0c 通过PB6端口输出PWM xff0c 实现控制180 舵机 一 舵机控制原理 xff08 一 xff09 概述 舵机是一种位置伺服驱动器器 xff0c 是一种带有输出轴的小装