单片机学习!
目录
[1.1 输入捕获简介](#1.1 输入捕获简介)
[1.2 输出比较和输入捕获执行逻辑的对比:](#1.2 输出比较和输入捕获执行逻辑的对比:)
[1.2.1 输出比较](#1.2.1 输出比较)
[1.2.2 输入捕获](#1.2.2 输入捕获)
[1.2.3 输出比较和输入捕获对比总结](#1.2.3 输出比较和输入捕获对比总结)
[1.3 输入捕获作用](#1.3 输入捕获作用)
[1.4 三种定时器的输入捕获通道分布](#1.4 三种定时器的输入捕获通道分布)
[2.1 测量信号类型](#2.1 测量信号类型)
[2.2 测量信号方法](#2.2 测量信号方法)
[2.2.1 测频法](#2.2.1 测频法)
[2.2.2 测周法](#2.2.2 测周法)
[2.2.3 测频法与测周法对比](#2.2.3 测频法与测周法对比)
[2.3 中界频率](#2.3 中界频率)
[2.4 STM32实现信号测量](#2.4 STM32实现信号测量)
[3.1 输入捕获引脚](#3.1 输入捕获引脚)
[3.2 异或门和数据选择器](#3.2 异或门和数据选择器)
[3.3 输入滤波器和边沿检测器](#3.3 输入滤波器和边沿检测器)
[3.4 预分频器](#3.4 预分频器)
[3.5 举例](#3.5 举例)
[4.1 滤波器](#4.1 滤波器)
[4.2 边沿检测](#4.2 边沿检测)
[4.3 分频器](#4.3 分频器)
[4.4 CNT清零工作描述](#4.4 CNT清零工作描述)
[5.1 主模式](#5.1 主模式)
[5.2 从模式](#5.2 从模式)
[5.3 触发源选择](#5.3 触发源选择)
[5.4 模式作用](#5.4 模式作用)
[6.1 电路执行逻辑](#6.1 电路执行逻辑)
[6.2 方波信号图](#6.2 方波信号图)
[7.1 电路执行逻辑](#7.1 电路执行逻辑)
[7.2 方波信号图](#7.2 方波信号图)
[7.3 PWMI时序图](#7.3 PWMI时序图)
前言
输入捕获用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。
一、输入捕获
1.1 输入捕获简介
- IC(Input Capture)输入捕获
- 输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
- 每个高级定时器和通用定时器都拥有4个输入捕获通道
- 可配置为PWMI模式,同时测量频率和占空比
- 可配合主从触发模式,实现硬件全自动测量
1和2两部分加起来是输入捕获的电路,2和3两部分加起来是输出比较的电路。由图中可以看出有4个输入捕获和输出比较通道,输入捕获和输出比较共用4个CCR寄存器,4个通道的引脚(CH1、CH2、CH3、CH4)输入捕获和输出比较也是共用的,所以对于同一个定时器,输入捕获和输出比较只能使用其中一个,不能同时使用。
1.2 输出比较和输入捕获执行逻辑的对比:
1.2.1 输出比较
输出比较:
输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。
对照通用定时器框图中输出比较部分来看,CNT计数器 和CCR寄存器 是作为比较电路的输入,根据CNT 和CCR的大小关系,从通道引脚输入高低电平。这是输出比较的执行逻辑。
1.2.2 输入捕获
输入捕获:
输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
"输入捕获模式下,当通道输入引脚出现指定电平跳变 时",这个指定电平跳变 就是上升沿或者下降沿,可以通过程序配置。发生电平跳变的瞬间,输入捕获电路会让当前CNT的值锁存到CCR 中,锁存到CCR的意思就是把当前CNT的值读出来,写入到CCR中去。
总结:输入捕获就是输入引脚电平跳变的瞬间把当前CNT的值锁存到CCR中。
对照通用定时器框图中输入捕获部分,边沿信号输入引脚一旦有边沿,如上升沿,这一路输入滤波和边沿检测电路就会检测到这个上升沿,让输入捕获电路产生动作。这一块电路和外部中断很相似。
输入捕获电路与外部中断的相同于区别
相同:
都是检测电平跳变,然后执行动作。
区别:
- 外部中断执行的动作是向CPU申请中断。
- 输入捕获执行的动作是控制后续电路,让当前CNT的值锁存到CCR寄存器中。
1.2.3 输出比较和输入捕获对比总结
- 输出比较引脚是输出端口;
- 输入捕获引脚是输入端口。
- 输出比较是根据CNT和CCR的大小关系来执行输出动作;
- 输入捕获是接收到输入信号,执行CNT锁存到CCR的动作。
1.3 输入捕获作用
输入捕获用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。脉冲间隔实际上和频率是是差不多的意思;电平持续时间和占空比是差不多的意思。这些参数通过输入捕获电路都可以很方便的进行测量。
1.4 三种定时器的输入捕获通道分布
每个高级定时器和通用定时器都拥有4个输入捕获通道,输入捕获通用定时器和高级定时器都是一样的,基本定时器没有输入捕获的功能。
1.5输入捕获的PWMI模式和主从触发模式简介
输入捕获可配置为PWMI模式,同时测量频率和占空比。PWMI模式就是PWM的输入模式,是专门为测量PWM频率和占空比设计的。
输入捕获可配合主从触发模式,实现硬件全自动测量。
PWMI模式和主从触发模式设计的非常巧妙,把这两个功能结合起来,测量频率占空比就是硬件全自动执行,软件不需要进行任何干预,也不需要进中断。需要测量的时候,直接读取CCR寄存器就行,使用非常方便极大减轻了软件压力。
二、频率测量
2.1 测量信号类型
图为一个频率逐渐降低的方波波形,越往左,频率越高;越往右,频率越低。图中的信号都是只有高低电平的数字信号。
对于STM32测频率而言,它只能测量数字信号。
- 如果需要测量一个正弦波,那还需要搭建一个信号预处理电路,最简单的就是用运放搭建一个比较器,把正弦波转化为数字信号,再输入给STM32就行了;
- 如果需要测量的信号电压非常高,那还需要考虑一下隔离的问题,比如用一些隔离放大器,电压互感器等元件,隔离高压端和低压端,保证电路的安全。
其他信号经过处理最终输入给STM32的信号,需是图示的高低电平信号,高电平3.3V低电平0V.
2.2 测量信号方法
测量频率有两种方法可以选择:测频法和测周法。
2.2.1 测频法
- 测频法:在闸门时间T内,对上升沿(或下降沿)计次,得到N,则频率 fx=N / T
测量上图所示信号的频率,可以设置闸门时间T,通常设置为1s。在1s时间内,对信号上升沿计次。从0开始计次,每来一个上升沿,计次加一,每来一个上升沿,其实就是来了一个周期的信号。所以在1s时间内,来了多少个周期,那频率就是多少Hz。这符合频率的定义,频率的定义就是,1s内出现了多少个重复的周期,那频率就是多少Hz。这种直接按频率定义来测量的方法就叫测频法。
测频法公式中闸门时间T,可灵活设置,可以是1s,对应计次值就直接是频率;也可以是2s,2s的闸门时间对应计次值除2,就是频率;也可以是0.5s的闸门时间,对应计次值乘2,也是频率。
2.2.2 测周法
- 测周法:两个上升沿内,以标准频率fc计次,得到N ,则频率 fx=fc / N
测周法的基本原理就是,周期的倒数就是频率。测出一个周期的时间取倒数就是频率。
由上图所示,捕获信号的两个上升沿,然后测量一下这之间持续的时间就可以了。问题在于如何测量时间,测量时间的方法实际上也是定时器计次,可以使用一个已知的标准频率fc的计次时钟,来驱动计数器。从一个上升沿开始计,计数器从0开始,一直计到下一个上升沿停止。计一个数的时间是1/fc,计N个数时间就是N/fc,N/fc就是周期,再取个倒数,就得到公式 fx=fc / N。
2.2.3 测频法与测周法对比
测频法和测周法都是测量频率的重要方法,这两种方法都有什么区别,实际情况如何选择使用哪一种个好?
测频法适合测量高频信号,测周法适合测量低频型号
从图中看,测频法,在闸门时间内,最好多出现一些上升沿,计次数量多一些,这样有助于减小误差。假如定了1s的闸门时间,结果信号频率非常低,闸门时间内只有很少几个上升沿甚至1个上升沿都没有,这不能将频率定为0,在计次N很少时,误差就会很大。所以测频法要求,信号频率要稍微高一些。
对于测周法就要求信号频率低一些。低频型号,周期比较长,计次就会比较多,有助于减小误差。如果标准频率为1MHz,待测信号频率太高,比如待测信号500KHz,那在一个周期内只能计一两个数;若待测信号再高一些,甚至一个数也计不到时,不能将频率定为无穷大,所以测周法需要待测信号频率低一些。
测频法测量结果更新的慢,数值相对稳定;
测周法更新的快,数据跳变也非常快。
由图可看出,测频法测量的是在闸门时间内的多个周期,所以它自带一个均值滤波。如果在闸门时间内波形频率有变化,那得到的是这一段时间的平均频率。如果闸门时间为1s,那么每隔1s才能得到一次结果。所以测频法结果更新慢,测量结果是一段时间的平均值,值比较平滑。
测周法只测量一个周期,就能出一次结果。所以出结果的速度取决于待测信号的频率,一般而言,待测信号都是几百几千Hz,所以一般情况下,测周法结果更新更快。但是由于测周法只测量一个周期,所以结果值会受噪声的影响,波动比较大。
测频法适合测量高频信号,测周法适合测量低频型号,那高频和低频是如何划分的?这就需要了解中界频率。
2.3 中界频率
- 中界频率:测频法与测周法误差相等的频率点 fm=√fc / T
测频误差:
测频法计次和测周法计次,这个计次数量N要尽量大一些,N越大,相对误差越小。因为在这两种方法中,计次可能会存在正负1误差。
- 测频法,在闸门时间内,并不是每个周期信号都是完整的。比如在最后的闸门时间里,可能有一个周期刚出现一半,闸门时间就到了,那这只有半个周期,只能舍弃掉或者当作一整个周期来看。因为计次只有整数,不能计次0.5个数。所以在这个过程就会出现多计一个数或者少计一个数的情况,这就是正负1误差。
- 测周法,标准频率fc计次,在最后时刻有肯能会一个数刚数到一半,计时就结束了 ,那这半个数也只能舍弃或者按一整个数来算。这里也会出现正负1误差。
正负一误差是测频法和测周法都固有的误差。想要减小正负1误差的影响,就只能尽量多计一些数,当计次N比较大时,正负1对N的影响就会很小。
总结:N越大,正负1误差影响越小。
当有一个频率,测频法和测周法计次N相同,就说明误差相同,就是中界频率了。中界频率公式可以由测频法公式中的N提出来,测周法公式中的N也提出来,令两个方法N相等,把fx解出来,就得到中界频率 fm=√fc / T。
由信号频率图所示:
- 当待测信号频率小于 中界频率时,测周法误差更小,选用测周法更合适;
- 当待测信号频率大于 中界频率时,测频法误差更小,选用测频法更合适;
2.4 STM32实现信号测量
测频法:
对信号频率上升沿计次,每来一次上升沿计次加1。再用一个定时器,定一个1s的定时中断,在中断里,每隔1s取一下计次值同时清零计次,为下一次做准备。这样每次读取的计次值就直接是频率。
测周法:
测量两个上升沿之间的时间,来进行频率测量。使用一个已知的标准频率fc的计次时钟,来驱动计数器。从一个上升沿开始计,计数器从0开始,一直计到下一个上升沿停止。
三、输入捕获电路
先从定时器框图中看一下输入捕获的各部分电路。
3.1 输入捕获引脚
1.左边四个引脚的通道,参考引脚定义表可查看引脚复用的位置。
3.2 异或门和数据选择器
2.从引脚进来,有一个三输入的异或门。异或门的输入接在了通道1、2、3端口,异或门的执行逻辑是当三个输入引脚的任何一个有电平翻转时,输出引脚就产生一次电平翻转,之后输出通过数据选择器,到达输入捕获通道1,数据选择器如果选择上面一个,那输入捕获通道1的输入就是3个引脚的异或值;数据选择器如果选择下面一个,异或门就没有用,4个通道各用各的引脚。设计这个异或门是为了三相无刷电机服务的。无刷电机有3个霍尔传感器检测转子的位置。可以根据转子的位置进行换相,有了这个异或门就可以在前三个通道接上无刷电机的霍尔传感器,这个定时器就作为无刷电机的接口定时器,去驱动换相电路工作。
3.3 输入滤波器和边沿检测器
3.信号来到输入滤波器和边沿检测器,输入滤波器可以对信号进行滤波,避免一些高频的毛刺信号误触发;边沿检测器(这和之前文章的外部中断那里是一样的了)可以选择高电平触发或者低电平触发,当出现指定的电频时,边沿检测电路就会触发后续电路执行动作。
其实TI1信号进来这里是设计了两套滤波和边沿检测电路:
- 第一套电路经过滤波和极性选择,得到TI1FP1(TI1 Filter Polarity 1),输入给通道1的后续电路。
- 第二套电路,经过另一个滤波和极性选择,得到TI1FP2(TI1 Filter Polarity 2),输入给下面通道2的后续电路。
同理TI2信号进来,也经过两套滤波和极性选择,得到TI2FP1和TI2FP2,其中TI2FP1输入给上面;TI2FP2输入给下面。
TI1和TI2两个信号进来,在数据选择器这里可以选择各走各的,也可以选择进行一个交叉,让CH2引脚输入给通道1,或者CH1引脚输入给通道2,这里进行了交叉连接。
交叉连接的目的:
- 第一个目的:可以灵活切换后续捕获电路的输入。如电路设计一会儿需要以CH1作为输入,一会儿需要以CH2作为输入。这样就可以通过数据选择器灵活进行选择。
- 第二个目的:可以把一个引脚的输入,同时映射到两个捕获单元。这也是PWMI模式的经典结构,第一个捕获通道,使用上升沿触发,用来捕获周期;第二个通道,使用下降沿触发,用来捕获占空比。两个通道同时对一个引脚进行捕获,就可以同时测量频率和占空比。
一个通道灵活切换两个引脚和两个通道同时捕获一个引脚,这就是交叉连接的目的。同样,通道3和通道4也是一样的结构。可以选择各自独立连接,也可以选择进行交叉。4个通道的数据选择器还有一路TRC信号,也可以选择作为捕获部分的输入。TRC信号的设计也是为了无刷电机的驱动。
3.4 预分频器
4.输入信号进行滤波和极性选择后就来到了预分频器,预分频器每个通道各有一个,可以选择对前面的信号进行分频,分频之后的触发信号就可以触发捕获电路进行工作了。每来一个触发信号,CNT的值就会向CCR转运一次,转运的同时会发生一个捕获事件,这个事件会在状态寄存器置标志位,同时也可以产生中断。如果需要在捕获的瞬间处理一些事情的话,就可以开启这个捕获中断。
3.5 举例
例如配置上升沿触发捕获,每来一个上升沿,CNT转运到CCR一次,又因为这个CNT计数器是由内部的标准时钟驱动的,所以CNT的数值其实就可以用来记录两个上升沿之间的时间间隔。这个时间间隔也就是周期,再取个倒数就是测周法测量的频率了。这里其实和测周法差不多,上升沿用于触发输入捕获,CNT用于计数计时。每来一个上升沿,取以下CNT的值,自动存在CCR里。CCR捕获到的值就是计数值N,CNT的驱动时钟就是fc,fc/N就得到了待测信号的频率。这里注意个细节问题,每次捕获之后都要把CNT清零一下,这样下次上升沿再捕获的时候取出的CNT才是两个上升沿的时间间隔。这个再一次捕获后自动清零的步骤,可以用主从触发模式自动来完成。
四、输入捕获通道
以下框图就是通用定时器框图输入捕获部分的细化结构,基本功能都一样。
4.1 滤波器
1.信号从引脚进来,还是先经过一个滤波器。滤波器的输入是TI1也就是CH1的引脚,输出的TI1F就是滤波后的信号。fDTS是滤波器的采样时钟来源,下面CCMR1寄存器里的ICF位可以控制滤波器的参数。
滤波器工作原理:
滤波器工作原理就是以采样频率对输入信号进行采样,当连续N个值都为高电平,输出才为高电平;连续N个值都为低电平,输出才为低电平。如果信号出现高频抖动,导致连续采样N个值不全都一样,那输出就不会变化,这样就可以达到滤波的效果。采样频率越低,采样个数N越大,滤波效果就越好。
4.2 边沿检测
2.滤波之后的信号通过边沿检测器捕获上升沿或者下降沿,用CCER寄存器里的CC1P位就可以选择极性。最终得到TI1FP1触发信号,通过数据选择器进入通道1后续的捕获电路。
这里实际应该还有一套一样的电路,得到TI1FP2触发信号,连接到通道2的后续电路。图中并没有画出来。同样,通道2有TI2FP1连接到通道1的后续,通道2也还有TI2FP2,连接到通道2的后续。总共4种连接方式,然后经过这里的数据选择器,进入后续捕获部分电路。
4.3 分频器
3.CC1S位可以对数据选择器进行选择。之后ICPS位可以配置这里的分频器。可以选择不分频、2分频、4分频、8分频,最后CC1E位控制输出使能或失能。如果使能了输出,输入端产生指定的边沿信号,从引脚经过上图中层层电路,到达最后就可以让CNT的值转运到CCR里来。每捕获一次CNT的值都要把CNT清零一下,以便于下一次的捕获,在这里硬件电路就可以在捕获之后自动完成CNT的清零工作。
4.4 CNT清零工作描述
4.这个TI1FP1信号和TI1的边沿信号都可以通向从模式控制器,比如TI1FP1信号的上升沿触发捕获的同时还可以触发从模式,从模式里就有电路可以自动完成CNT的清零。由此看出从模式就是完成自动化操作的利器。
五、主从触发模式
这里的主从触发模式就是主模式、从模式、触发源选择这三个功能的简称。
5.1 主模式
主模式可以将定时器内部的信号映射到TRGO引脚,用于出发别的外设,所以这部分叫主模式。
5.2 从模式
从模式就是接收其他外设或者自身外设的一些信号,用于控制自身定时器的运行,也就是被别的信号控制。所以这部分叫从模式。
5.3 触发源选择
触发源选择就是选择从模式的触发信号源的,可以认为它是从模式的一部分。触发源选择可以选择指定的一个信号,得到TRGI,TRGI去触发从模式。从模式可以在图中从模式列表里选择一项操作来自动执行。
5.4 模式作用
如果让TI1FP1信号自动触发CNT清零,那触发源选择就可以选中TI1FP1,从模式执行的操作就可以选择执行Reset的操作。这样TI1FP1的信号就可以自动触发从模式,从模式自动清零CNT,实现硬件全自动测量。这就是主从触发模式的用途。
上图有各种主模式的解释,比如想设计定时器的级联,就可以选择一个定时器主模式输出更新信号到TRGO,另一个定时器选择上一个定时器触发从模式,从模式选择执行外部时钟模式1的操作。这样就能实现定时器的级联了。
主模式还可以选择复位、使能、比较脉冲和4个OCREF信号,作为TRGO的输出。可参考上图。
上图是从模式触发源的可选信号,可以选择其中信号触发从模式。
触发从模式后可以执行上图中的操作。如复位模式执行的操作是选中触发输入的上升沿重新初始化计数器,就是清零CNT的意思。
六、输入捕获基本结构
6.1 电路执行逻辑
这个结构只使用了一个通道,只能测量频率。
配置好时基单元,启动定时器。CNT就会在预分频之后的这个时钟驱动下不断自增,CNT就是测周法用来计数计时的器件,经过预分频之后这个位置的时钟频率就是驱动CNT的标准化频率fc。这里 标准频率 = 72M / 预分频系数。
输入捕获通道1的GPIO口输入图中左上角的一个方波信号,经过滤波器和边沿检测,选择TI1FP1为上升沿触发。经过滤波器和边沿检测之后的信号可分两路:
- 输入选择直连的通道,分频器选择不分频,当TI1FP1出现上升沿之后CNT的当前计数值转运到CCR1里。
- 同时触发源选择,选中TI1FP1为触发信号,从模式选择复位操作。这样TI1FP1的上升沿通过这一路可以去触发CNT清零。
当然CNT清零这里会有先后顺序,肯定是先转运CNT的值到CCR里去,再触发从模式给CNT清零。或者是非阻塞的同时转移,CNT的值转移到CCR,同时0转移到CNT里去。这么设计是避免先清零再捕获,避免捕获值都为0.
6.2 方波信号图
图中信号出现一个上升沿,CCR1=CNT,就是把CNT的值转运到CCR1里面去,这是输入捕获自动执行的。
然后CNT=0,清零计数器,这是从模式自动执行的。
之后在一个周期之内,CNT在标准时钟的驱动下不断自增,并且由于之前清零过了,所以CNT就是从上升沿开始,从0开始计数。一直++直到,下一次上升沿来临,然后执行相同的操作。CCR1=CNT,CNT=0。
注意第二次捕获的时候,CNT是第一次捕获一个周期的计数值。这个计数值就自动放在CCR1里面。等下一个周期继续同样的过程。CNT从0开始自增,直到下一个上升沿。这时CCR1刷新为第二个周期的计数值,之后不断重复这个过程。所以当这个电路工作时,CCR1的值始终保持为最新一个周期的计数值。这个计数值就是测周法里的N。由公式 fc/N 就是信号的频率。当需要读取信号的频率时,只需要读取CCR1得到N,再计算fc/N就行了;当不需要读取时,整个电路全自动的测量,不占用任何软件资源。
注意事项:
- CNT的值是有上限的。ARR一般设置为最大65535,CNT最大也只能计65535个数。如果信号频率太低,CNT计数值可能会溢出。
- 从模式触发源选择只有TI1FP1和TI2FP2,没有TI3和TI4的信号,所以如果想使用从模式自动清零CNT就只能用通道1和通道2,对于通道3和通道4就只能开启捕获中断,在中断里手动清零了。但是这样比较消耗软件资源。
七、PWMI基本结构
7.1 电路执行逻辑
PWMI模式使用了两个通道同时捕获一个引脚,可以同时测量周期和占空比。
上图和输入捕获基本结构比较只是下面多了一个通道。
首先,TI1FP1配置上升沿触发,触发捕获和清零CNT,正常的捕获周期。同时再加一个TI2FP2配置为下降沿触发,通过交叉通道,去触发通道2的捕获单元。
7.2 方波信号图
最开始上升沿,CCR1捕获,同时清零CNT,之后CNT一直++。在下降沿这个时刻,触发CCR2捕获,所以这时CCR2的值就是CNT从上升沿到下降沿之间高电平的计数值。CCR2捕获并不触发CNT清零,所以CNT继续++,直到下一次上升沿CCR1捕获周期,CNT清零。这样捕获之后,CCR1就是一整个周期的计数值;CCR2就是高电平期间的计数值。CCR2 / CCR1 就是占空比。
PWMI模式就是使用两个通道来捕获频率和占空比。
电路结构配置中可以两个通道同时捕获第一个引脚的输入,这样通道2只用到PWMI基本结构图中所示的一部分,另一部分没有用到;电路也可以配置两个通道同时捕获第二个引脚的输入,这样就是使用TI2FP1和TI2FP2这两个引脚。这两个输入可以灵活切换。
7.3 PWMI时序图
PWM 信号由输入通道 TI1 进入,配置 TI1FP1 为触发信号,上升沿捕获。当上升沿的时候 IC1 和 IC2 同时捕获,计数器 CNT 清零,到了下降沿的时候,IC2 捕获,此时计数器 CNT的值被锁存到捕获寄存器CCR2中,到了下一个上升沿的时候,IC1捕获,计数器CNT 的值被锁存到捕获寄存器 CCR1中。其中 CCR2+1 测量的是脉宽,CCR1+1测量的是周期。
这里要注意的是 CCR2 和 CCR1 的值在计算占空比和频率的时候都必须加 1,因为计数器是 从 0 开始计数的。
从软件上来说,用 PWM 输入模式测量脉宽和周期更容易,付出的代价是需要占用两 个捕获寄存器。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了输入捕获和PWM输入模式。