一般来说,一个定时器输出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. [minio]挂载minio到本地

    前言 将minio的bucket挂载到本地文件系统 环境 客户端系统版本:centos 7 MinIO节点IP:192.168.0.20 s3fs方式步骤 安装s3fs客户端(可能需要先安装epel- ...

  2. 「AntV」x6 框选添加右键菜单

    今天在群里有个小伙伴提出了这么个问题:如何在框选完成后给框选的区域添加一个右键菜单的功能,我看到了这个问题后也是有点懵,心里想着怎么还有这个需求,直接快捷键删除不是更好吗,谁知这位小伙伴也是这么写的, ...

  3. Jmeter关联之正则表达式提取器

    正则表达式简介 摘自网上的说法,正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"))操作的一种 逻辑公式,就是用事先定义好的一些特定字符 ...

  4. Ascend C保姆级教程:我的第一份Ascend C代码

    本文分享自华为云社区<Ascend C保姆级教程:我的第一份Ascend C代码>,作者:昇腾CANN . Ascend C是昇腾AI异构计算架构CANN针对算子开发场景推出的编程语言,原 ...

  5. API接口的对接流程和注意事项

    ​ API接口的对接流程和注意事项 随着互联网技术的发展和数字化时代的到来,API接口已经成为应用程序之间进行数据交换和通信的重要方式.API即应用程序接口,是一种定义.调用和交互的规范,使得不同应用 ...

  6. 如何通过API接口获取淘宝的店铺所有商品详情

    在电子商务领域中,淘宝是亚洲最大的在线交易平台之一,拥有海量的商品资源和消费者.如果你是一名开发者,想要在自己的网站或者APP中嵌入淘宝商品资源,那么你就需要通过淘宝开放平台提供的API接口来获取这些 ...

  7. 记录一个令人崩溃的tomcat闪退问题

    tomcat启动时要加载server.xml文件,xml文件中的注释符要一一对应不能多不能少. 比如 这就是错的 只有这样 才是对的 呜呜呜~~~

  8. 浅谈Code Review

    1. 什么是Code Review Code Review(CR)即代码评审,又名代码走查,是指对软件开发过程中编写的代码进行检查和评估的一种实践.它通常由其他团队成员.同事或专门的质量保证团队成员来 ...

  9. SpringBoot项目优雅停机+Pid暴力停机

    bootstrap.yaml配置项目的pid输出位置 spring: pid: file: F:/cloud-nacos/cloud_gateway/application.pid springboo ...

  10. Springboot支持XML格式报文的传输

    导入依赖-jackson-dataformat-xml <!--整合web模块--> <dependency> <groupId>org.springframewo ...