单片机学习!
目录
文章目录
前言
一、输入捕获
1.1 输入捕获简介
1.2 输出比较和输入捕获执行逻辑的对比:
1.2.1 输出比较
1.2.2 输入捕获
1.2.3 输出比较和输入捕获对比总结
1.3 输入捕获作用
1.4 三种定时器的输入捕获通道分布
1.5输入捕获的PWMI模式和主从触发模式简介
二、频率测量
2.1 测量信号类型
2.2 测量信号方法
2.2.1 测频法
2.2.2 测周法
2.2.3 测频法与测周法对比
2.3 中界频率
2.4 STM32实现信号测量
三、输入捕获电路
3.1 输入捕获引脚
3.2 异或门和数据选择器
3.3 输入滤波器和边沿检测器
3.4 预分频器
3.5 举例
四、输入捕获通道
4.1 滤波器
4.2 边沿检测
4.3 分频器
4.4 CNT清零工作描述
五、主从触发模式
5.1 主模式
5.2 从模式
5.3 触发源选择
5.4 模式作用
六、输入捕获基本结构
6.1 电路执行逻辑
6.2 方波信号图
七、PWMI基本结构
7.1 电路执行逻辑
7.2 方波信号图
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输入模式。