--------------------------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,因此为了得到正确的数字需减去48printf("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波调控,因此上面论述的问题可能是自己在写底层时有某些因素忽略了,仅供参考。

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

  1. STM32单片机:定时器TIM输出PWM波

    学习32单片机过程中使用的工具:MDK Keil5 + 正点原子精英版(STM32F103ZET6)+ STM32CubeMX + HAL开发 一.PWM的产生原理 关于PWM的产生原理网上有很多教程 ...

  2. 高级定时器TIM1输出PWM波

    高级定时器(TIM1和TIM8)相较于通用定时器,它的函数配置更多,一个都不能少,否则输出不了PWM波,所以在此写下通用定时器和高级定时器PWM波配置的区别,以记录问题. 通用定时器TIM3通道1配置 ...

  3. STM32H743+CubeMX-低功耗定时器LPTIM输出PWM波

    文章目录 一.前言 二.CubeMX 2.1.Clock Configuration 2.2.LPTIM2 Mode and Configuration 2.3.Parameter Settings ...

  4. STM32f103C8定时器输出PWM波信号

    利用stm32高级定时器输出PWM,模拟呼吸灯的效果带刹车功能.由于没有示波器查看输出的pwm波形图,所以本次实验使用普通直流电机模拟的. 本文章为学习笔记,其中有些地方解释的不是那么的好,即本笔记可 ...

  5. STM32CubeMX——LED定时闪烁和输出PWM波

    简介 通过学习STM32CubeMX软件,掌握配置各个部件的基本方法:了解外部中断,定时器中断,PWM波产生等功能的原理,编写程序代码,实现相应的功能. 程序预期结果: LED初始设置间隔2秒闪烁一次 ...

  6. STM32F103 PA8不能输出PWM波问题

    在调试STM32F103单片机输出PWM波时,单独测试PA8和PA11输出PWM波(也就是TIM1_CH1和TIM1_CH4),输出PWM波正常.然后用串口1输出数据时,发现一个问题,串口输出正常,但 ...

  7. 树莓派输出pwm波c语言,02树莓派4B—C语言编程——PWM

    01树莓派直接输出PWM波 -- 硬件PWM程序  (推荐使用) #include #include #include //必不可少 int main( void) { int pwm_gpio5 = ...

  8. 使用STM8S003定时器的PWM功能输出PWM波

    一.使用定时器TIM2的CH1.CH2.CH3通道PWM输出 1. 在使用stm8s系列的单片机的时候,使用的头文件大部分都是通用的stm8s.,第一步修改头文件: /* Uncomment the ...

  9. 通用定时器输出PWM波实现呼吸灯

    STM32F1系列含有8个定时器,分为基本定时器,通用定时器和高级定时器.基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部IO.通用定时器 TIM2/3/ ...

最新文章

  1. 朱峰谈概念设计(八):电影中的概念设计
  2. ttc error oracle,ORA-03137: TTC protocol internal error : [12333]错误一例
  3. 万物皆可傅里叶!用傅里叶变换还能画出世界名画!
  4. html把图片定位在盒子中心,html – CSS在图像的右上角定位一个图标
  5. 云服务器 ECS > 安全 > 安全组 > 添加安全组规则
  6. 顺应大数据时代创新社会治理模式
  7. 暗黑的字符串---递推公式
  8. scanner读取带空格字符串_Scanner类提供了输入字符出的方法,下面哪个方法可以实现字符串的输入且该串可以含有空格()。-智慧树JAVA程序设计(山东联盟-山东农业大学)章节答案...
  9. 烽火超微信息科技 服务器,智算升级 烽火超微发布新一代V6服务器
  10. 单GPU实现20Hz决策,最新基于序列生成模型的高效轨迹规划方法
  11. windows xp系统安装教程
  12. python四则运算完整代码_2/20Python之四则运算
  13. [原创]服装鞋帽企业配送中心优化方案 WMS仓储管理系统
  14. AIGC席卷,抖快、阅文、知乎大战网文圈
  15. 如何开展性能测试工作
  16. 3乘3魔方第四步_3乘3魔方的解法都有哪些?(讲具体点,怎么具体呢?有公式步骤吧!)?...
  17. 讲讲React中的State和Props
  18. multisim中轻触开关在哪_轻触开关和自锁开关的主要区别在哪里?
  19. 帝国php调用文章列表,帝国CMS模板中:使用php调用最新文章的代码(非灵动和万能标签)...
  20. HCIP网络配置(MGRE+OSPF+优化)

热门文章

  1. c语言年历显示思路,c语言程序设计年历显示要素.doc
  2. 关于基于模型的设计(MBD)一些概念和理解
  3. 【解决】小米/红米手机 Miui内测版/公测版系统申请通过后没有手动选择安装包按钮
  4. [译] 如何阅读 RFC 文档
  5. Windows无法启动这个硬件设备(代码19)怎么办?
  6. android 内存优化详解
  7. 建议收藏,7个国内「小众」的程序员社区
  8. 网吧新点金石:锐捷网吧网络解决方案(转)
  9. 机器人迷城手机版_机械迷城安卓版|机械迷城下载v2.0.21-乐游网安卓下载
  10. linux配置浮动IP