STM32-笔记22-sg90舵机

一、接线

 二、实验实现

动手让 SG90 每秒转动一下,0° -> 20° -> 40° -> 100° -> 180° 如此循环。

舵机接A6

复制18-呼吸灯,重命名24-sg90舵机

把PWM重命名sg90

打开项目文件

在魔术棒和品上把PWM都去掉,加载sg90文件夹

加载之后把文件中含有pwm.h字样的换成sg90

编译

使用定时器3通道1(产品手册18页)

在代码中把相应数据改掉

三、舵机实现0-180°,180-0°

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "sg90.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯sg90_init();uint16_t i = 0;while(1){ //舵机for(i = 5;i<=25;i++){tim3_compare_set(i);delay_ms(100);}for(i = 5;i<=25;i++) {tim3_compare_set(30 - i);delay_ms(100);}}
}

sg90.c

#include "sg90.h"TIM_HandleTypeDef tim3_handle ={0}; //init函数
void tim3_init(void)//固定20ms周期
{TIM_OC_InitTypeDef pwm_config = {0};tim3_handle.Instance = TIM3;  //寄存器时基地址tim3_handle.Init.Prescaler = 7200 - 1;  //psctim3_handle.Init.Period = 200 - 1;   //arrtim3_handle.Init.CounterMode = TIM_COUNTERMODE_UP;  //计数器模式:向上计数HAL_TIM_PWM_Init(&tim3_handle);pwm_config.OCMode = TIM_OCMODE_PWM1; //定时模式:模式1pwm_config.Pulse = 100;//CCR(比较寄存器)的值  :随意指定,因为值还要改 ;指定PWM信号的脉冲宽度pwm_config.OCPolarity = TIM_OCPOLARITY_HIGH;//舵机看占空比,有效电平:高电平HAL_TIM_PWM_ConfigChannel(&tim3_handle,&pwm_config,TIM_CHANNEL_1);//句柄,pwm配置,通道1HAL_TIM_PWM_Start(&tim3_handle,TIM_CHANNEL_1);
}//msp函数
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM3){GPIO_InitTypeDef gpio_initstruct;//定义一个结构体gpio_initstruct//打开时钟__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_TIM3_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.Mode = GPIO_MODE_AF_PP;//复式推挽输出gpio_initstruct.Pin = GPIO_PIN_6;//LED1对应的引脚gpio_initstruct.Pull = GPIO_PULLUP;//上拉gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//速度:高速HAL_GPIO_Init(GPIOA,&gpio_initstruct);//使用中断的时候才使用NVIC
//        HAL_NVIC_SetPendingIRQ(TIM3_IRQn);
//        HAL_NVIC_EnableIRQ(TIM3_IRQn);}
}//修改CCR值的函数void tim3_compare_set(uint16_t val)
{__HAL_TIM_SET_COMPARE(&tim3_handle,TIM_CHANNEL_1,val);//句柄,通道,值
}void sg90_init(void)
{tim3_init();
}

sg90.h

#ifndef __SG90_H__
#define __SG90_H__#include "sys.h"
void sg90_init(void);
void tim3_compare_set(uint16_t val);#endif

四、实现输入一个角度,舵机旋转到指定角度

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "sg90.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯sg90_init();//uint16_t i = 0;while(1){ sg90_angle_set(0);//度数delay_ms(1000);sg90_angle_set(20);delay_ms(1000);sg90_angle_set(40);delay_ms(1000);sg90_angle_set(90);delay_ms(1000);sg90_angle_set(180);delay_ms(1000);
//        //舵机
//        for(i = 5;i<=25;i++)
//        {
//            tim3_compare_set(i);
//            delay_ms(100);
//        }
//        for(i = 5;i<=25;i++) 
//        {
//            tim3_compare_set(30 - i);
//            delay_ms(100);
//        }}
}

sg90.c

#include "sg90.h"TIM_HandleTypeDef tim3_handle ={0}; //init函数
void tim3_init(void)//固定20ms周期
{TIM_OC_InitTypeDef pwm_config = {0};tim3_handle.Instance = TIM3;  //寄存器时基地址tim3_handle.Init.Prescaler = 7200 - 1;  //psctim3_handle.Init.Period = 200 - 1;   //arrtim3_handle.Init.CounterMode = TIM_COUNTERMODE_UP;  //计数器模式:向上计数HAL_TIM_PWM_Init(&tim3_handle);pwm_config.OCMode = TIM_OCMODE_PWM1; //定时模式:模式1pwm_config.Pulse = 100;//CCR(比较寄存器)的值  :随意指定,因为值还要改 ;指定PWM信号的脉冲宽度pwm_config.OCPolarity = TIM_OCPOLARITY_HIGH;//舵机看占空比,有效电平:高电平HAL_TIM_PWM_ConfigChannel(&tim3_handle,&pwm_config,TIM_CHANNEL_1);//句柄,pwm配置,通道1HAL_TIM_PWM_Start(&tim3_handle,TIM_CHANNEL_1);
}//msp函数
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM3){GPIO_InitTypeDef gpio_initstruct;//定义一个结构体gpio_initstruct//打开时钟__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_TIM3_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.Mode = GPIO_MODE_AF_PP;//复式推挽输出gpio_initstruct.Pin = GPIO_PIN_6;//LED1对应的引脚gpio_initstruct.Pull = GPIO_PULLUP;//上拉gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//速度:高速HAL_GPIO_Init(GPIOA,&gpio_initstruct);//使用中断的时候才使用NVIC
//        HAL_NVIC_SetPendingIRQ(TIM3_IRQn);
//        HAL_NVIC_EnableIRQ(TIM3_IRQn);}
}//修改CCR值的函数void tim3_compare_set(uint16_t val)
{__HAL_TIM_SET_COMPARE(&tim3_handle,TIM_CHANNEL_1,val);//句柄,通道,值
}void sg90_init(void)
{tim3_init();
}
void sg90_angle_set(uint16_t angle)
{uint16_t CCRx = (1.0/9.0) * angle + 5.0;tim3_compare_set(CCRx);
}

sg90.h

#ifndef __SG90_H__
#define __SG90_H__#include "sys.h"
void sg90_init(void);
void sg90_angle_set(uint16_t angle);#endif

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

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

相关文章

【SQL】进阶知识 -- 随机取数的几种方式

在很多数据库开发和数据分析中&#xff0c;我们经常需要从大量数据中随机抽取一定数量的记录。比如&#xff0c;从一个客户表中随机选取4个客户进行抽奖&#xff0c;或者在进行数据分析时&#xff0c;想随机挑选几条数据进行查看。那么&#xff0c;如何在不同的数据库系统中实现…

MarkDown 的 mermaid gantt(甘特图)、mermaid sequenceDiagram (流程图) 语法解析和应用

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 MarkDown 的 mermaid gantt、mermaid sequenceDiagram 语法解析和应用前言mermaid gan…

GO:复用对象和协程资源

避免频繁分配相同类型临时对象的开销 问题 &#xff1a; 不停地创建临时对象&#xff0c;Golang 运行时的哪些操作会消耗 CPU 资源&#xff1f; 1. 首先是内存分配。我们不停地创建对象时&#xff0c;就得不断地在堆里面找空闲的内存块&#xff0c;然后进行分配。这就像是在一个…

大模型理解力探讨:LeCun认为,大模型(LLM)并不真正理解这个世界,尤其是物理世界,它们只是“本能般地吐出一个又一个单词”。而Hinton则持相反观点。

大模型理解力探讨&#xff1a;从LeCun与Hinton的观点看LLM的“理解”本质 关键词&#xff1a; #大模型理解力 Large Model Understanding #LLM Large Language Model #特征交互 Feature Interaction #视频学习 Video Learning #语言学习 Language Learning 具体实例与推演 考…

Pygame - 俄罗斯方块游戏开发教程

本教程将带你一步步制作一个简单的俄罗斯方块游戏&#xff0c;使用Python和pygame库。我们将逐步了解如何创建游戏窗口、实现方块控制、碰撞检测、行消除、计分等功能&#xff0c;最后完成一个基本的俄罗斯方块游戏。 1. 准备工作 首先&#xff0c;你需要确保已安装pygame库。…

Docker图形化界面工具Portainer最佳实践

前言 安装Portainer 实践-基于Portainer安装redis-sentinel部署 Spring Boot集成Redis Sentinel 前言 本篇文章笔者推荐一个笔者最常用的docker图形化管理工具——Portainer。 安装Portainer 编写docker-compose文件 Portainer部署的步骤比较简单&#xff0c;我们还是以…

【Python】基于blind-watermark库添加图片盲水印

blind-watermark 是一个用于在图像中添加和提取盲水印的 Python 库。盲水印是一种嵌入信息&#xff08;如水印&#xff09;到图像中的方法&#xff0c;使得水印在视觉上不可见&#xff0c;但在需要时可以通过特定的算法进行提取。以下是如何使用 blind-watermark 库来添加和提取…

OCR图片中文字识别(Tess4j)

文章目录 Tess4J下载 tessdataJava 使用Tess4j 的 demo Tess4J Tess4J 是 Tesseract OCR 引擎的 Java 封装库&#xff0c;它让 Java 项目更轻松地实现 OCR&#xff08;光学字符识别&#xff09;功能。 下载 tessdata 下载地址&#xff1a;https://github.com/tesseract-ocr/…

默认ip无法访问,利用dhcp功能获取ip进行访问的方法

应用场景&#xff1a; ac的默认ip如192.168.1.1在pc与ac的eth2以后网口直连无法ping通&#xff0c;而且pc改为dhcp自动获取ip也获取不到ip地址&#xff0c;无法进行web配置和命令行操作。 原因是ac或其他设备被修改了默认ip或者端口vlanid&#xff0c;现在的端口vlan对应子接…

Unity3D 基于GraphView实现的节点编辑器框架详解

前言 在Unity3D游戏开发中&#xff0c;节点编辑器是一种强大的工具&#xff0c;它允许开发者以可视化的方式创建和编辑复杂的逻辑和流程。Unity提供了一个强大的UI工具包——GraphView&#xff0c;它使得创建自定义节点编辑器变得相对简单。本文将详细介绍如何使用GraphView实…

Springboot日志打印、SpringBoot集成Log4j2(附源码)、异步日志

文章目录 一、Log4j2介绍1.1、常用日志框架1.2、为什么选用log4j2 二、Log4j2整合步骤2.1、引入jar包2.2、配置文件2.3、配置文件模版 三、配置参数简介3.1、日志级别3.2、日志格式&#xff08;PatternLayout&#xff09;3.3、Appenders组件列表3.3.1、Console3.3.2、File3.3.3…

2025-01-03 同步

视野同步AOI 1.视窗同步(独立镜头)2.九宫格3.灯塔(九宫格的优化版)4.四叉树5.十字链表 1.视窗同步(独立镜头) SLG或RTS类型游戏一般用这种方法来实现。 两者还有细微的区别&#xff1a; RTS 对于即时性的要求很高&#xff0c;选手会经常切屏来观看游戏信息。所以通常会直接采…

uniapp:跳转第三方地图

1.跳转第三方高德地图 //跳转地图 toMap(item){uni.navigateTo({url: (window.location.href https://uri.amap.com/navigation?to${item.lng},${item.lat},${item.shopName}&modecar&policy1&srchttps://gawl.gazhcs.com/wap/index.html&callnative0)}) },…

系统设计——大文件传输方案设计

摘要 大文件传输是指通过网络将体积较大的文件从一个位置发送到另一个位置的过程。这些文件可能包括高清视频、大型数据库、复杂的软件安装包等&#xff0c;它们的大小通常超过几百兆字节&#xff08;MB&#xff09;甚至达到几个吉字节&#xff08;GB&#xff09;或更大。大文…

STM32-笔记32-ESP8266作为服务端

esp8266作为服务器的时候&#xff0c;这时候网络助手以客户端的模式连接到esp8266&#xff0c;其中IP地址写的是esp8266作为服务器时的IP地址&#xff0c;可以使用ATCIFSR查询esp8266的ip地址&#xff0c;端口号默认写333。 当esp8266作为服务器的时候&#xff0c;需要完成哪些…

Tailwind CSS 实战:性能优化最佳实践

在现代网页开发中,性能优化就像是一场精心策划的马拉松。记得在一个电商项目中,我们通过一系列的性能优化措施,让页面加载时间减少了 60%,转化率提升了 25%。今天,我想和大家分享如何使用 Tailwind CSS 进行性能优化。 优化理念 性能优化就像是在打磨一块璞玉。我们需要通过各…

ArcGIS JSAPI 高级教程 - 通过RenderNode实现视频融合效果(不借助三方工具)

ArcGIS JSAPI 高级教程 - 通过RenderNode实现视频融合效果(不借助三方工具) 核心代码完整代码在线示例地球中展示视频可以通过替换纹理的方式实现,但是随着摄像头和无人机的流行,需要视频和场景深度融合,简单的实现方式则不能满足需求。 三维视频融合技术将视频资源与三维…

小程序组件 —— 25 组件案例 - 商品导航区域

这一节主要实现商品导航区的结构和样式&#xff0c;商品导航区没有新的知识点&#xff0c;主要使用之前学习的三个组件&#xff1a; view&#xff1a;视图容器iamge&#xff1a;图片组件text&#xff1a;文本组件 商品导航区由五个商品导航来组成&#xff0c;每一个视频导航都…

【Ubuntu】安装华为的MindSpore

目录 1 安装Anaconda 2 更换国内源 3 安装MindSpore 1 安装Anaconda 2 更换国内源 具体方法如下&#xff1a; 打开命令行 cmd 工具&#xff0c;输入以下命令。 ① Conda 换源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ c…