十五、STM32的TIM(六)(PWM驱动舵机)

article/2025/6/22 23:19:16

介绍:本章节主要讲解如何在 STM32C8T6 上使用 PWM 驱动舵机。通过按键输入控制,输出以 PWM 信号调整舵机转动角度,从而实现对舵机的精准控制。

目录

一、接线图

二、相关参数的计算

三、相关代码的编写

四、程序现象


一、接线图

二、相关参数的计算

PWM频率:Freq = CK_PSC / (PSC + 1) / (ARR + 1)

                     Freq =72M/(PSC + 1) / (ARR + 1)=1/20(ms)=50Hz

周期20ms ARR设为20K  那么PSC设置为72M。

PWM占空比:  Duty = CCR / (ARR + 1) 

那我们就可以通过设置CCR的值来改变舵机的角度。

 

三、相关代码的编写

void PWM_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_InternalClockConfig(TIM2);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;		//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);TIM_OCInitTypeDef TIM_OCInitStructure;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;		//CCRTIM_OC2Init(TIM2, &TIM_OCInitStructure);TIM_Cmd(TIM2, ENABLE);
}
void PWM_SetCompare2(uint16_t Compare)
{TIM_SetCompare2(TIM2, Compare);
}
void Servo_Init(void)
{PWM_Init();
}void Servo_SetAngle(float Angle)
{PWM_SetCompare2(Angle / 180 * 2000 + 500);
}
int main(void)
{OLED_Init();Servo_Init();Key_Init();OLED_ShowString(1, 1, "Angle:");while (1){KeyNum = Key_GetNum();if (KeyNum == 1){Angle += 30;if (Angle > 180){Angle = 0;}}Servo_SetAngle(Angle);OLED_ShowNum(1, 7, Angle, 3);}
}

 void PWM_Init(void),根据前面几章配置。

TIM_OCInitStructure.TIM_Pulse = 0;        //CCR,初始化为0,后面通过void PWM_SetCompare2(uint16_t Compare)来改变。

void Servo_SetAngle(float Angle)封装了一个函数,也可以不封装。

 

四、程序现象

 没按下一次按钮,舵机都会转动30°,要是超过最大限度180°,就归0.

 At the end of this article, applaud yourself again!!

 


http://www.hkcw.cn/article/vfGHOErkyK.shtml

相关文章

C语言指针完全指南:从入门到精通(上)

目录 一、内存和指针 1.1 指针的使用场景 二、指针变量和地址 2.1 取地址符(&) 2.2指针变量和解引用操作符(*) 2.2.1 指针变量 2.3 指针变量的大小 三、指针变量类型的意义 3.2 指针-整数 ​编辑 四、指针计算 五、const修饰指针 5.1 const修饰变量 1.2 const修饰…

Kafka数据怎么保障不丢失

在分布式消息系统中,数据不丢失是核心可靠性需求之一。Apache Kafka 通过生产者配置、副本机制、持久化策略、消费者偏移量管理等多层机制保障数据可靠性。以下从不同维度解析 Kafka 数据不丢失的核心策略,并附示意图辅助理解。 一、生产者端&#xff1a…

Win10秘笈:两种方式修改网卡物理地址(MAC)

Win10秘笈:两种方式修改网卡物理地址(MAC) 在修改之前,可以先确定一下要修改的网卡MAC地址,查询方法有很多种,比如: 1、在设置→网络和Internet→WLAN/以太网,如下图所示。 2、在控…

Angularjs-Hello

1 关于Angularjs 最近因为项目需要又要做这个,所以简单复习下。其实这个大概7,8年前就用过,当时做了几个简单页面觉得太简单就还是回去做嵌入式了。按照互联网技术的进化速度,本来以为早死在 沙滩上了,没想到现在还在坚…

红外遥控(外部中断)

目录 1.红外遥控简介 通信方式: 红外LED波长: 通信协议标准: 2.硬件电路 发送部分1: 内部元件介绍: 工作原理: 为什么要以38KHZ亮灭? 电路图: 发送部分2: 电…

leetcode hot100刷题日记——33.二叉树的层序遍历

解题总结二维vector的初始化方法 题目描述情况1:不确定行数和列数情况2:已知行数和列数情况3:已知行数但不知道列数情况4:已知列数但不知道行数 题目描述 解答:用队列 思路都差不多,我觉得对于我自己来说&a…

GitToolBox 插件安装与配置指南

GitToolBox 插件安装与配置指南 GitToolBox GitToolBox IntelliJ plugin 项目地址: https://gitcode.com/gh_mirrors/gi/GitToolBox 1. 项目基础介绍和主要编程语言 项目基础介绍 GitToolBox 是一个专为 JetBrains 家族 IDE(如 IntelliJ IDEA、PyCharm 等&…

开源模型应用落地-qwen模型小试-Qwen3-8B-推理加速-vLLM-结构化输出(三)

一、前言 在人工智能技术迅猛发展的今天,高效推理框架与强大语言模型的结合正不断突破应用边界。vLLM作为新一代高性能推理引擎,凭借其创新的PagedAttention技术和内存优化能力,为大规模语言模型部署提供了全新可能。 本文将聚焦vLLM框架与QWen3-8B这一国产开源大模型的深度…

史上最全 Git 图文教程(非常详细)零基础入门到精通,收藏这一篇就够了

戳上方蓝字“Java知音”关注我 Git安装 安装 1.先去官网下载这个软件, 准备安装到本电脑中 https://git-scm.com/ 2.根据自己电脑系统下载此软件到本机 Windows 系统直接下载 .exe 文件即可,macOS 系统使用 Homebrew 命令行安装,终端输入 git --versi…

GitHub学生认证申请

想要免费使用Copilot,申请学生认证可以免费使用。在申请过程中,踩了些坑。记录一下供大家参考 认证有效期 默认时长:首次认证成功后,学生权益(如 GitHub Pro 权限和 Student Developer Pack)的有效期一般为…

最新Spring Security实战教程(十五)快速集成 GitHub 与 Gitee 的社交登录

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…

Vue3 开源UI 框架推荐 (总有一款适合你)

一 、前言 💥这篇文章主要推荐了支持 Vue3 的开源 UI 框架,包括 web 端和移动端的多个框架,如 Element-Plus、Ant Design Vue 等 web 端框架,以及 Vant、NutUI 等移动端框架,并分别介绍了它们的特性和资源地址。&#…

Java 版 Manus 实现来了,Spring AI Alibaba 发布开源 OpenManus 实现

大家好,我是玄姐。 此次官方发布的 Spring AI Alibaba OpenManus 实现,涵盖了完整的多智能体任务规划、思考与执行流程。这一版本专为 Java 开发者设计,能够让开发者亲身体验多智能体协同工作的强大效果。它具备根据用户问题进行深度分析、操…

Linux之基础开发工具二(makefile,git,gdb)

目录 一、自动化构建-make/makefile 1.1、背景 1.2、基本使用 1.3、推导过程 1.4、语法拓展 二、进度条小程序 2.1、回车与换行 2.2、行缓冲区 2.3、练手-倒计时程序 2.4、进度条程序 三、版本控制器-Git 3.1、版本控制器 3.2、gitee的使用 3.2.1、如何创建仓库 …

如何使用gitee进行代码管理(常见的两种私人令牌-HTTPS和公钥SSH)

Getee平台提供了四种方式管理代码,如下图所示: 一、使用私人令牌(HTTPS)管理代码 优点:账户下所有项目都可以操作,并且使用快捷,过程简单,可以选择令牌的权限范围,HTTPS…

@PathVariable注解-补充

这段代码是 Spring MVC 框架中使用 RESTful 风格的请求处理方法,详细解释其功能和注解: 代码功能概述 这段 Java 代码定义了一个 Spring MVC 控制器方法,用于处理 RESTful 风格的 URL 请求。它可以从 URL 路径中提取参数,并将这…

Canvas实例篇:十二星座之天秤座

Canvas实例篇:十二星座之天秤座 前言效果预览代码实现代码说明星座特定星 结语 前言 星座总给人浪漫而神秘的感觉,如何用代码还原星空中的浪漫?本文将通过 Canvas 技术,讲述如何实现一个可交互的天秤座星空图,包含星星…

VIP》》IP地址漂移

IP地址漂移,就是一个虚拟的IP地址,能够在不同的物理服务器或网络接口之家来回转换,所以当你或者其他的网络设备跟这个虚拟IP地址连接的时候,并不会察觉到设备的转换。这对于网络流量调度,服务器负载均衡的使用意义重大…

【C语言】讲解 程序分配的区域(新手)

目录 代码区 数据区 堆区 栈区 常量区 重点比较一下堆区与 栈区 总结: 前言: C语言程序的内存分配区域是理解其运行机制的重要部分。根据提供的多条证据,我们可以总结出C语言程序在运行时主要涉及以下五个关键内存区域: 代…

时间序列预测入门喂饭教程,python代码示例

目录 前言一、基本原理1、啥是时间序列?2、预测前的准备什么材料?3、搭建你的预测工具(模型) 二、建模模拟实战:用Python搭个简单模型**Step 1:先把需要的工具库准备好****Step 2:生成一组模拟的…