STM32定时器输出比较模式

最新更新时间:2022-02-18来源: eefocus关键字:STM32  定时器输出  比较模式 手机看文章 扫描二维码
随时随地手机看文章

OCx与OCxREF和CCxP之间的关系

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

-----------------------------------------------------------------------------------------------------------------------

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


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(高有效)作为参考。输出信号的极性体现在信号链的末端。

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



然后来理解输出比较的几个模式(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):


很显然,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决定的:


②假定OC1REF无效(OC1REF=0),那么从OC1REF到OC1的整条信号链上的信号都是无效信号,我们称OC1输出了无效信号。
无效信号的高电平和低电平也是由CC1P决定:

用一张表来总结上述过程:


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位有这样的描述:


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  定时器输出  比较模式 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic563159.html

上一篇:stm32库函数学习篇
下一篇:TIM的一些配置参数

推荐阅读

STM32字符串打印
源码xxx.cvoid UART_PutChar(USART_TypeDef* USARTx, uint8_t ch){ while((USARTx->SR&0X40)==0);//循环发送,直到发送完毕 USARTx->DR = (ch & (uint16_t)0x01FF); }void printf_uart(USART_TypeDef* USARTx, uint8_t *str){ while (*str != '' ) { UART_PutChar(USARTx, *str); str++; }}头文件定义xxx.hvoid UART_PutChar(USART_TypeDef* USAR
发表于 2022-09-30
stm32——端口重映射
我们先来看什么是复用功能?我们在《stm32f103rc_datasheet.pdf》中可以看到对I/O口的功能描述表格比如:PC10 I/O口,UART4_TX与SDIO_D2功能都是PC10 I/O口的复用功能。也就是说,PC10 I/O口不仅仅只能进行由内核控制的输入/输出功能,还可以进行由片上外设控制的UART4_TX与SDIO_D2功能。注意:UART4_TX与SDIO_D2功能是来自不同模块的功能。当我们使用复用功能UART4_TX时,那么PC10 I/O口就由UART外设模块控制,此时PC10 I/O口输入/输出的数据就都来自于UART外设模块了,而不是来自于内核或者其他外设模块。注意:下图中BGA144、BGA100
发表于 2022-09-30
<font color='red'>stm32</font>——端口重映射
STM32外围电路硬件解析
复位电路:复位 :让MCU回到最开始的状态。并且从头开始,重新执行程序 我们什么时候需要复位?1.烧录的时候 2.程序跑飞了的时候3.上电复位(上电的时候需要复位) 复位方式:1.上电复位: --- 一定要有MCU的Reset是复位引脚,当这个引脚为低电平时,单片机会产生复位。 2. 按键复位:--- 可有可无(看需求)K10按下,产生复位动作这是阻容复位电路。当复位引脚低电平的时候复位。当上电的瞬间,C13电容开始充电,电容处于短路状态,电容上面的电压为低电平,此时MCU复位引脚被拉低,MCU执行复位,这样就实现了上电的时候复位功能了。实际上,单片机内部也有上电复位电路,那么我们之所以还要在单片机外部加上复位
发表于 2022-09-30
<font color='red'>STM32</font>外围电路硬件解析
STM32中 一些类型的别名
typedef signed char int8_t;typedef signed short int int16_t;typedef signed int int32_t;typedef signed __INT64 int64_t; /* exact-width unsigned integer types */typedef unsigned char uint8_t;typedef unsigned short int uint16_t;typedef int uint32_t;typedef unsigned __INT64 uint64_t; /* 7.18.1.2 */ /* smal
发表于 2022-09-29
stm32f103——通用定时器输出PWM
通用定时器 ----输出 1,输出一个PWM 2,检测脉冲宽度 1》PWM---脉冲宽度调制 占空比:高电平占整个周期的百分比 2》PWM作用:调节灯的亮度,声音的大小,速度的快慢----平均电压值 什么是PWM信号?PWM,英文名Pulse Width Modulation,是脉冲宽度调制(记住这个名词)缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.PWM脉冲宽度调制,实际上就是脉冲信号,但是这个
发表于 2022-09-29
stm32f103——通用<font color='red'>定时器</font><font color='red'>输出</font>PWM
STM32+超声波
1.初始化IO口void HC_SR04Init(void){GPIO_InitTypeDef GPIOInit;TIM_TimeBaseInitTypeDef TIMInit; NVIC_InitTypeDef NVICInit;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //负责发送高电平PB11GPIOInit.GPIO_Mode = GPIO_Mode_Out_PP
发表于 2022-09-28
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved