「STM32入门」TIM输出比较

news/2024/11/28 7:36:04/

输出比较的简介

  • 输出比较英文写作OC (Output Compare) 
  • 输出比较可以通过比较CNT和CCR寄存器值的关系,来对输出电平进行置高或者置低或者翻转的操作,用于输出一定频率和占空比的PWM波形
  • 常见应用例子如:呼吸灯,调速电机等
  • CCR(Capture/Compare Register的缩写,及捕获/比较寄存器) 

CNT与CCR之间的逻辑关系

  • CNT计数自增,CCR是我们给定的一个值

PWM简介 

  • Pulse Width Modulation 脉冲宽度调制
  • 在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速领域
  • PWM的参数:
  • 频率 = \frac{1}{T_{s}} 
  • 占空比 = \frac{T_{on}}{T_{s}}
  • 分辨率 = 占空比变化步距

如何理解上述所说的:PWM可用于等效获得模拟参量呢?

在我们通常点亮LED实验中,我们只能给LED置1或者置0,也就是亮或者灭。但是当我们以一个很高的频率点亮熄灭,点亮熄灭,点亮熄灭...的时候,LED就会呈现出中等亮度,具体的亮暗程度就取决于亮的时间的占空比。

同理:我们不断地给电机通电断电,通电断电,通电断电...就可以让电机的速度维持在一个中等速度。

定时器的输出比较模块输出PWM

根据上面这张图,我们关注输出模式控制器这一模块。它的输入端是CNT和CCR的大小关系,输出则是oc1ref的高低电平。

在输出模式控制器中有许多输出比较模式,一般来说最常用也是这里要介绍的是PWM模式

 其中具体选模式1还是模式2,向上计数还是向下计数都是可以在代码中进行配置的,这两个模式可以输出频率和占空比都可调的波形。


接下来重点介绍PWM基本结构(该图对应PWM模式1)

我们首先关注右上角的图,其中黄线代表ARR的值,蓝线代表CNT的值,红线代表CCR的值

CNT从0开始自增,一直增到ARR,也就是99,之后清0,再继续自增...一直循环下去

可以看到,我们设置CCR为30,当蓝线在红线下面时,输出高电平;当蓝线在红线上面时,输出低电平,对应PWM模式1的执行逻辑。

在这里我们发现:当我们将CCR的值设高,高电平的时间就延长,占空比升高。对应回我们的两个例子的现象就是,灯变得更亮,电机转的更快。

流程图中的REF指的就是一个频率可调,占空比也可调的PWM波形。最终再经过极性选择和输出使能,通向GPIO口。

参数计算 

PWM频率:Freq = CK_PSC / (PSC + 1) / (ARR + 1) 

PWM占空比:Duty = CCR / (ARR + 1) 

PWM分辨率:Reso = 1 / (ARR + 1) 

其中CK_PSC是系统频率72MHz,PSC是预分频系数


举个例子

如果我们要产生一个频率为1kHz,占空比为50%,分辨率为1%的PWM波形

那么 

CK_PSC / (PSC + 1) / (ARR + 1) = 1000

CCR / (ARR + 1) = 50%

1 / (ARR + 1) = 1% 

解得:

ARR = 99,CCR = 50,PSC = 719 

由于个人项目需要,这里补充简介一下直流电机及其驱动,权当笔记。 

直流电机及其驱动

电机(左)

驱动电路(右) 

  • 直流电机有两个电极,当电极正接时,电机正转;反接则反转。
  • 直流电机属于大功率器件,GPIO口无法直接驱动,需要配合驱动电路来操作
  • 查表控制电机正转或反转

http://www.ppmy.cn/news/41804.html

相关文章

Android开发中kotlin编程语言的一些实用技巧

前言 相信大家都知道,kotlin是kotlin是google力推的用以取代java的android开发语言 ,kotlin使用起来比较方便,同时有许多语法糖,本文主要讲解了一些比较实用的kotlin技巧。 一,自定义圆角矩形 在项目中,…

在Ubuntu18.04或者20.04下搭建edk2运行环境

#更新完之后依次执行下面两条命令 1.apt-get update 2.apt-get upgrade 如果执行之后出现源不能更新的问题,到/etc/apt/sources.list.d 下删除对应的ppa源重新更新即可解决 git clone https://github.com/tianocore/edk2.git cd edk2 git submodule update --init 如果git cl…

C++之动态内存

12 动态内存 12.1动态内存与智能指针 动态分配对象的生存期与它们在哪里创建无关,只有当显示地被释放时,这些对象才会销毁。 new在动态内存中为对象分配空间并返回一个指向该对象的指针,可以对对象进行初始化。 delete接受以一个动态内存…

18从零开始学Java之switch分支语句中该怎么用?

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中,壹哥给大家介绍了Java里的顺序、分支、循环结构的概念,并且重点给大家讲解了分支结…

Python 纯函数与副作用,可变参数与不可变参数

文章目录纯函数与副作用纯函数副作用参数传递不可变对象(值类型)可变对象(引用类型)参数传递方式纯函数与副作用 在Python的函数式编程中,Python既可以在调用时对实参进行修改,也可以通过返回值返回函数调…

咖啡卷到现在,他们开始往里面掺北京豆汁了

咖啡卷到现在,他们开始往里面掺北京豆汁了0. 导读1. 人手一杯,果咖大势所趋2. 双倍成瘾:茶咖和酒咖被重点推荐3. 地方小吃融入咖啡,比如北京豆汁4. 炙手可热的云南咖啡豆5. 咖啡、户外和环保:绑定可持续6. 小结0. 导读…

可选择的Elasticsearch好用的可视化客户端工具

前言 常言道:工欲善其事,必先利其器。对于我们开发和测试同学来说,在日常的工作中有一款趁手的工具那真实如虎添翼啊,工作效率可是蹭蹭蹭的往上长,节省下来的时间摸摸鱼该有多好啊。最近我们系统开始使用elasticsearc…

VAE 理论推导及代码实现

VAE 理论推导及代码实现 熵、交叉熵、KL 散度的概念 熵(Entropy) 假设 p (x)是一个分布函数,满足在 x 上的积分为 1,那么 p(x)p(x)p(x)的熵定义为 H(p(x))H (p (x))H(p(x)),这里我们简写为 H(p)H(p)H(p) H(p)∫p(x)…