一般来说,一个定时器输出4路频率相同、占空比不同的PWM波是比较容易的,使用PWM模式即可实现。如果说是输出4路频率不同、占空比不同的PWM就没有现成的模式,是不是无法实现了呢?答案肯定是“不”,只要肯思考就肯定有解决方案(计算机是人类发明的,我们所能遇到的大部分问题是可以通过我们的智慧去解决的,这也就是“只要思想不滑坡,方法总比困难多”)。那么问题来了,怎么实现?我们知道一个定时器只有一个ARR,而ARR寄存器又决定了频率,这就意味着只能有一个频率,但这是有前提的那就是使用定时器自带的PWM模式。只要我们能自己控制引脚电平的变化,就可以实现4路不同频率、占空比的PWM输出,怎么才能做到呢?没错!就是输出比较模式(翻转模式),下面将介绍通过输出比较模式实现的方法:

1、配置定时器的输出比较通道



输出比较模式配置为翻转,输出极性为高电平(个人认为在翻转模式下输出极性似乎没有作用,当然也有可能是自己知识不够不能理解它的作用)。还有一点很重要,就是要禁用预加载寄存器,至于为什么我们来看一下参考手册上的一段话:



也就是说,如果使能了预装载寄存器,那么CCRx的值只能在发生更新事件时被修改(从影子寄存器中加载),而我们需要的是在任意时刻都可以对CCRx进行更改以达到我们所需要的波形,所以要禁用预装载寄存器。

2、占空比和频率的设置



这是四路PWM波的频率和占空比(72MHZ主频,定时器2在72分频条件下),这里我们也可以封装出相应的函数来进行占空比和频率的设置。

3、输出比较中断处理



下面将以通道1为例进行说明,首先是获取计数器的值,这里用的是TIM_GetCapture()函数,其实其内部就是读取CNT寄存器的值,然后就是根据cc1_flag来设置下次比较触发的值,即分别设置高电平时间和低电平时间,如下图所示:



其中,val1、val2、val3均为TIM_GetCapture的捕获值。

输出引脚极性设置新发现:

1、输出设置高电平有效时,程序按照预期的一样输出PWM波

2、输出设置为低电平有效时,输出的是和预期互补的PWM波

推测:输出极性决定了初始状态下引脚的电平,配置为高电平有效时,引脚初始电平为低电平;配置为低电平有效时,引脚初始电平为高电平。这种区别就会导致翻转设置高低电平相反,产生互补的PWM波。

最终,通过逻辑分析仪抓的波形如下所示:



通过实验,验证了上述推测,在设置输出极性为低电平有效后,将通道1翻转设置条件修改与原来相反,用逻辑分析仪采集波形后发现通道2、3、4均输出互补波形,而通道1输出预期波形,可以判定,输出极性决定了引脚初始状态电平。

4、总结

至此,一个定时器就可以成功输出四路不同频率、占空比的PWM波。实际上核心原理就是根据捕获值(CNT)来设置比较值(CCRx).

STM32一个定时器输出四路不同频率和占空比PWM波的方法的更多相关文章

  1. STM32高级定时器TIM1产生两路互补的PWM波(带死区)

    测试环境:Keil 5.20.0.0 STM32F103RBT6 固件库版本:STM32F10x_StdPeriph_Lib_V3.5.0(2011) 本文使用TIM1的通道1,通道2,产生两路1kh ...

  2. STM32 一个定时器产生4路 独立调频率,占中比可调,脉冲个数可以统计。

    实现这个功能,基本原理是利用STM32 的输出比较功能. 1.其它设置就是普通定时器的设置这里开启,四个输出比较中断,和一个更新中断, 更新中断这里不需要开也可以达到目的,我这里开启是做其它的用处的. ...

  3. STM32F103定时器输出PWM波控制直流电机

    这个暑假没有回家,在学校准备九月份的电子设计竞赛.今天想给大家分享一下STM32高级定时器输出PWM波驱动直流电机的问题.. 要想用定时器输出的PWM控制直流电机,,首先要理解“通道”的概念..一个定 ...

  4. STM32定时器输出PWM频率和步进电机控制速度计算

    1.STM32F4系列定时器输出PWM频率计算 第一步,了解定时器的时钟多少: 我们知道AHP总线是168Mhz的频率,而APB1和APB2都是挂在AHP总线上的. (1)高级定时器timer1, t ...

  5. Keil MDK STM32系列(八) STM32F4基于HAL的PWM和定时器输出音频

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  6. 【转】STM32定时器输出比较模式中的疑惑

    OCx与OCxREF和CCxP之间的关系 初学STM32,我这个地方卡了很久,现在终于有些明白了,现在把我的理解写下与大家共享,如果有不对的地方,还请指出. OCxREF就是一个参考信号,并且约定: ...

  7. STM32中的PWM的频率和占空比的设置

    转于http://blog.csdn.net/liming0931/article/details/8491468 下面的这个是stm32的定时器逻辑图,上来有助于理解:   TIM3的ARR寄存器和 ...

  8. STM32通用定时器(转载)

    STM32的定时器功能很强大,学习起来也很费劲儿. 其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册-}才搞明 ...

  9. Stm32高级定时器(二)

    Stm32高级定时器(二) 1 主从模式:主?从? 谈论主从,可知至少有两个以上的触发或者驱动信号,stm32内部有多个定时器,可以相互之间驱动或者控制. 主模式:定时器使能只受驱动时钟控制或者输出控 ...

  10. Stm32高级定时器(一)

    Stm32高级定时器(一) 1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波 ...

随机推荐

  1. 【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小

    问题描述 在前两篇文章中,创建了Disk + PV + PVC + POD 方案后,并且进入POD中增加文件. [Azure K8S | AKS]在AKS集群中创建 PVC(PersistentVol ...

  2. Web开发框架 WebBuilder 9 发布

    WebBuilder 是一款强大,全面和高效的Web开发框架 .基于浏览器的集成开发环境,智能化的设计,能轻松完成常规桌面应用和面向手机等的移动应用开发.高效.稳定和可扩展的特点,适合复杂企业级应用的 ...

  3. Java单元测试及常用语句

    1 前言 编写Java单元测试用例,即把一段复杂的代码拆解成一系列简单的单元测试用例,并且无需启动服务,在短时间内测试代码中的处理逻辑.写好Java单元测试用例,其实就是把"复杂问题简单化, ...

  4. 使用 Sealos 在离线环境中光速安装 K8s 集群

    作者:尹珉.Sealos 开源社区 Ambassador,云原生爱好者. 当容器化交付遇上离线环境 在当今快节奏的软件交付环境中,容器化交付已经成为许多企业选择的首选技术手段.在可以访问公网的环境下, ...

  5. Socket.io入门

    Socket.io入门 根据官方文档socket.io使用必须客户端根服务端一致,socket.io不兼容webSocket或者其他模块,因为socket.io在连接时做了自定义处理, 所以不同的长连 ...

  6. .NET开源最全的第三方登录整合库 - CollectiveOAuth

    前言 我相信很多同学都对接过各种各样的第三方平台的登录授权获取用户信息(如:微信登录.支付宝登录.GitHub登录等等).今天给大家推荐一个.NET开源最全的第三方登录整合库:CollectiveOA ...

  7. dedebiz 清理冗余废弃未引用图片方法

    原理描述: 在原有织梦后台菜单中增加"清理冗余图片按钮",实现清理冗余图片的功能. 操作步骤: 1. 打开后台admin\sys_sql_query.php代码 在该文件中搜索如下 ...

  8. [CISCN 2019华东南]Web11

    看到下面connection 里面的内容有一点像抓包出来的 就抓包试试 似乎感觉也没有什么用 看到这个东西,那么就想到改IP 添加X-Forwarded-For:127.0.0.1 发现这个IP随着我 ...

  9. 由mysql转为oracle注意事项

    1. text类型->nclob 2. 表名是关键字   引号 3. 字段名是关键字 引号 4. 日期型和mysql不同,hh24:mi:ss  就是HH:mm:ss,库里存日期型也可以(查询时 ...

  10. Android Studio3.2.1升级刨坑记录

    Android Studio出了3.2.1,我用的是2.3,所有决定升级一下,看看如何 为了保险一点,下载了官方的解压版本,也就是说不含sdk,下载android-studio-ide-181.501 ...