STM32中使用PWM对舵机控制
目录
1、硬件JIE
2、PWM口配置
3、角度转换
4、main函数中应用
5、工程下载连接
1、硬件介绍
单片机:STM32F1
舵机:MG995


2、PWM口配置
20毫秒的PWM脉冲占空比,对舵机控制效果较好
计算的公式:

PSC、ARR值的选取:SG90要求的频率是20ms,则72MHz / (PSC+1) / (ARR+1) = 1/0.02;这里PSC和ARR的参数是不固定的。经过多次尝试最终确定PSC=72-1,ARR=20k-1时,舵机旋转效果最好。
PWM配置程序
void pwm_init(void)
{GPIO_InitTypeDef GPIO_InitStructure_For_Servo;TIM_TimeBaseInitTypeDef TIM_TimeBaseImitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;/*µÚÒ»²½¿ªÆôRCCʱÖÓ*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*µÚ¶þ²½ÅäÖÃGPIO¶Ë¿---PA1Ú*/GPIO_InitStructure_For_Servo.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure_For_Servo.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure_For_Servo.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure_For_Servo);TIM_InternalClockConfig(TIM2);/*??????*//*µÚÈý²½ÅäÖÃʱ»ùµ¥Ôª*/ //20msƵÂÊ(¶æ»úÒªÇóµÄÕâ¸öƵÂÊЧ¹û×îºÃ)TIM_TimeBaseImitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseImitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseImitStructure.TIM_Period = 20000 - 1;TIM_TimeBaseImitStructure.TIM_Prescaler = 72 - 1;TIM_TimeBaseImitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseImitStructure);/*µÚËIJ½ÅäÖÃÊä³ö±È½Ïµ¥Ôª*/TIM_OCStructInit(&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0; /*CCR*/TIM_OC2Init(TIM2,&TIM_OCInitStructure);/*µÚÎ岽ʹÄÜʱÖÓ*/TIM_Cmd(TIM2,ENABLE);
}
设置脉冲
void pwm_setcompare2(uint16_t compare)
{TIM_SetCompare2(TIM2,compare);
}
完整代码
#include "pwm.h"void pwm_init(void)
{GPIO_InitTypeDef GPIO_InitStructure_For_Servo;TIM_TimeBaseInitTypeDef TIM_TimeBaseImitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;/*µÚÒ»²½¿ªÆôRCCʱÖÓ*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*µÚ¶þ²½ÅäÖÃGPIO¶Ë¿---PA1Ú*/GPIO_InitStructure_For_Servo.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure_For_Servo.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure_For_Servo.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure_For_Servo);TIM_InternalClockConfig(TIM2);/*??????*//*µÚÈý²½ÅäÖÃʱ»ùµ¥Ôª*/ //20msƵÂÊ(¶æ»úÒªÇóµÄÕâ¸öƵÂÊЧ¹û×îºÃ)TIM_TimeBaseImitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseImitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseImitStructure.TIM_Period = 20000 - 1;TIM_TimeBaseImitStructure.TIM_Prescaler = 72 - 1;TIM_TimeBaseImitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseImitStructure);/*µÚËIJ½ÅäÖÃÊä³ö±È½Ïµ¥Ôª*/TIM_OCStructInit(&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0; /*CCR*/TIM_OC2Init(TIM2,&TIM_OCInitStructure);/*µÚÎ岽ʹÄÜʱÖÓ*/TIM_Cmd(TIM2,ENABLE);
}void pwm_setcompare2(uint16_t compare)
{TIM_SetCompare2(TIM2,compare);
}
3、角度转换
void servo_set_angle(double angle)
{pwm_setcompare2(angle / 180 * 2000 + 500);
}
完整代码
#include "stepmotor.h"
#include "pwm.h"void servo_init(void)
{pwm_init();}void servo_set_angle(double angle)
{pwm_setcompare2(angle / 180 * 2000 + 500);
}
4、main函数中应用
2秒运动执行一次,分别从0度->180度->270度。(若180度舵机,运动到180度就不再往后转270度了,等到0度的时候转到0度)
//2秒运行一次if(i%2000==0){count++;//printf("count:%d \r\n",count);//printf("Pitch: %.2f ,Roll: %.2f,Yaw: %.2f \r\n",Pitch,Roll,Yaw); //Pitch,Roll,YawÊý¾Ý´«µ½´®¿Ú count2++;if(count2==1){angle=0;servo_set_angle(angle);printf("angle:%.2f \r\n",angle);}if(count2==2){angle=180;servo_set_angle(angle);printf("angle:%.2f \r\n",angle);}if(count2==3){angle=270;servo_set_angle(angle);count2=0;printf("angle:%.2f \r\n",angle);}}
完整代码
#include "system.h"
#include "SysTick.h"
#include "SysDelay.h"
#include "led.h"
#include "usart.h"
#include "mpu6050.h"
#include "stepmotor.h"double angle;int main()
{u8 count=0;u16 i=0; u16 count2=0;SystemInit(); //ϵͳ³õʼ»¯ SysDelay_Init(72); //×Ô¶¨ÒåÑÓʱº¯Êý³õʼ»¯LED_Init();USART1_Config(); //´®¿Ú1³õʼ»¯ ÉÏλ»úUSART3_Config(); //´®¿Ú3³õʼ»¯ À¶ÑÀÓëUSART3¹«ÓÃÏàͬIO¿ÚSysDelay_ms(10); //10ºÁÃëÑÓʱMPU6050_Init(); //MPU6050 DMPÍÓÂÝÒdzõʼ»¯delay_ms(1000);servo_init();while(1){/* 1¡¢LEDµÆÉÁ˸ */ if(i%500==0){led1=!led1;}//2ÃëÖ´ÐÐÒ»´Îif(i%2000==0){count++;//printf("count:%d \r\n",count);//printf("Pitch: %.2f ,Roll: %.2f,Yaw: %.2f \r\n",Pitch,Roll,Yaw); //Pitch,Roll,YawÊý¾Ý´«µ½´®¿Ú count2++;if(count2==1){angle=0;servo_set_angle(angle);printf("angle:%.2f \r\n",angle);}if(count2==2){angle=180;servo_set_angle(angle);printf("angle:%.2f \r\n",angle);}if(count2==3){angle=270;servo_set_angle(angle);count2=0;printf("angle:%.2f \r\n",angle);}}//20ºÁÃëÖ´ÐÐÒ»´Îif(i%20==0){}/*»ñÈ¡MPU6050½Ç¶È״̬*///ÔÚ´®¿ÚÊý¾Ý·¢ËÍÖ®ºó MPU6050_Pose(); //Pitch·¹ö£¬Roll¸©Ñö£¬YawÆ«º½SysDelay_ms(1); //1ºÁÃëÑÓʱi++;}
}
5、工程下载连接
https://download.csdn.net/download/panjinliang066333/90437321
相关文章:
STM32中使用PWM对舵机控制
目录 1、硬件JIE 2、PWM口配置 3、角度转换 4、main函数中应用 5、工程下载连接 1、硬件介绍 单片机:STM32F1 舵机:MG995 2、PWM口配置 20毫秒的PWM脉冲占空比,对舵机控制效果较好 计算的公式: PSC、ARR值的选取…...
使用插件 `vue2-water-marker`添加全局水印
使用插件 vue2-water-marker添加全局水印 效果图 1、安装插件 npm install vue2-water-marker --save2、全局注册 // main.js import Vue from vue import Vue2WaterMarker from vue2-water-markerVue.use(Vue2WaterMarker)3、在组件中使用 <template><div id&q…...
MySQL表约束的种类与应用
在MySQL数据库中,表约束是确保数据完整性的关键。约束限制了可以在表中插入或更新的数据类型,保证数据的准确性和可靠性。了解MySQL中的各种表约束对于数据库设计和数据维护至关重要。以下是MySQL支持的主要表约束类型及其应用的详细介绍。 1. 主键约束…...
【大模型+知识图谱】大模型与知识图谱融合:技术演进、实践应用与未来挑战
【大模型+知识图谱】大模型与知识图谱融合:技术演进、实践应用与未来挑战 大模型与知识图谱融合:技术演进、实践应用与未来挑战引言:为什么需要融合?一、技术融合的三重路径1.1 知识图谱增强大模型1.2 大模型赋能知识图谱1.3 协同推理框架二、工业级应用场景落地2.1 智能问…...
MS SQL 2008 技术内幕:T-SQL 语言基础
《MS SQL 2008 技术内幕:T-SQL 语言基础》是一部全面介绍 Microsoft SQL Server 2008 中 T-SQL(Transact-SQL)语言的书籍。T-SQL 是 SQL Server 的扩展版本,增加了编程功能和数据库管理功能,使得开发者和数据库管理员能…...
MySQL-MATCH ... AGAINST工具
在MySQL中,MATCH……AGAINST是全文索引(Full-Text index)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜索和布尔搜索模式。以下是MATCH……AGAINST的详细用法和示例 一、全文索引的基本概念 全文索引适…...
微服务合并
有的团队为了节约机器成本、有的团队为了提升研发效率、有的团队为了降低人均服务数 微服务合并,可以从多个角度入手 代码重构融合:人工拷贝代码、解决冲突,然后分阶段实施迁移重构。代码合并打包:将多个代码仓库,拉取…...
Shell脚本基础:用Bash自动化任务
Shell脚本基础:用Bash自动化任务 在Linux运维中,手动执行重复性任务既耗时又容易出错,而Shell脚本则为自动化提供了强大支持。 从基础概念到实用案例,逐步掌握用Bash实现自动化的核心技能。Shell脚本是Linux自动化的基石…...
基于W2605C语音识别合成芯片的智能语音交互闹钟方案-AI对话享受智能生活
随着科技的飞速发展,智能家居产品正逐步渗透到我们的日常生活中,其中智能闹钟作为时间管理的得力助手,也在不断进化。基于W2605C语音识别与语音合成芯片的智能语音交互闹钟,凭借其强大的联网能力、自动校时功能、实时天气获取、以…...
【Java项目】基于Spring Boot的网上商城购物系统
【Java项目】基于Spring Boot的网上商城购物系统 技术简介:采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介:系统实现管理员:首页、个人中心、用户管理、商品分类管理、商品信息管理、订单评价管理、系统管理、订单管理&#x…...
开放标准(RFC 7519):JSON Web Token (JWT)
开放标准:JSON Web Token 前言基本使用整合Shiro登录自定义JWT认证过滤器配置Config自定义凭证匹配规则接口验证权限控制禁用session缓存的使用登录退出单用户登录Token刷新双Token方案单Token方案 前言 JSON Web Token (JWT) 是一种开放标准…...
JBoltAI_SpringBoot如何基于Deepseek官网API区分 R1大模型深度思考和具体回答的内容?
R1大模型推出后,Deepseek官网的API也更新了,我们可以看到 chat 接口的响应数据结果里多了一个reasoning_content 字段 于是我们的JBoltAI SDK 以及 SpringBoot版以及Jfinal版JBoltAI Platform 迅速跟进,提供了对深度思考的支持:…...
YOLOv11-ultralytics-8.3.67部分代码阅读笔记-model.py
model.py ultralytics\models\yolo\model.py 目录 model.py 1.所需的库和模块 2.class YOLO(Model): 3.class YOLOWorld(Model): 1.所需的库和模块 # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/licensefrom pathlib import Pathfrom ult…...
MySQL 事务笔记
MySQL 事务笔记 目录 事务简介事务操作事务四大特性并发事务问题事务隔离级别总结 事务简介 事务(Transaction)是数据库操作的逻辑单元,由一组不可分割的SQL操作组成。主要用于保证: 多个操作的原子性(要么全部成功…...
react使用拖拽,缩放组件,采用react-rnd解决
项目中需求,要求给商品图片添加促销标签,并且可拉伸大小,和拖拽位置 最后选择用react-rnd来实现 话不多说,直接上代码!!! 1.在项目根目录下执行以下代码,引入react-rnd yarn add r…...
【C++基础】什么是C++?
本文收录于 《C编程入门》专栏,从零基础开始,介绍C编程入门相关的内容,欢迎关注,谢谢! 文章目录 一、前言二、发展简史三、主要特性四、应用场景五、第一个C程序六、总结 一、前言 为了让初学者快速的了解C语言&#…...
3 算法1-3 火星人
题目描述 一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指――拇指、食指、中指、无名指和小指分别编号为 1,2,3,4 和 5,当它们按正常顺序排列时,形成了 5 位数 12345,当你交换无名指和小指的位置时,会形成 5 位数…...
【原创工具】同文件夹PDF文件合并 By怜渠客
【原创工具】同文件夹PDF文件合并 By怜渠客 原贴:可批量合并多个文件夹内的pdf工具 - 吾爱破解 - 52pojie.cn 他这个存在一些问题,并非是软件内自主实现的PDF合并,而是调用的pdftk这一工具,但楼主并没有提供pdftk,而…...
数据结构-直接插入和希尔排序
这次,我们来讲数据结构的排序的直接插入。 一:排序的思想:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 相当于,我们打牌如上图…...
vue3表单验证的时候访问接口如果有值就通过否则不通过.主动去触发校验
页面有个身份证号码的校验。校验完身份证格式是否符合之后还要去访问接口查询这个用户是否存在。如果存在才通过验证。否则就校验不通过 <el-form ref"ruleFormRef" :model"form" label-width"140px" label-position"right" label…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
