STM32一个定时器输出四路不同频率和占空比PWM波的方法
一般来说,一个定时器输出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波的方法的更多相关文章
- STM32高级定时器TIM1产生两路互补的PWM波(带死区)
测试环境:Keil 5.20.0.0 STM32F103RBT6 固件库版本:STM32F10x_StdPeriph_Lib_V3.5.0(2011) 本文使用TIM1的通道1,通道2,产生两路1kh ...
- STM32 一个定时器产生4路 独立调频率,占中比可调,脉冲个数可以统计。
实现这个功能,基本原理是利用STM32 的输出比较功能. 1.其它设置就是普通定时器的设置这里开启,四个输出比较中断,和一个更新中断, 更新中断这里不需要开也可以达到目的,我这里开启是做其它的用处的. ...
- STM32F103定时器输出PWM波控制直流电机
这个暑假没有回家,在学校准备九月份的电子设计竞赛.今天想给大家分享一下STM32高级定时器输出PWM波驱动直流电机的问题.. 要想用定时器输出的PWM控制直流电机,,首先要理解“通道”的概念..一个定 ...
- STM32定时器输出PWM频率和步进电机控制速度计算
1.STM32F4系列定时器输出PWM频率计算 第一步,了解定时器的时钟多少: 我们知道AHP总线是168Mhz的频率,而APB1和APB2都是挂在AHP总线上的. (1)高级定时器timer1, t ...
- Keil MDK STM32系列(八) STM32F4基于HAL的PWM和定时器输出音频
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- 【转】STM32定时器输出比较模式中的疑惑
OCx与OCxREF和CCxP之间的关系 初学STM32,我这个地方卡了很久,现在终于有些明白了,现在把我的理解写下与大家共享,如果有不对的地方,还请指出. OCxREF就是一个参考信号,并且约定: ...
- STM32中的PWM的频率和占空比的设置
转于http://blog.csdn.net/liming0931/article/details/8491468 下面的这个是stm32的定时器逻辑图,上来有助于理解: TIM3的ARR寄存器和 ...
- STM32通用定时器(转载)
STM32的定时器功能很强大,学习起来也很费劲儿. 其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册-}才搞明 ...
- Stm32高级定时器(二)
Stm32高级定时器(二) 1 主从模式:主?从? 谈论主从,可知至少有两个以上的触发或者驱动信号,stm32内部有多个定时器,可以相互之间驱动或者控制. 主模式:定时器使能只受驱动时钟控制或者输出控 ...
- Stm32高级定时器(一)
Stm32高级定时器(一) 1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波 ...
随机推荐
- 【全新重构发布】iNeuOS工业互联网操作系统 V5 版本
iNeuOS工业互联网操作系统历经迭代27个版本,老版本截止更新V4.1版本:历时一年多时间,现在正式发布全新V5版本,V5版本与V4.1老版本不完全兼容. 发布V5版本后,iNeuOS工业互联网操作 ...
- SSM登录操作
1.编写实体类 略 2. 写mapper映射文件 通过名字查询 通过ID主键查询... 略 写dao CRUD相关抽象方法 List<Student> getAll(); Student ...
- 《SQL与数据库基础》11. 索引
目录 索引 概述 结构 B-Tree B+Tree Hash 思考 分类 语法 SQL性能分析 SQL执行频率 慢查询日志 profile详情 explain执行计划 索引失效情况 范围查询 索引列运 ...
- ORM查询一个表中有两个字段相同时,只获取某个值最大的一条
Table表如下: 获取表中name和hex值相同时age最大的那一条 ORM写法,两次查询 ids = table.values('name', 'age').annotate(id=Max('id ...
- 2017-A
2017-A 题目描述: 输入一个字符串,要求输出能把所有的小写字符放前面,大写字符放中间,数字放后面,并且中间用空格隔开,如果同种类字符间有不同种类的字符,输出后也要用字符隔开. 例: 输入 12a ...
- 最火前端 Web 组态软件 (可视化)
前言: 随着物联网.大数据等技术高速发展,我们逐步向数字化.可视化的人工智能(AI)时代的方向不断迈进.智能时代是工业 4.0 时代,我国工业领域正努力从"制造"迈向&quo ...
- Vue element-ui 动态生成自定义table表头实现数据渲染
需求:1)表头的数据是动态的,有可能字段值很长且很多.解决方案自定义动态表头,字段长使用文字提示[el-tooltip组件]: 2)需要对表格data中的数据值进行枚举转成中文值,且显示不同的颜色. ...
- 整理DB2左补零,右补零的方法
在项目中经常遇到需要左补零,右补零的情况,在DB2实验环境中展示 1.左补零(1)数字左补零,数字长度不定用right(digits(cast(expression as bigint)),NUM)能 ...
- Ubuntu更新软件的命令
更新软件源 apt-get update 更新升级所有软件 apt-get upgrade 更新某个软件 apt-get upgrade 名 列出可更新的软件 apt list --upgradabl ...
- 如何使用Java创建数据透视表并导出为PDF
摘要:本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 数据透视分析是一种强大的工具,可以帮助我们从大量数据中提取有用信 ...