STM32控制SG90舵机原理及代码

STM32控制SG90舵机原理及代码

  • 一.SG90舵机原理
  • 二.控制SG90舵机
  • 三.代码实例
    • 3.1 配置定时器
    • 3.2 main 函数
  • 四.实验现象

一.SG90舵机原理

舵机的运用还是比较广泛的,那么舵机工作原理是什么呢,一般来说我们给舵机一个信号他就能工作了,那么这个信号是什么,以及如何产生的呢。这里我们需要给舵机一个PWM信号,频率是50HZ,即周期是20ms(产品手册上这样说的。)。在这个条件下不同的占空比就是不同的信号。不同的信号就能控制舵机转动角度。注意舵机只有在改变信号时才会转动,一直维持一种信号的情况舵机是不会转动。

二.控制SG90舵机

那么我们如何控制舵机呢,我们需要单片机产生一个20ms的信号PWM(产品手册上这样说的。)然后我们可以设置占空比来控制舵机如何转动。这里怎么产生PWM波和设置占空比可以参考博主的一篇文章,写的很详细。pwm详解

三.代码实例

我这里使用的是stm32f103ZET6的定时器8的通道一 PC8引脚

3.1 配置定时器


void TIM8_PWM_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);	// 开启定时器时钟,即内部时钟CK_INT=72MRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置输出速度GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC_Pin_9//周期为72M/(200*7200)us=20msTIM_TimeBaseStructure.TIM_Period= (200-1);							 //自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断TIM_TimeBaseStructure.TIM_Prescaler= (7200-1);					 //驱动CNT计数器的时钟 = Fck_int/(psc+1)TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;		 //时钟分频因子 ,用于配置死区时间,没用到,随意TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数器计数模式,设置为向上计数TIM_TimeBaseStructure.TIM_RepetitionCounter=0;					 //重复计数器的值,没用到,可以随意设置TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);					 //初始化定时器TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;						 //配置为PWM模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能TIM_OCInitStructure.TIM_Pulse = 0;													 //设置占空比大小,在主函数compare中又设置一遍TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;		 //输出通道电平极性配置TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;	 //输出通道空闲电平极性配置TIM_OC1Init(TIM8, &TIM_OCInitStructure);			   						 //初始化通道1TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);						 //使能通道1输出TIM_Cmd(TIM8, ENABLE);						//使能计数器TIM_CtrlPWMOutputs(TIM8, ENABLE);	// 主输出使能,当使用的是通用定时器时,这句不需要
}

3.2 main 函数

/* 主函数 */
int main(void)
{	delay_init();							//延时初始化TIM8_PWM_Init(); 					//舵机初始化             	 while(1){  //解释一下,这里只要产生一个周期的信号即(20ms)舵机就能转动//如果一直保持这个信号,舵机也不会再转动。//这里延时只是为了观察现象。转动后,过1s再转动。TIM_SetCompare1(TIM8,5);//转到0度位置delay_ms(1000);TIM_SetCompare1(TIM8,15);//转到90度位置delay_ms(1000);	TIM_SetCompare1(TIM8,25);//转到180度位置delay_ms(1000);	}
}

四.实验现象

舵机实验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/35972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

00 - 环境配置

查看所有文章链接:(更新中)GIT常用场景- 目录 文章目录 1. 环境说明2. 安装配置2.1 配置user信息2.2 config的三个作用域 3. 建git仓库3.1 把已有的项目代码纳入git管理3.2 新建的项目直接用git管理3.3 配置local的user和email3.4 优先级&…

Redis_缓存1_缓存类型

14.redis缓存 14.1简介 穿透型缓存: 缓存与后端数据交互在一起,对服务端的调用隐藏细节。如果从缓存中可以读到数据,就直接返回,如果读不到,就到数据库中去读取,从数据库中读到数据,也是先更…

股票指数——RSI指数

RSI指数的计算非常简单,就是使用一段时间内的平均上涨除以平均上涨加平均下跌(取正值)。也就意味着RSI指数的取值是[0,100]之间,其中0表示周期内没有上涨的,100表示周期内没有下跌的。RSI的直观意义是它表示了一段周期…

学习笔记整理-JS-06-函数

一、函数基本使用 1. 什么是函数 函数就是语句的封装,可以让这些代码方便地被复用。函数具有"一次定义,多次调用"的优点。使用函数,可以简化代码,让代码更具有可读性。 2. 函数的定义和调用 和变量类似,函…

Jupyter并发测试以后出现EOFError marshal data too short

Jupyter 并发测试以后出现EOFError: marshal data too short 背景 由于项目需求需要用户能进行网页在线运行python代码程序,调研后决定使用Jupyter的服务接口实现此功能,目前使用docker进行容器化部署,测试针对次服务进行并发测试。测试并发…

JimuReport积木报表 v1.6.0版本发布—免费的可视化报表

项目介绍 一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于excel操作风格,通过拖拽完成报…

开源代码分享(13)—整合本地电力市场与级联批发市场的投标策略(附matlab代码)

1.引言 1.1摘要 本地电力市场是在分配层面促进可再生能源的效率和使用的一种有前景的理念。然而,作为一个新概念,如何设计和将这些本地市场整合到现有市场结构中,并从中获得最大利润仍然不清楚。在本文中,我们提出了一个本地市场…

中睿天下Coremail | 2023年第二季度企业邮箱安全态势观察

今日,中睿天下联合Coremail邮件安全发布《2023第二季度企业邮箱安全性研究报告》,对2023第二季度和2023上半年的企业邮箱的安全风险进行了分析。 一 垃圾邮件同比下降16.38% 根据监测,2023年Q2垃圾邮件数量达到6.47亿封,环比下降…

003-Spring boot 启动流程分析

目录 启动流程分析创建 SpringApplication启动 run(String... args) 启动流程分析 SpringApplication.run(App.class, args);return new SpringApplication(primarySources).run(args);创建 SpringApplication SpringApplication(primarySources):this.primarySources new L…

opencv图片灰度二值化

INCLUDEPATH D:\work\opencv_3.4.2_Qt\include LIBS D:\work\opencv_3.4.2_Qt\x86\bin\libopencv_*.dll #include <iostream> #include<opencv2/opencv.hpp> //引入头文件using namespace cv; //命名空间 using namespace std;//opencv这个机器视…

Springloc和aop的基础概念

什么是控制反转和依赖注入&#xff1f; 控制反转(IoC)和依赖注入(DI)是软件开发中常用的编程范式&#xff0c; 它们极大地提高了代码可维护性和可复用性&#xff0c;简化了代码结构。 什么是控制反转(IoC) 控制反转是- - 种编程模式&#xff0c;它将应用程序中的控制权转移到…

使用 SSL/TLS 加强 MQTT 通信安全

在之前的文章中&#xff0c;我们探讨了认证和访问控制机制。接下来&#xff0c;我们将介绍传输层安全协议&#xff08;TLS&#xff09;在提升 MQTT 通信安全方面的重要作用。本文将着重介绍 TLS 以及它如何保证 MQTT 通信的完整性、机密性和真实性。 概念解释 在开始之前&…

TypeScript项目中Axios的封装

目录 前言 一、axios中的常见类型 1. AxiosInstance 2. AxiosRequestConfig 3. AxiosResponse 4. AxiosError 二、axios封装步骤 三、封装后的完整代码 1. 基础封装 2. 高级封装 前言 为了实现统一的网络请求处理和管理&#xff0c;在日常开发中我们常常封装 axios&…

TiDB v7.1.0 跨业务系统多租户解决方案

本文介绍了 TiDB 数据库的资源管控技术&#xff0c;并通过业务测试验证了效果。资源管控技术旨在解决多业务共用一个集群时的资源隔离和负载问题&#xff0c;通过资源组概念&#xff0c;可以限制不同业务的计算和 I/O 资源&#xff0c;实现资源隔离和优先级调度&#xff0c;提高…

Patch SCN一键解决ORA-600 2662故障---惜分飞

客户强制重启库之后,数据库启动报ORA-600 2037,ORA-745 kcbs_reset_pool/kcbzre1等错误 Wed Aug 09 13:25:38 2023 alter database mount exclusive Successful mount of redo thread 1, with mount id 1672229586 Database mounted in Exclusive Mode Lost write protection d…

题目:2553.分离数组中数字的数位

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2553. 分割数组中数字的数位 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 倒序放置数组中数位&#xff0c;然后再反转即可。 解题代码&#xff1a; class Solution {public int[] sepa…

区分等待、阻塞,加拓展

在java中&#xff0c;很多时候我们忽略的基本的知识&#xff0c;这是很致命的&#xff0c;只有搞懂Thread的基础知识&#xff0c;才能进一步探索&#xff1a;reentrantLock&#xff0c;AQS等。 1&#xff1a;Thread的线程状态到底有几种&#xff1f; 6种&#xff1a; public…

SpringCloud微服务之间如何进行用户信息传递(涉及:Gateway、OpenFeign组件)

目录 1、想达到的效果2、用户信息在微服务之间传递的两种途径3、用RuoYi-Cloud为例进行演示说明&#xff08;1&#xff09;网关将用户信息写在请求头中&#xff08;2&#xff09;业务微服务之间通过OpenFeign进行调用&#xff0c;并且将用户信息写在OpenFeign准备的请求头中&am…

香港站群服务器为什么适合seo优化?

​  香港站群为什么适合seo优化?本文主要从以下四点出发进行原因阐述。 1.香港站群服务器的优势 2.香港站群服务器与国内服务器的对比 3.多IP站群服务器的优势 4.香港站群服务器在SEO优化中的注意事项 1.香港站群服务器的优势 香港站群服务器是为了满足企业SEO优化需求而提供…

GD32F103VE使用DMA传输读取内部温度和参考电压值

GD32F103VE使用DMA传输读取内部温度和参考电压值。出厂CPU芯片不同&#xff0c;温度误差不同&#xff0c;不要纠结了。 GD32F103的ADC为12位AD转换器,ADC转换结果保存在16位数据寄存器中; 模拟输入通道&#xff1a; 16个外部模拟输入通道; 1个内部温度传感器通道(Vsense) 1个…