STM32的PWM控制4个舵机

2023-11-08

本人虽然接触STM32快半年了,但是最近才开始系统的学习STM32,建议一边学,一边做东西,能够更快的提升自己

我用的定时器是TIM3,所以我会把我出现的问题,分享给大家,希望大佬多多指教!

因为我先进行部分映射,但是控制某个舵机的PB4引脚却没有反应,所以百度了好久…

应该注意的是PB4在单片机复位后,它是作为JTAG引脚来使用的,也就是说,要使用PB4你需要自己将其配置成普通GPIO,GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

配置成普通GPIO后,需要进行部分重映射,GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE);

timer.c

void TIM3_PWM_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//使能定时器3
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); 
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH1->PB4 TIM3_CH2->PB5
 
   //设置该引脚为复用输出模式,输出TIM3 CH2的PWM脉冲波形 GPIOB.5 GPIOB.0 GPIOB.1 GPIOB.4
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_4; //TIM_CH1 TIM_CH2 TIM_CH3 TIM_CH4
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
 
   //初始化TIM3
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	//初始化TIM3 Channe12 PWM模式 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
//	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
//	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
//	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
//	TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
	TIM_OC1Init(TIM3, &TIM_OCInitStructure);//根据T指定的参数初始化TIM3 OC1
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化TIM3 OC2
	TIM_OC3Init(TIM3, &TIM_OCInitStructure);//根据T指定的参数初始化TIM3 OC3
	TIM_OC4Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化TIM3 OC4

	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
	 
	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
//	TIM_CtrlPWMOutputs(TIM3, ENABLE);
	TIM_ARRPreloadConfig(TIM3, ENABLE);
 
}

main.c

int main(void)
 {		
 	u16 led0pwmval=0;
	u8 dir=1;	
	delay_init();	    	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 
	uart_init(115200);	
 	LED_Init();			  
 	TIM3_PWM_Init(199,7199);	 //不分频,PWM=72000000/900=80Khz
   	while(1)
	{
		delay_ms(1000);
		TIM_SetCompare1(TIM3,5);
delay_ms(1000);
		TIM_SetCompare1(TIM3,10);
delay_ms(1000);
		TIM_SetCompare2(TIM3,15);
delay_ms(1000);
		TIM_SetCompare2(TIM3,20);
delay_ms(1000);
		TIM_SetCompare2(TIM3,25);
delay_ms(1000);
		TIM_SetCompare3(TIM3,15);
delay_ms(1000);
		TIM_SetCompare3(TIM3,20);
delay_ms(1000);
		TIM_SetCompare3(TIM3,25);
delay_ms(1000);
		TIM_SetCompare4(TIM3,15);
delay_ms(1000);
		TIM_SetCompare4(TIM3,20);
delay_ms(1000);
		TIM_SetCompare4(TIM3,25);
	}	
 }

STM32重映射引脚

在这里插入图片描述

舵机1先转,再是舵机2,然后舵机3,最后舵机4

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32的PWM控制4个舵机 的相关文章

  • 处理器指令周期执行时间

    我的猜测是 no operation 内在 ARM 指令应花费 1 168 MHz 来执行 前提是每个NOP在一个时钟周期内执行 我想通过文档验证这一点 有关处理器指令周期执行时间的信息是否有标准位置 我试图确定 STM32f407IGh6
  • 初始化 ST-Link 设备时出错 - 无法连接到设备

    我目前正在使用 ST Link 调试器对我的 STM32F3 Discovery 板进行编程 我使用的IDE是Atollic TrueStudio 5 5 2 现在我面临一个非常奇怪的问题 那就是我不断收到消息 初始化 ST Link 设备
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板

随机推荐

  • Android 返回键方法

    1 都是按下返回鍵触发 调用父类方法会直接关闭调当前activity 2 先后调用顺序onKeyDown gt onBackPressed 3 dispatchKeyEvent优先级最高 且上面两个方法不会调用 Override publi
  • 360+ChatGLM联手研发中国版“微软+OpenAI”

    文章目录 人工智能福利文章 前言 360与智谱AI强强联合 什么是智谱AI 360智脑 360GLM与360GPT大模型战略布局 写在最后 创作者 全栈弄潮儿 个人主页 全栈弄潮儿的个人主页 个人社区 欢迎你的加入 全栈弄潮儿的个人社区 专
  • postgresql后端数据统计函数

    后端统计函数 函数 返回类型 描述 pg stat get backend idset int 设置当前活动的后端ID号 pg stat get backend activity interger text 后端最近查询文本 pg stat
  • html如何建立连接,HTML中如何使用JavaScript创建链接?

    给定一个HTML文档 如何使用JavaScript创建链接 并将其添加到文档中 下面本篇文章就来给大家介绍一下在HTML中使用JavaScript创建链接的方法 希望对大家有所帮助 image 做法 创建一个锚元素 创建一个文本节点 其中包
  • vite pwa项目使用

    pwa介绍 PWA Progressive Web App 就是一种网页应用 可以离线使用 变成独立应用安装到系统中 渐进式网页应用 是一种基于网页的应用 但它和传统的Web App有些不同 以下是不同点 离线 轻量 离线可用 跟普通的网页
  • java中的跳转_Java中程序跳转关键字详解

    Java中的goto是保留字 目前不能使用 虽然没有goto语句可以增强程序的安全性 但是也带来很多不便 比如说 我想在某个循环知道到某一步的时候就结束 现在就做不了这件事情 为了弥补这个缺陷 Java就提供了break continue和
  • java.lang.NoClassDefFoundError: Could not initialize class xxx 原因及解决方法

    NoClassDefFoundError产生的原因有好几种 这里记录静态变量或静态块引起的 具体抛出的异常类似 java lang NoClassDefFoundError Could not initialize class xxx JV
  • 将C++数字类型转换成字符串

    include
  • SpringBoot2.x 集成 AntiSamy 防御XSS攻击

    AntiSamy是OWASP的一个开源项目 通过对用户输入的HTML CSS JavaScript等内容进行检验和清理 确保输入符合应用规范 AntiSamy被广泛应用于Web服务对存储型和反射型XSS的防御中 XSS攻击全称为跨站脚本攻击
  • SourceTree如何修改账号密码

    修改SourceTree账号或密码 修改账号 找到 C Users Administrator AppData Local Atlassian SourceTree 中的 userhosts 文件 删除其中要修改的账户 返回SourceTr
  • MySQL WHERE语句筛选操作符

    使用SELECT语句但不使用WHERE子句在表中查询数据 则会获取表中的所有行记录 这些行记录中大部分是不想要的行记录 WHERE子句允许根据指定的过滤表达式或条件来指定要选择的行 1 等于 等于 几乎任何数据类型都可以使用它 2 lt g
  • 小程序坑录-wx.getLocation接口申请

    最近在用uni app通用框架做h5和小程序 结果在小程序审核的时候 又遇到了很多天坑 故记录之 从2022 年 7 月 14 日开始 使用位置接口 就必须在app json中进行声明了 除此之外 在正式使用时 还需要在开发管理 接口权限内
  • 期货开户关于基本面量化

    一 库存 供求矛盾看库存 东西没有了 缺了 就会涨价 不缺 一般不会涨 所以 一定要注意库存 去库存快的品种 特别是库存低 价格低的品种 要重点关注 库存有一点要特别注意 要是 有效去库存 通过降价让下游买货 这种 去库存 不是根本 因为库
  • Leetcode:链表刷题(7道经典题目)

    Leetcode 链表刷题 7道经典题目 本文带来的是以链表为主题的一些经典题目 203 移除链表元素 707 设计链表 206 反转链表 24 两两交换链表中的节点 19 删除链表的倒数第 N 个结点 面试题 02 07 链表相交 142
  • Redis设置失效时间

    Redis设置失效时间还有nx和nxx 通过设置失效时间 可以将到达规定时间对应的key和value进行删除 设置失效时间的两种方式 1 在设值的时候设置失效时间 set code test ex px 秒 毫秒 时间 数值 set cod
  • 深度学习 FairMOT多目标跟踪(PANDA)

    FairMOT 复赛期间对于多目标跟踪任务使用的baseline 本质属于联合学习检测和嵌入模型 Joint Detection and Embedding JDE 毕设项目演示地址 链接 毕业项目设计代做项目方向涵盖 目标检测 语义分割
  • 关于航模的几点积累(四)关于螺旋桨

    关于固定翼飞行器的螺旋桨 1 螺旋桨的几种类型 按材质 塑料 木质 碳纤维 玻璃纤维 尼龙等 按桨叶数量 单叶桨 双叶桨 三叶桨等 按固定方式 快拆桨 大孔桨 适配子弹头 小孔桨 适配螺旋桨保护器 这几种螺旋桨之间的对比分析 2 螺旋桨的重
  • 计算机软件工程操作系统期末复习题

    1 计算机操作系统的功能是 D A 把源程序代码转换为目标代码 B 实现计算机用户之间的相互交流 C 完成计算机硬件与软件之间的转换 D 控制 管理计算机系统的资源和程序的执行 在现代计算机系统中 用户用高级语言编写的源程序必须通过编译程序
  • Elasticsearch Head的使用

    目录 概述 一 安装 Elasticsearch Head 二 解压文件 三 安装Elasticsearch Head依赖 四 启动 Elasticsearch Head 五 修改Elasticsearch Head启动端口号 六 使用 E
  • STM32的PWM控制4个舵机

    本人虽然接触STM32快半年了 但是最近才开始系统的学习STM32 建议一边学 一边做东西 能够更快的提升自己 我用的定时器是TIM3 所以我会把我出现的问题 分享给大家 希望大佬多多指教 因为我先进行部分映射 但是控制某个舵机的PB4引脚