0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分享STM32定时器输出比较模式的理解

GReq_mcu168 2018-01-15 08:49 次阅读

初学STM32,我这个地方卡了很久,现在终于有些明白了,现在把我的理解写下与大家共享,如果有不对的地方,还请指出。

TIM_OCMode选择定时器模式。该参数取值见下表:

分享STM32定时器输出比较模式的理解

TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //设置跳变值,当计数器计数到这个值时,电平发生跳变

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIMx在CCR1上的预装载寄存器 TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器

OCxREF就是一个参考信号,并且约定:OCxREF=1,称OCxREF有效。反之,OCxREF=0,称OCxREF无效;‘1’电平(高电平)称为OCxREF的有效电平,‘0’ 电平(低电平)称为OCxREF的无效电平。——依据参考手册:The output stage generates an intermediate waveform which is then used for reference:OCxRef (active high). The polarity acts at the end of the chain.(翻译)输出阶段产生一个中间波形OCxRef(高有效)作为参考。输出信号的极性体现在信号链的末端。

现在解释几个名词之间的关系:

分享STM32定时器输出比较模式的理解

然后来理解输出比较的几个模式(PWM模式是输出比较模式的特例)查看TIMx_CCMR1寄存器的OC1M域,有如下定义(摘自最新版的参考手册

翻译如下:000:冻结——输出比较寄存器TIMx_CCR1中的内容与计数器TIMx_CNT中的内容之间的比较对输出无影响。(此模式用于时基的生成)001:当匹配时,设置通道1为有效电平。当计数器TIMx_CNT中的内容与捕捉/比较寄存器1(TIMx_CCR1)中的内容相匹配时,强行拉高OC1REF 信号。010:当匹配时,设置通道1为无效电平。当计数器TIMx_CNT中的内容与捕捉/比较寄存器1(TIMx_CCR1)中的内容相匹配时,强行拉低OC1REF 信号。011:翻转——当TIMx_CNT= TIMx_CCR1时,OC1REF信号取反。100:强制无效电平——强行拉低OC1REF 信号。101:强制有效电平——强行拉高OC1REF 信号。110:PWM模式1——向上计数模式中,只要TIMx_CNT< TIMx_CCR1,通道1有效,反之无效。向下计数模式中,只要TIMx_CNT> TIMx_CCR1,通道1无效(OC1REF=0),反之有效(OC1REF=1)。110:PWM模式2——向上计数模式中,只要TIMx_CNT< TIMx_CCR1,通道1无效,反之有效。向下计数模式中,只要TIMx_CNT> TIMx_CCR1,通道1有效,反之无效。我用红色标出了提到有效、无效的地方。不难发现,有效与无效分别对应OC1REF=1和OC1REF=0。这正是我们先前约定的结果。到此,不同模式下输出比较的结果对OC1REF信号的影响已经很清楚了,但是最终的输出信号是OC1,并不是OC1REF。而且前面有一句话(输出信号的极性体现在信号链的末端)还未做解释。到底OC1REF与OC1之间有何秘密呢?我们来看下面这个图:

显然,我们只关心红色圈内的信号与方框内的寄存器位以及信号在它们之间是如何传播的。oc1ref从输出模式控制器(Output mode controller)开始,分为两路,上面一路至主模式控制器(To the master mode controller),这里我们不关心它的去向,我们关心的是下面一路,下面一路在进入双路开关之前又被分成了两路——一路是原信号,一路是原信号的非。显然TIMx_CCER中的CC1P位用来控制这个开关,CC1E位控制着整条信号链的通断。当CC1P=0时(CC1E=1):

当CC1P=1时(CC1E=1):

分享STM32定时器输出比较模式的理解

很显然,OC1与OC1REF的关系只受CC1P的影响(CC1E=1)

然而参考手册上对CC1P位是这么描述的:

CC1P=0时:OC1高电平有效CC1P=1时:OC1低电平有效根据本文开篇的名词解释,可以这么理解:CC1P=0时:OC1有效电平是高电平CC1P=1时:OC1有效电平是低电平这时就迷惑了,这个高电平有效和低电平有效是啥意思呢?我们从头分析(整个过程CC1E=1,OC1的输出是允许的):①假定OC1REF有效(OC1REF=1),那么从OC1REF到OC1的整条信号链上的信号都是有效信号,我们称OC1输出了有效信号。那这个有效信号是高电平还是低电平呢?这就是由CC1P决定的:

分享STM32定时器输出比较模式的理解

②假定OC1REF无效(OC1REF=0),那么从OC1REF到OC1的整条信号链上的信号都是无效信号,我们称OC1输出了无效信号。无效信号的高电平和低电平也是由CC1P决定:分享STM32定时器输出比较模式的理解

OC1REF CC1P 功能 OC1 描述
0 0 OC1高电平有效 0(低电平) 无效
1 OC1低电平有效 1(高电平) 无效
1 0 OC1高电平有效 1(高电平) 有效
1 OC1低电平有效 0(低电平) 有效

显然,OC1REF决定了OC1输出电平是否有效,而CC1P决定了有效电平的极性。我们抽出上表的后四列

CC1P 功能 OC1 描述
0 OC1高电平有效 0(低电平) 无效
1 OC1低电平有效 1(高电平) 无效
0 OC1高电平有效 1(高电平) 有效
1 OC1低电平有效 0(低电平) 有效

我们将表按1、2列合并:

CC1P 功能 OC1 描述
0 OC1高电平有效 0(低电平) 无效
OC1高电平有效 1(高电平) 有效
1 OC1低电平有效 0(低电平) 有效
OC1低电平有效 1(高电平) 无效

现在很清楚了,从上表中可以清楚地看到CC1P对OC1有效极性的控制。即,OC1的极性只有与CC1P指定的有效极性一致,OC1才能是有效的(绿色部分)。这样就解释了“输出信号的极性体现在信号链的末端”这句话。然而这条链还未结束,还有个CC1E呢。当然,它就是一个OC1输出使能位而已。但细心的你可能会发现,参考手册上对CC1E位有这样的描述:

分享STM32定时器输出比较模式的理解

OCx = OCxREF + Polarity这个式子告诉我们OCx与OCxREF和Polarity(极性,即CCxP位)的关系。我们上面提到了它们的关系,是分了两种情况(CC1P=0和CC1P=1)表示的,这个式子帮我们将上面关系归纳成了一个。这个式子怎么得来的?回忆一下数字电路里面的半加器(就是不进位的加法),真值表如下:

OCxREF Polarity OCx
0(无效) 0(高有效) 0(无效)
0(无效) 1(低有效) 1(无效)
1(有效) 0(高有效) 1(有效)
1(有效) 1(低有效) 0(有效)

我们写逻辑函数(按黄色部分写):

注意:前面的“+”号表示半加运算(不进位加法),其实是逻辑上的“异或”。

OC1连接到TIMx_CH1上,而TIMx_CH1是复用的。可在参考手册上定时器功能复用部分找到。下面给出一些定时器功能复用的表格:

分享STM32定时器输出比较模式的理解

分享STM32定时器输出比较模式的理解

分享STM32定时器输出比较模式的理解

分享STM32定时器输出比较模式的理解

分享STM32定时器输出比较模式的理解

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2239

    文章

    10668

    浏览量

    348677
  • 定时器
    +关注

    关注

    23

    文章

    3146

    浏览量

    112014

原文标题:STM32定时器输出比较模式中的疑惑

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    总结一下定时器的几种输出比较模式

    最近有接触到通过可控硅的方式来控制交流风机或者电烙铁功率,STM32定时器输出比较模式,刚好可以满足这种需求,借此机会总结一下
    的头像 发表于 07-21 16:17 4147次阅读
    总结一下<b class='flag-5'>定时器</b>的几种<b class='flag-5'>输出</b><b class='flag-5'>比较</b><b class='flag-5'>模式</b>

    STM32定时器输出一路PWM

    STM32定时器输出一路PWM(控制LED灯的亮度)STM32定时器具有强大的功能,今天的输出
    发表于 08-04 07:21

    STM32的通用定时器和高级定时器功能

    之后,并依据相应的输出模式从而实现各类输出。如PWM输出、电平翻转、单脉冲模式、强制输出等。一般
    发表于 08-18 07:15

    STM32定时器比较输出相应的输出特征是什么

    STM32定时器比较输出流程是怎样的?STM32定时器比较
    发表于 11-23 07:47

    怎样去实现STM32通用定时器输出比较模式

    怎样去实现STM32通用定时器输出比较模式呢?其代码该怎样去实现呢?
    发表于 11-24 07:44

    STM32通用定时器输出比较功能

    STM32的通用定时器定时输出PWM功能的使用本次还是使用发光二极管来验证定时器的使用目录STM32
    发表于 12-01 06:30

    关于定时器输出比较模式中的电平理解

    关于定时器输出比较模式中提到的有效电平、无效电平、高电平有效、低电平有效的理解。参考捕获/比较
    发表于 01-06 06:34

    浅谈stm32定时器应用中的2个疑问

    在使用STM32通用或高级定时器比较输出时,如果采用中心对齐计数模式做PWM输出,并使用
    的头像 发表于 01-28 10:14 4053次阅读
    浅谈<b class='flag-5'>stm32</b><b class='flag-5'>定时器</b>应用中的2个疑问

    单片机 | STM32定时器比较输出切换模式之应用实例

    定时器比较输出切换实现任意波形之实例。
    的头像 发表于 06-04 14:08 7004次阅读
    单片机 | <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b><b class='flag-5'>比较</b><b class='flag-5'>输出</b>切换<b class='flag-5'>模式</b>之应用实例

    [STM32]通用定时器的使用

    STM32的通用定时器定时输出PWM功能的使用本次还是使用发光二极管来验证定时器的使用目录STM32
    发表于 11-22 19:06 24次下载
    [<b class='flag-5'>STM32</b>]通用<b class='flag-5'>定时器</b>的使用

    STM32-通用定时器-PWM输出

    捕获、输出比较、PWM输出、单脉冲模式输出等。STM32
    发表于 11-26 15:36 22次下载
    <b class='flag-5'>STM32</b>-通用<b class='flag-5'>定时器</b>-PWM<b class='flag-5'>输出</b>

    STM32F4单定时器独立输出四路PWM脉冲

    本文以STM32F405单片机为例,介绍如何用一个定时器的四个通道独立地输出四路PWM脉冲。主要使用定时器输出
    发表于 11-30 10:06 28次下载
    <b class='flag-5'>STM32</b>F4单<b class='flag-5'>定时器</b>独立<b class='flag-5'>输出</b>四路PWM脉冲

    STM32定时器单脉冲输出模式

    STM32定时器单脉冲输出模式
    发表于 12-08 20:51 47次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>单脉冲<b class='flag-5'>输出</b><b class='flag-5'>模式</b>

    【捕获比较模式】msp430定时器比较捕获理解

    MSP430的定时器中有比较捕获的概念,刚刚接触非常生疏。看了半天终于清楚: 比较模式: 这是定时器的默认
    发表于 12-16 16:55 10次下载
    【捕获<b class='flag-5'>比较</b><b class='flag-5'>模式</b>】msp430<b class='flag-5'>定时器</b><b class='flag-5'>比较</b>捕获<b class='flag-5'>理解</b>

    STM32定时器的几种输出模式

    最近有接触到通过可控硅的方式来控制交流风机或者电烙铁功率,STM32定时器输出比较模式,刚好可以满足这种需求,借此机会总结一下
    的头像 发表于 01-12 16:49 4548次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>的几种<b class='flag-5'>输出</b><b class='flag-5'>模式</b>