STM32F7同一定时器多路输出PWM波通道之间相互影响问题

2023-05-16

--------------------------2020/8/12更新--------------------------------
这次用Cube直接生成PWM控制代码,然后再RT-Thread Studio上编写程序,发现可实现TIM1和TIM8的8路PWM波调控,因此上面论述的问题可能是自己在写底层时有某些因素忽略了,以下仅供参考。

--------------------------原文--------------------------------
用这篇博客记录一下我折腾了三天换来的惨痛踩坑经历,事先声明,以下内容仅供参考,如果有大佬知道是什么原因欢迎在评论区指正。

先说结论:本次踩坑经历发现F7开发板(至少是我买的这块)在配置同一定时器多路PWM波输出的时候,各个通道之间存在相互影响,具体表现为TIM3和TIM4两个定时器的CH1和CH2,CH3和CH4之间并不相互独立。具体描述见后续。

初始情况

为了节省STM32的资源,博主原本打算用同一个定时器的四个通道来输出多路PWM波实现对多个电调的控制。用的正点原子的F7的开发板,原本打算的是选用TIM3和TIM4,总共八个通道实现八路PWM波输出,然后通过串口发送指令修改PWM波的占空比。

参考资料为官方手册
串口通信控制参考这篇博文:STM32407串口控制PWM占空比和频率
电调控制参考我上一篇博文:STM32通过PWM控制ESC30C电调

初始化配置TIM3和TIM4八通道共同输出PWM,周期20ms,初始脉宽1.5ms。

问题出现

首先是在程序下载之后再实物上进行测试,开始电调解锁之后用串口发送1.7ms脉宽进行调速,完成控制,但是在给定1.1ms之后却停转了,本以为是遇到死区了,然后重新发送1.3ms指令,仍然没动静。然后接上示波器观察引脚输出波形,惊讶的发现当串口发送指令的时候在1.5ms以上范围内是可以进行脉宽自由调节的,但是在小于1.5ms脉宽时却不会发生改变,最小变化至1.5ms(我在程序中PWM初始化时是随机给定脉宽,而后再用TIM->CCRx配置寄存器修改初始化脉宽为1.5ms,上一篇博文说过这是为了解锁电调)。

为了让文章内容更充实,示意性给上自己脉宽修改的程序

//设置TIM3通道的占空比
//compare:比较值
void TIM3_SetChannelCompare(u8 channel, u32 compare)
{
	switch(channel)		//配置各个通道的CCRx寄存器值
	{
		case 1:
			TIM3->CCR1 = compare;
			break;
		case 2:
			TIM3->CCR2 = compare;
			break;
		case 3:
			TIM3->CCR3 = compare;
			break;
		case 4:
			TIM3->CCR4 = compare;
			break;
	}
}

这边是串口控制程序,注意一下这边仅配置了TIM3各通道的串口控制

/*****
串口指令控制PWM波输出函数
初始高电平占空比已设置为中位信号1.5ms,对应于15
通过修改占空比来实现电调调速功能,范围11~19
后续配置指令如下(目前仅配置TIM3通道):
输入指令CHx XX E,其中x表示通道,XX表示占空比时间,E表示结束
*****/
void USART1_PWM(void)
{
	u16 len;
	u8 ch, time;
	u8 flag = 0;
	
	if(USART_RX_STA & 0x8000)
	{
		len = USART_RX_STA & 0x3fff;
		
		if(USART_RX_BUF[len-1]=='E')
		{
			if(USART_RX_BUF[0]=='C' & USART_RX_BUF[1]=='H' & USART_RX_BUF[3]==' ' & len==8)
			{
				ch = (USART_RX_BUF[2]-48);
				time = 10*(USART_RX_BUF[4]-48) + (USART_RX_BUF[5]-48);		//字符'0'对应的ASC码是48,因此为了得到正确的数字需减去48
				printf("ch = %d, time = %d\r\n", ch, time);
				if(ch<5 & ch>0)
				{
					//TIM4_SetChannelCompare(ch, time);
					TIM3_SetChannelCompare(ch, time);
					printf("pwm占空比已修改为%d\r\n", time);
					flag = 0;
				}
				else flag = 1;
			}
			else flag = 1;
		}
		else flag = 1;
		
		if(flag==1)
		{
			flag=0;
			printf("指令无效,请重新输入\r\n");
		}
		
		USART_RX_STA = 0;
	}
}

问题解决过程

以下是我解决的思路以及过程,如果大家遇到问题了,可以尝试照着这个思路先自己试着解决一下。

① 怀疑过是自己修改CCRx值的方式的问题,于是参照正点原子给的方式,单独对通道进行配置。

//设置TIM通道1的占空比
//compare:比较值
void TIM_SetTIM3Compare1(u32 compare)
{
	TIM3->CCR1 = compare;
}

但是很明显确实不是函数的问题,就算是直接在main中修改寄存器CCRx的值也没有任何变化。

② 然后考虑是串口通信影响了,就是先关闭在main中使用 USART1_PWM() 函数,不使用串口修改占空比,而是直接在程序中修改占空比。在测试之后发现问题仍然存在。

③ 最后是单独调试一个定时器,我首先把其他3路的PWM波都给关闭了,仅剩下一条通道输出,此时关键来了!发现在这种情况下是可以通过串口进行控制的,也可以在程序内部直接进行修改,也就是说可以在1.5ms以下进行调节。

④ 但是在多次测试之后我始终搞不懂为什么会这样子。于是开始进行求助(毕竟要自己先尝试过,知道自己的具体问题,不然求助也抓不到重点)。首先是问了周围用过STM32的同志,但是均没有尝试过配置多路PWM输出,然后只能是在网上进行求助,包括但不限于论坛以及各种专业群(这时候就要多叫几声大佬了),但是结果都不甚理想。

⑤ 关键时候还是朋友靠得住,在好友的远程视频协助下,发现这是一个玄学问题, 在调试模式下测试在串口发送指令时,观察到尽管测试的CH1通道脉宽始终不能降低至1.5ms以下,但是观察到内部的CCR1寄存器的值确实是改变了的,于是多番讨论之后,确定这是一个玄学问题, 又观察到当通道1的脉宽改变了之后,也会影响到通道2的脉宽,讨论至深夜依然无果。

问题解决

早上起来突发奇想,如果CH1和CH2之间是会相互影响的话,那么CH3和CH4呢?然后一顿操作之后惊奇地发现:CH1和CH2之间是相互影响的,CH3和CH4之间也是相互影响。

具体表现为,当你在使用SetCompare这种方式初始化配置完同一个定时器的四个通道的时候(假定均为1.5ms),那么CH1的脉宽变化会受到另一条通道CH2的影响,哪条通道的脉宽较大,那么另一条通道脉宽就不能小于这条通道的脉宽,假定CH2脉宽被配置到了2ms,那么CH1也会跟着变化到2ms,并且只能在≥2ms范围内进行调节。CH3和CH4之间也是如此。然而看了手册,上面明明说是各个通道之间相互独立,不清楚是什么原因,如果有懂的大佬麻烦解答一下。
在这里插入图片描述

结论

以下仅是个人测试所得结论(可能有误),发现同一个定时器下进行多通道PWM波输出时,CH1和CH2之间会相互影响(称为组1),同理CH3和CH4(称为组2)。但是组1和组2之间是互不影响的,也就是说可以使用CH1和CH3/CH4的方式,或CH2和CH3/CH4的方式进行PWM波各自的控制。

当然,也有可能是我自身缘故导致的问题,因此以上内容仅供参考,主要目的是记录一下本次踩坑经历方便给自己后续回顾,也欢迎大佬批评指正。

--------------------------2020/8/12更新--------------------------------
这次用Cube直接生成PWM控制代码,然后再RT-Thread Studio上编写程序,发现可实现TIM1和TIM8的8路PWM波调控,因此上面论述的问题可能是自己在写底层时有某些因素忽略了,仅供参考。

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

STM32F7同一定时器多路输出PWM波通道之间相互影响问题 的相关文章

  • java底层原理

    Java运行三部曲 xff1a 编写 xff0c 编译 xff0c 运行 编写 xff1a 硬件编写代码 xff0c 就是我们写代码 编译 xff1a javac将文件编译成一个或多个 class文件 编译中间的过程主要是类型和格式的检查
  • 信息化时代下的我们----弄潮儿

    读完 信息化与信息管理实践之道 的部分章节想起了 第三次浪潮 中的一段话 xff0c 摘录如下 人类到现在已经经历了两次巨大的变革浪潮 这两次浪潮都淹没了早先的文明和文化 xff0c 都是以前人所不能想象的生活方式 xff0c 替代了原来的
  • ORB-SLAM稠密点云地图构建(黑白+彩色)+ pcd文件以八叉树形式表示

    pcl1 8 1 VTK 7 1 1 版本一定要对好 xff0c 如果安装了不符的版本如我之前安的pcl1 1 3和VTK8 2 一定要卸载干净不然会一直报错 xff0c 不同版本的pcl和vtk是无法共存的 xff0c 并且光把包删除是不
  • 一步步学习多线程(一) 重要概念

    几个重要的概念 1 同步 xff08 synchronous xff09 和 异步 xff08 asynchronous xff09 2 并发 xff08 Concurrency xff09 和 并行 xff08 Parallelism x
  • MAVLink功能开发,移植教程。

    MAVLink功能开发 本文由 智御电子 提供 xff0c 同时提供视频移植教程 xff0c 以便电子爱好者交流学习 1 MAVLink简介 MAVLink是一种针对微型飞行器 xff0c 推出的轻量化 xff0c 仅由头文件信息编码而成的
  • workerman问题总结大全及解决方案

    workerman无法正常访问 问题描述 xff1a 在阿里云ECS上部署了workerman的应用 xff08 ECS是专有网络 xff09 xff0c 在ECS安全组里已经允许workerman需要的全部端口 xff0c 但是外网一直不
  • Eclipse Android开发遇到:"The type org.apache.http.HttpResponse cannot be resolved."问题的解决办法

    今天在做手机卫士的项目中 xff0c 在联网下载的功能模块中遇到The type org apache http HttpResponse cannot be resolved It is indirectly referenced fro
  • UG创建图纸明细表失败的情况

    今天进行UG二次开发的时候 xff0c 由于要在图纸中自动加入零件明细表 xff0c 但是当我在图纸中插入明细表的时候UG会弹出错误对话框 xff1a 当打开UGII UPDATE ALL ID SYMBOLS WITH PLIST变量时
  • 字符串末尾自动加上'\0'的情况

    之前一直都有一个问题困扰着我 xff0c 就是我们知道C风格的字符串在用strlen求长度时只会遇到 39 0 39 结束 xff0c 如果一个字符数组全部填满了 xff0c 而在末尾没有加上 39 0 39 就会出现结果不定的现象 xff
  • c++类成员变量的初始化顺序以及特殊成员的初始化方法规则

    说到类的成员变量的初始化顺序 xff0c 对于初学者很多容易混淆其顺序 xff0c 以为简单的按初始表来初始化 xff0c 其实不然 xff0c 现在我来详细讲解下类的初始化顺序 xff1a 首先由简单开始 xff1a class peop
  • deque 迭代器失效的问题详解

    今天在看STL源码的时候 xff0c 无意写了如下的代码 xff0c 发现程序崩溃了 xff1a lt span style 61 34 font size 14px 34 gt deque lt int gt iterator iter
  • Python中__init__.py文件的作用

    在创建python包的过程中 xff0c IDE都会在包根目录下创建一个 init py文件 xff0c 该Python文件默认是空的 目录结构如下 xff1a Pycharm下的package树结构 xff1a 在Finder中的目录结构
  • 使用Ajax以及CSS+DIV高仿谷歌搜索(附源码下载)

    在使用 Google 搜索或者是 Baidu 搜索的时候 xff0c 在输入搜索关键字的同时 xff0c 会自动弹出匹配的其他关键字的提示 xff0c 全心全意为人民服务的精神在这里崭露无遗 这种利用 Ajax 技术实现输入提示和自动完成的
  • 导致索引失效的可能情况

    如下是可能导致索引失效的情况 xff1a 1 xff0e 隐式转换导致索引失效 这一点应当引起重视 也是开发中经常会犯的错误 由于表的字段tu mdn定义为varchar2 20 但在查询时把该字段作为number类型以where条件传给O
  • 二叉搜索树的增删查

    今天把搜索二叉树的思路又理了一遍 xff0c 把代码又从头到尾敲了一遍 xff0c 各位看客就不要在意代码粗糙和内存溢出了 xff0c 主要把插入和删除的过程理了一遍 xff0c 其中比较复杂的地方就是搜索二叉树的删除 xff0c 涉及了很
  • 中缀表达式转前缀和后缀表达式

    之前笔试中国电信IT研发中心的时候 xff0c 遇到了几个前 中 后缀表达式的相互转换 xff0c 当时忘得差不多了 xff0c 今天好好把该方面的知识好好复习 xff0c 并把相关代码和思路自己缕了一遍 xff1a 将中缀表达式转换为前缀
  • java prometheus 自定义exporter开发,以及实现多个接口返回metrics

    普罗 自定义exporter开发 exporter的作用是采集需要监控的数据 xff0c 并将采集到的数据转换成prometheus所需要的数据格式 xff0c 将这些转换后的数据返回 xff0c 供给prometheus 使用 java
  • 双系统重装Ubuntu经验分享

    真的很喜欢ubuntu 但又没有恒心把它学通透 xff0c 毕竟不是相关专业 第一次重装是因为没多少经验 xff0c 安装qqforlinux的时候多了两个东西 xff0c 还自己生成了快捷方式 xff0c 就想点开看看是啥 xff0c 结
  • 还在迷茫不知Dashboard是什么?答案在文中揭晓

    Dashboard的中文翻译是 仪表盘 xff0c 与汽车的仪表盘相同 一种反映车辆各系统工作状况的装置 xff0c 有车速里程表 转速表 燃油表等 司机可以很方便地从汽车仪表盘中获得汽车整体状况 而Dashboard沿袭了汽车仪表盘理念
  • 问题:UPDATE 失败,因为下列 SET 选项的设置不正确: 'ARITHABORT'。

    解决方案 1 你可以在TSQL前Set ARITHABORT ON 代码如下 Set ARITHABORT ON GO INSERT INTO ta 2 在ADO NET中 你可以这样来写 C 代码 MyConnection Execute

随机推荐

  • 智能制造:三体智能革命

    赵敏 宁振波 郭朝晖是走向智能研究院资深专家 xff0c 三体智能革命 编委会中三位重要作者 他们从去年5月起多次参加了中国工程院主持的 中国智能制造发展战略研究报告 的研讨 评审与修订工作 xff0c 对该报告的形成过程 研究主旨和详细内
  • 小觅相机SDK samples安装Link error: cannot find -lvtkproj4

    Link error cannot find lvtkproj4 error ld returned 1 exit status 找不到相关动态库文件 设置软链接 xff1a ln s usr lib x86 64 linux gnu li
  • 年度回忆录(2011.12----2012.09)

    前几天刚刚参加了提高班十期的开学典礼 xff0c 最近师院的新生也陆 陆续 续的开始报道了 每年到这个时候都会感慨 年年岁岁花相似 xff0c 年年岁岁人不同 啊 对于提高班来说每年都有新的血液注入进来 xff0c 提高班的队伍在不断的扩大
  • python函数(变量,参数)

    函数的变量 1 xff0c 全局变量 定义在最外层的变量 xff0c 对于所有的内函数都能调用 2 xff0c 局部变量 定义在函数内的变量叫做局部变量 xff0c 在函数外是不能访问局部变量 注 xff1a 全局变量不能直接在函数内部进行
  • 程序员读书和练习的方法(个人观点)

    lt 传送门 gt 针对本文的交流探讨 gt 总宗旨 xff1a 打好计算机通用理论基础 通用实战能力 xff0c 便于需要时对各领域的无障碍深钻 时间宝贵 xff0c 不要为了学习而学习 计算机通用理论基础 xff1a 计算机各领域理论基
  • 从零开始的Ubuntu 16.04下PX4编译环境的搭建

    近来入手了一块pixhawk xff0c 想进行一些基于已有代码的二次加工 xff0c 于是到官网https dev px4 io 上看教程 官网上的教程是分为中文 英文以及韩文的版本 很多人肯定第一反应就是看中文的版本 但是这样做弊端真的
  • 驱动程序开发:SPI设备驱动

    目录 Linux下SPI驱动简介SPI架构概述SPI适配器 xff08 控制器 xff09 SPI设备驱动spi driver注册示例SPI 设备和驱动匹配过程编写imc20608六轴传感器SPI驱动设备树编写操作具体的imc20608驱动
  • 操作系统知识点(二)

    文章目录 内存管理程序执行过程内存保护 连续分配非连续分配基本分页存储管理方式基本分段存储管理方式段页式存储管理方式 虚拟内存局部性原理请求分页存储管理 内存管理 内存管理 Memory Management 是操作系统设计中最重要和最复杂
  • VR行业发展的前景和现状?

    标题 VR行业发展的前景和现状 xff1f 1 一个新事物的产生 xff0c 总是伴随着看好和唱衰两种声音 这两种态度自然有其可以理解的地方 xff0c 因为摆在我们面前的是未知 xff0c 而坐在餐桌前的两拨人 xff0c 站在不同的角度
  • 头文件与库的区别

    昨天突然问了一下什么是头文件 xff0c 我一听就傻了 xff0c 虽然上课的时候老师在讲编译的四个过程的时候说了一下 xff0c 但是还是不太理解 xff0c 我们知道编译过程中的预处理阶段会进行头文件展开 xff0c 宏替换以及条件编译
  • 进程、线程

    线程 xff08 thread xff09 线程其实是操作系统能够进行运算调度的最小单位 它是被包含在进程之中的 xff0c 是进程中的实际运作单位 一条线程指的是进程中一个单一顺序的控制流 xff0c 一个进程中可以并发多个线程 xff0
  • 基于Zynq7020双千兆以太网的数字信号处理板设计

    一 背景 背景 Xilinx公司在2010年发布了可扩展的处理器平台Zynq7000系列 xff0c 它采用了28nm工艺 xff0c 将FPGA与ARM cortex A9集成在一颗芯片上 xff0c 实现了高性能 高集成度 低功耗 Zy
  • 深入理解JS中的变量作用域

    在 JS 当中一个变量的作用域 xff08 scope xff09 是程序中定义这个变量的区域 变量分为两类 xff1a 全局 xff08 global xff09 的和局部的 其中全局变量的作用域是全局性的 xff0c 即在 JavaSc
  • 硬件工程师,从零开始无人机开发。

    毕业已经五年了 xff0c 一直在杭州某大厂 xff0c 做无人机硬件开发 无人机这块 xff0c 我进去的时候大厂刚开始 做 xff0c 有幸参与到整个无人机的硬件开发 我这个刚毕业的技术小白 xff0c 在这五年间成长了很多 无奈 今年
  • 个人总结:板球控制系统之串级PID整定方法,速度环与位置环,40S任务10S完成

    其实单环我们先出了所有题目 xff0c 但是效果显然没有串级PID的效果好 xff0c 有人需要的话可以把程序包发出来 xff0c 板球运行视屏也有 另外 xff1a 天下舵机参差不齐 xff08 哪怕型号相同 xff09 xff0c 想要
  • 树莓派3B+踩坑记录:一、安装Ubuntu Mate

    树莓派3B 43 踩坑记录 xff1a 一 安装Ubuntu Mate 树莓派 xff0c Ubuntu xff0c ROS硬件准备软件准备系统烧录安装Ubuntu Mate更换国内源网络配置开启ssh远程其他彩虹屏解决方案XShell和X
  • PointNet代码详解

    PointNet代码详解 最近在做点云深度学习的机器人抓取 xff0c 这篇博客主要是把近期学习PointNet的一些总结的知识点汇总一下 PointNet概述详见以下网址和博客 xff0c 这里也就不再赘述了 三维深度学习之pointne
  • 卡尔曼滤波通俗易懂的解释

    关于卡尔曼滤波 xff0c 网上的资料很多 xff0c 但是有很大一部分都是不断堆叠公式 xff0c 然后用各种晦涩难懂的专业术语进行解释 xff0c 说实话我刚开始看的时候也是云里雾里 xff0c 因此写下这篇博客是为了照顾和我一样的萌新
  • STM32通过PWM控制ESC30C电调

    最近在搞一个水下推进器 xff0c 这东西的控制其实跟四旋翼的螺旋桨控制差不多 但我也是第一次用STM32板子来控制电调驱动桨叶旋转 xff0c 因此踩了很多坑 网上找了很多资料 xff0c 但是很多都写的不是很清楚 xff0c 这边稍微记
  • STM32F7同一定时器多路输出PWM波通道之间相互影响问题

    2020 8 12更新 这次用Cube直接生成PWM控制代码 xff0c 然后再RT Thread Studio上编写程序 xff0c 发现可实现TIM1和TIM8的8路PWM波调控 xff0c 因此上面论述的问题可能是自己在写底层时有某些