当前位置: 首页 > news >正文

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值的选取&#xf…...

使用插件 `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数据库中&#xff0c;表约束是确保数据完整性的关键。约束限制了可以在表中插入或更新的数据类型&#xff0c;保证数据的准确性和可靠性。了解MySQL中的各种表约束对于数据库设计和数据维护至关重要。以下是MySQL支持的主要表约束类型及其应用的详细介绍。 1. 主键约束…...

【大模型+知识图谱】大模型与知识图谱融合:技术演进、实践应用与未来挑战

【大模型+知识图谱】大模型与知识图谱融合:技术演进、实践应用与未来挑战 大模型与知识图谱融合:技术演进、实践应用与未来挑战引言:为什么需要融合?一、技术融合的三重路径1.1 知识图谱增强大模型1.2 大模型赋能知识图谱1.3 协同推理框架二、工业级应用场景落地2.1 智能问…...

MS SQL 2008 技术内幕:T-SQL 语言基础

《MS SQL 2008 技术内幕&#xff1a;T-SQL 语言基础》是一部全面介绍 Microsoft SQL Server 2008 中 T-SQL&#xff08;Transact-SQL&#xff09;语言的书籍。T-SQL 是 SQL Server 的扩展版本&#xff0c;增加了编程功能和数据库管理功能&#xff0c;使得开发者和数据库管理员能…...

MySQL-MATCH ... AGAINST工具

在MySQL中&#xff0c;MATCH……AGAINST是全文索引&#xff08;Full-Text index&#xff09;的查询语法&#xff0c;它允许你对文本进行高效的全文搜素&#xff0c;支持自然语言搜索和布尔搜索模式。以下是MATCH……AGAINST的详细用法和示例 一、全文索引的基本概念 全文索引适…...

微服务合并

有的团队为了节约机器成本、有的团队为了提升研发效率、有的团队为了降低人均服务数 微服务合并&#xff0c;可以从多个角度入手 代码重构融合&#xff1a;人工拷贝代码、解决冲突&#xff0c;然后分阶段实施迁移重构。代码合并打包&#xff1a;将多个代码仓库&#xff0c;拉取…...

Shell脚本基础:用Bash自动化任务

Shell脚本基础&#xff1a;用Bash自动化任务 在Linux运维中&#xff0c;手动执行重复性任务既耗时又容易出错&#xff0c;而Shell脚本则为自动化提供了强大支持。 从基础概念到实用案例&#xff0c;逐步掌握用Bash实现自动化的核心技能。Shell脚本是Linux自动化的基石&#xf…...

基于W2605C语音识别合成芯片的智能语音交互闹钟方案-AI对话享受智能生活

随着科技的飞速发展&#xff0c;智能家居产品正逐步渗透到我们的日常生活中&#xff0c;其中智能闹钟作为时间管理的得力助手&#xff0c;也在不断进化。基于W2605C语音识别与语音合成芯片的智能语音交互闹钟&#xff0c;凭借其强大的联网能力、自动校时功能、实时天气获取、以…...

【Java项目】基于Spring Boot的网上商城购物系统

【Java项目】基于Spring Boot的网上商城购物系统 技术简介&#xff1a;采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介&#xff1a;系统实现管理员&#xff1a;首页、个人中心、用户管理、商品分类管理、商品信息管理、订单评价管理、系统管理、订单管理&#x…...

开放标准(RFC 7519):JSON Web Token (JWT)

开放标准&#xff1a;JSON Web Token 前言基本使用整合Shiro登录自定义JWT认证过滤器配置Config自定义凭证匹配规则接口验证权限控制禁用session缓存的使用登录退出单用户登录Token刷新双Token方案单Token方案 前言 JSON Web Token &#xff08;JWT&#xff09; 是一种开放标准…...

JBoltAI_SpringBoot如何基于Deepseek官网API区分 R1大模型深度思考和具体回答的内容?

R1大模型推出后&#xff0c;Deepseek官网的API也更新了&#xff0c;我们可以看到 chat 接口的响应数据结果里多了一个reasoning_content 字段 于是我们的JBoltAI SDK 以及 SpringBoot版以及Jfinal版JBoltAI Platform 迅速跟进&#xff0c;提供了对深度思考的支持&#xff1a;…...

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 &#x1f680; AGPL-3.0 License - https://ultralytics.com/licensefrom pathlib import Pathfrom ult…...

MySQL 事务笔记

MySQL 事务笔记 目录 事务简介事务操作事务四大特性并发事务问题事务隔离级别总结 事务简介 事务&#xff08;Transaction&#xff09;是数据库操作的逻辑单元&#xff0c;由一组不可分割的SQL操作组成。主要用于保证&#xff1a; 多个操作的原子性&#xff08;要么全部成功…...

react使用拖拽,缩放组件,采用react-rnd解决

项目中需求&#xff0c;要求给商品图片添加促销标签&#xff0c;并且可拉伸大小&#xff0c;和拖拽位置 最后选择用react-rnd来实现 话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; 1.在项目根目录下执行以下代码&#xff0c;引入react-rnd yarn add r…...

【C++基础】什么是C++?

本文收录于 《C编程入门》专栏&#xff0c;从零基础开始&#xff0c;介绍C编程入门相关的内容&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、发展简史三、主要特性四、应用场景五、第一个C程序六、总结 一、前言 为了让初学者快速的了解C语言&#…...

3 算法1-3 火星人

题目描述 一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指――拇指、食指、中指、无名指和小指分别编号为 1,2,3,4 和 5&#xff0c;当它们按正常顺序排列时&#xff0c;形成了 5 位数 12345&#xff0c;当你交换无名指和小指的位置时&#xff0c;会形成 5 位数…...

【原创工具】同文件夹PDF文件合并 By怜渠客

【原创工具】同文件夹PDF文件合并 By怜渠客 原贴&#xff1a;可批量合并多个文件夹内的pdf工具 - 吾爱破解 - 52pojie.cn 他这个存在一些问题&#xff0c;并非是软件内自主实现的PDF合并&#xff0c;而是调用的pdftk这一工具&#xff0c;但楼主并没有提供pdftk&#xff0c;而…...

数据结构-直接插入和希尔排序

这次&#xff0c;我们来讲数据结构的排序的直接插入。 一&#xff1a;排序的思想&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 相当于&#xff0c;我们打牌如上图…...

vue3表单验证的时候访问接口如果有值就通过否则不通过.主动去触发校验

页面有个身份证号码的校验。校验完身份证格式是否符合之后还要去访问接口查询这个用户是否存在。如果存在才通过验证。否则就校验不通过 <el-form ref"ruleFormRef" :model"form" label-width"140px" label-position"right" label…...

Ryujinx模拟器完全指南:从基础原理到高级应用

Ryujinx模拟器完全指南&#xff1a;从基础原理到高级应用 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 一、核心认知&#xff1a;模拟器技术解析与平台适配 模拟器工作机制&#xf…...

数据结构之哈夫曼树(Huffman Tree)

哈夫曼树&#xff08;Huffman Tree&#xff09;详解 概述 哈夫曼树&#xff08;Huffman Tree&#xff09;是一种特殊的二叉树&#xff0c;由David A. Huffman于1952年提出。它是一种最优二叉树&#xff0c;主要用于数据压缩&#xff0c;能够为字符分配可变长度的编码&#xff0…...

Cursor Pro高效激活工具:突破试用限制,全平台解锁AI编程无限可能

Cursor Pro高效激活工具&#xff1a;突破试用限制&#xff0c;全平台解锁AI编程无限可能 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Y…...

最新多模式防红系统源码+对接易支付

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示一、详细介绍 最新多模式防红系统源码对接易支付 支持直链/跳转/短链接&#xff0c;使用本系统红了的域名可在微信和QQ直接打开&#xff0c; 系统带访问记录列表&#xff0c;可查看访问者ip和访问方式&#xff0c;带…...

Python原生AOT不是未来,是现在:某云厂商已将Django API服务AOT化,冷启动从1.8s→47ms,QPS提升4.3倍(完整CI/CD流水线配置)

第一章&#xff1a;Python原生AOT编译的演进逻辑与2026技术定位Python长期以来以解释执行和字节码&#xff08;.pyc&#xff09;为默认运行范式&#xff0c;其动态性与开发效率广受青睐&#xff0c;但启动延迟、内存开销与冷启动瓶颈在云原生边缘计算与嵌入式场景中日益凸显。原…...

微信聊天记录永久保存的3种方法:WeChatMsg完整指南与实战技巧

微信聊天记录永久保存的3种方法&#xff1a;WeChatMsg完整指南与实战技巧 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/w…...

Qwen3.5-9B-AWQ-4bit Node.js环境配置指南:解决npm与模块安装问题

Qwen3.5-9B-AWQ-4bit Node.js环境配置指南&#xff1a;解决npm与模块安装问题 1. 环境准备与快速部署 在开始之前&#xff0c;我们需要确保星图GPU平台的基础环境已经就绪。Qwen3.5-9B-AWQ-4bit模型需要特定的GPU资源支持&#xff0c;而Node.js环境则是我们后续开发的基础。 …...

MelonLoader终极指南:解锁Unity游戏的双引擎插件加载能力

MelonLoader终极指南&#xff1a;解锁Unity游戏的双引擎插件加载能力 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader MelonLoad…...

虚拟线程调度开销被严重低估?JVM源码级剖析vthread park/unpark的纳秒级损耗与4种对冲方案

第一章&#xff1a;虚拟线程调度开销被严重低估&#xff1f;JVM源码级剖析vthread park/unpark的纳秒级损耗与4种对冲方案虚拟线程&#xff08;Virtual Thread&#xff09;虽以轻量著称&#xff0c;但其 park/unpark 操作在 JVM 内部并非零成本——HotSpot 17 中&#xff0c;每…...

原神帧率解锁指南:3步突破60FPS限制,释放硬件全部性能!

原神帧率解锁指南&#xff1a;3步突破60FPS限制&#xff0c;释放硬件全部性能&#xff01; 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 还在为《原神》的60帧上限而烦恼吗&#xff1f…...