知方号

知方号

输出比较(OC)和PWM的原理和理解<4060tioc和非oc对比>

输出比较(OC)和PWM的原理和理解

导言

  在学习硬件的过程中,最重要的能力还是对官方手册的阅读理解能力,对很多功能和原理的不理解其实来自于对手册的不熟悉和对电路的模糊,本篇主要根据STM32F10XXX参考手册中的通用定时器框图来理解OC(输出比较),图上对应的是我画红框的部分。

  理解这一部分后,我们利用输出比较(OC)在GPIO口来输出PWN(Pulse Width Modulation)来等效模拟信号。

OC原始功能介绍​​​

  OC(Output Compare)输出比较。既然是比较那么我们首先要知道比较的对象是什么?

  通过红色圈圈出部分能进行比较的也就只有被圈出的两种寄存器,也就是图中的:CNT(Count)计数器,和CCR(Capture Compare Register)。那么OC的含义也就是:通过比较CNT和CCR来对Output进行操作。操作的结果,可以先笼统的展示在此:

图一(函数关系)

  也就是说Output的高低电频是由比大小结果决定的。

  接下来我们先来理解PWM,最后再一起理解。

PWN介绍

   脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制。理解的一个要点就在于:调制一系列脉冲的宽度,或者说:控制想要输出的一系列波形的参数。我们使用这个技术的目标是:用数字信号等效模拟信号。

PWN理解

  我们都知道,数字信号的输出只有两个,0和1也就是高和低,却没有中间值的输出,这个问题对于利用输出电流来完成实际工作来说是很致命的,比方说 我想让小灯泡不那么亮,现在亮度太刺眼,但是因为只有高和低的选择,要么关掉,要么刺眼,这样,我们就遭遇到了困难。

  我们的解决方法也很简单,就类似于一排LED,只要他们闪的够快,因为人眼有余晖效应,我们肉眼认为他们是一直亮着的。这个也一样,我们以非常快的速度给输出端交错的高低电平,以小灯泡举例,灯泡收到的指令将会是:“亮 暗 亮 暗 亮 暗 亮 暗 亮 暗 亮 暗 ...”这样,只要速度足够快,人眼就发现不了,呈现出的最终效果也就是灯泡是一个中等亮度。

  也就是说,灯泡接收到的信号依然是只有高低的数字信号,如上图所示。是因为频率足够快导致结果是我们所需的结果。

  那么灯泡的亮度能否控制呢?当然是可以的“调制一系列脉冲的宽度”,我们通过OC改变发出脉冲的参数,就可以实现控制的作用。比方说,在最后Output的波形里,增加高电平的时间,就会导致灯泡的效果更亮,相对而言,增加低电平时间,就能控制灯泡亮度变暗。我们意识到,需要一些参数名字来更好的描述这些特性。

PWN参数

  通过上面的案例我们知道要设置一些参数名字来说明这些特征:

1.占空比:  是一个脉冲周期内,高电平的时间与整个周期时间的比例。这就对应着调亮度到底是多大的问题。可以很容易想明白,输出最终的状态和占空比呈线性状态,对于灯泡而言,占空比越大越亮。

2.PWM的频率:

  是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);也就是说一秒钟PWM有多少个周期。

3.PWM的周期:T=1/f    周期=1/频率。

  了解了PWM的工作原理和参数之后,我们再返回来看如何控制PWM,也就是定时器的OC功能。

OC输出比较

  

  回过头看最上方红框圈出部分,CNT计数器下有四个输出比较通道,我们选择其中一个开始了解其功能。高级定时器的前3个通道额外拥有死区生成和互补输出的功能,这个知识和我们所讲的主干部分相关性没那么大,以后有需要另出文章讲解。当我们开启时钟之后,CNT计数器开始计数,达到我们设定的ARR(自动重装寄存器)的值后,再开始一轮计时,我们从下图可以清楚看到:

示意图及公式

  黄色线代表着设定的ARR,蓝色线代表着计数器CNT,如果我们把CCR设置为红线,那么根据我们已知他们大小存在类似于图一函数关系,我们可以对应画出下面绿色的线,即为输出端口PWM的脉冲图。

  通过以上理解和图像,可以推导出OC与最终输出的PWM脉冲之间的对应公式,因为我们控制还是控制的开发板的基本参数(CK_PSC ,PSC ,ARR,CCR)所以对应公式要熟练掌握。

我习惯于用周期来理解,这是部分推导过程

  对应在Keil里代码控制这些参数一般常用这几条:

TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;//计数周期,即ARR的值TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;//预分频器,即PSC的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器,高级定时器才用 // 到TIM_OCInitStructure.TIM_Pulse = 0;//初始的CCR值

  这样我们就理解了PWM的原理以及OC控制输出的原理及其重要公式和方法。

  希望对大家有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。