STM32输入捕获模式
STM32Cube学习之八:输入捕获

STM32Cube学习之八:输入捕获假设已经安装好STM32CubeMX和STM32CubeF4支持包。
Step1.打开STM32CubeMX,点击“New Project”,选择芯片型号,STM32F407ZETx。
Step2. 在Pinout界面下配置晶振输入引脚。
配置TIM2使用内部时钟源,CH1作为输入捕获通道,默认映射到PA0引脚。
配置TIM3使用内部时钟,CH1~CH4为PWM输出通道,默认映射引脚分别为PA6,PA7,PB0,PB1。
配置TIM4使用内部时钟,CH1,CH2为PWM输出通道,映射引脚分别为PD12,PD13。
配置串口,作为信息输出接口。
Step3.在Clock Configuration界面配置时钟源。
使用外部8M晶振作PLL时钟输入,并使用PLL输出作为系统时钟。
为了后面的计算方便,将系统时钟配置成160MHz。
Step4.配置外设参数。
在configuration界面中点击TIM2/ TIM3/ TIM4按钮,可以进入参数配置界面。
TIM2:在Parameter Settings页配置预分频系数为7,其计数时钟就是80MHz/(7+1)=10MHz。
计数周期(自动加载值),转换为十六进制形式,输入32bit最大值0xFFFFFFFF。
注意,TIM2的自动加载寄存器ARR和各个通道的捕获/比较寄存器CCRx都是32bit的。
在NVIC页面使能捕获/比较中断。
在GPIO页面设置捕获输入引脚下拉电阻,设置成上拉也可以,主要是为了使在没有信号输入时在输入引脚上得到稳定的电平。
TIM3:在Parameter页配置预分频系数为7,计数周期(自动加载值)为9999。
其溢出频率就是80MHz/(7+1)/(9999+1)=1kHz,这就是TIM3各通道输出的PWM信号的频率。
各通道输出PWM的占空比参数如上图红框标注,其他参数使用默认值。
按照图中参数,CH1~CH4输出的PWM周期都是1ms,而高电平时间分别是123.4us,234.5us,567.8us,678.9us。
STM32(十八)输入捕获应用

STM32(⼗⼋)输⼊捕获应⽤
输⼊捕获⼀般应⽤在两个⽅⾯:
脉冲跳变沿时间测量
PWM输⼊测量
1、测量频率
当捕获通道TIx.上出现上升沿时,发⽣第⼀次捕获,计数器CNT的值会被锁存到捕获寄存器CCR中,⽽且还会进⼊捕获中断,在中断服务程序中记录⼀-次捕获(可以⽤⼀个标志变量来记录),并把捕获寄存器中的值读取到valuel 中。
当出现第⼆次上升沿时,发⽣第⼆次捕获,计数器CNT的值会再次被锁存到捕获寄存器CCR中,并再次进⼊捕获中断,在捕获中断中,把捕获寄存器的值读取到value3中,并清除捕获记录标志。
利⽤value3和valuel的差值我们就可以算出信号的周期(频率)。
2、测量脉宽
当捕获通道TIx.上出现上升沿时,发⽣第⼀次捕获,计数器CNT的值会被锁存到捕获寄存器CCR中,⽽且还会进⼊捕获中断,在中断服务程序中记录⼀次捕获(可以⽤⼀个标志变量来记录),并把捕获寄存器中的值读取到valuel 中。
然后把捕获边沿改变为下降沿捕获,⽬的是捕获后⾯的下降沿。
当下降沿到来的时候,发⽣第⼆次捕获,计数器CNT的值会再次被锁存到捕获寄存器CCR中,并再次进⼊捕获中断,在捕获中断中,把捕获寄存器的值读取到value3 中,并清除捕获记录标志。
然后把捕获边沿设置为上升沿捕获。
在测量脉宽过程中需要来回的切换捕获边沿的极性,如果测量的脉宽时间⽐较长,定时器就会发⽣溢出,溢出的时候会产⽣更新中断,我们可以在中断⾥⾯对溢出进⾏记录处理。
STM32输入捕获模式

STM32输入捕获模式
在输入捕获模式下,定时器将统计外部信号的上升沿或下降沿出现的
时间,并将统计结果保存在相关的寄存器中。
用户可以根据需要选择统计
上升沿还是下降沿,并可以选择计数溢出时是否复位计数器。
1.选择定时器和通道:根据实际需求选择合适的定时器和通道。
一般
来说,每个定时器都有多个通道可以配置为输入捕获模式。
2.配置定时器:根据测量的要求配置定时器的工作模式、计数方向和
预分频系数等。
定时器的配置将影响捕获的精度和测量范围。
3.配置输入捕获:选择捕获触发源,可以选择外部信号引脚或其他定
时器的输出作为触发源。
配置捕获触发源时还可以选择捕获的边沿类型
(上升沿或下降沿)和是否复位计数器。
4.开启定时器:配置完成后,通过使能相关的定时器和通道将输入捕
获模式启用。
5.捕获外部信号:当捕获触发源产生触发信号时,定时器将开始计数,当捕获到外部信号的边沿时,定时器会自动将计数值保存在指定的寄存器中。
6.读取测量结果:根据所选择的定时器和通道,从相关的寄存器中读
取测量结果,可以通过计算得到所需的参数,比如周期、脉宽等。
输入捕获模式在很多应用中都是非常常见且重要的。
例如在测量旋转
编码器的位置和速度时,可以使用输入捕获模式来捕获编码器的A相和B
相信号,并通过计算来确定位置和速度。
此外,输入捕获模式还可以用于
测量外部信号的频率、测量脉冲信号的宽度等。
总之,STM32输入捕获模式是一种功能强大且灵活的功能,能够帮助用户实现对外部信号的精确测量和控制。
通过合理配置和使用,可以满足各种不同的应用需求。
stm32PWM输入捕获

stm32PWM输入捕获tm32定时器pwm输入捕获输入捕捉的功能是记录下要捕捉的边沿出现的时刻,如果你仅仅捕捉下降沿,那么两次捕捉的差表示输入信号的周期,即两次下降沿之间的时间。
如果要测量低电平的宽度,你应该在捕捉到下降沿的中断处理中把捕捉边沿改变为上升沿,然后把两次捕捉的数值相减就得到了需要测量的低电平宽度。
如果要的测量低电平太窄,中断中来不及改变捕捉方向时,或不想在中断中改变捕捉方向,则需要使用PWM输入模式,或使用两个TIM某通道,一个通道捕捉下降沿,另一个通道捕捉上升沿,然后对两次捕捉的数值相减。
PWM输入模式也是需要用到两个通道。
使用两个通道时,最好使用通道1和通道2,或通道3和通道4,这样上述功能只需要使用一个I/O管脚,详细请看STM32技术参考手册中的TIM某框图。
//0-----------------------一、概念理解PWM输入捕获模式是输入捕获模式的特例,自己理解如下1.每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。
且IC1IC2一组,IC3IC4一组。
并且可是设置管脚和寄存器的对应关系。
2.同一个TI某输入映射了两个IC某信号。
3.这两个IC某信号分别在相反的极性边沿有效。
4.两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。
5.当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。
6.同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)7.由此可以计算出PWM的时钟周期和占空比了frequency=f(TIM时钟频率)/n。
dutycycle=(高电平计数个数/n),若m为高电平计数个数,则dutycycle=m/n若m为低电平计数个数,则dutycycle=(n-m)/n 注:因为计数器为16位,所以一个周期最多计数65535个,所以测得的最小频率=TIM时钟频率/65535。
STM32输入捕获

输入捕获模式可以用来测量脉冲宽度或者测量频率。
STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。
STM32的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存(TIMx_CCRx)里面,完成一次捕获。
同时还可以配置捕获时是否触发中断/DMA 等. 例如:我们用到TIM5_CH1来捕获高电平脉宽,也就是要先设置输入捕获为上升沿检测,记录发生上升沿的时候TIM5_CNT的值。
然后配置捕获信号为下降沿捕获,当下降沿到来时,发生捕获,并记录此时的TIM5_CNT值。
这样,前后两次TIM5_CNT之差,就是高电平的脉宽,同时TIM5的计数频率我们是知道的,从而可以计算出高电平脉宽的准确时间。
首先TIMx_ARR和TIMx_PSC,这两个寄存器用来设自动重装载值和TIMx的时钟分频。
再来看看捕获/比较模式寄存器1:TIMx_CCMR1,这个寄存器在输入捕获的时候,非常有用;TIMx_CCMR1明显是针对2个通道的配置,低八位[7:0]用于捕获/比较通道1的控制,而高八位[15:8]则用于捕获/比较通道2的控制,因为TIMx还有CCMR2这个寄存器,所以可以知道CCMR2是用来控制通道3和通道4(详见《STM32参考手册》290页,14.4.8节)。
这里用到TIM5的捕获/比较通道1,我们重点介绍TIMx_CMMR1的[7:0]位(其实高8位配置类似)。
再来看看捕获/比较使能寄存器:TIMx_CCER;接下来我们再看看DMA/中断使能寄存器:TIMx_DIER,我们需要用到中断来处理捕获数据,所以必须开启通道1的捕获比较中断,即CC1IE设置为1。
控制寄存器:TIMx_CR1,我们只用到了它的最低位,也就是用来使能定时器的;最后再来看看捕获/比较寄存器1:TIMx_CCR1,该寄存器用来存储捕获发生时,TIMx_CNT的值,我们从TIMx_CCR1就可以读出通道1捕获发生时刻的TIMx_CNT值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度。
深入理解STM32定时器中的输入捕获滤波器

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } void NVIC_Configure(void) { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* TIM3_CC_IRQHandler */ NVIC_InitStruct.NVIC_IRQChannel =TIM3_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } #define ARR void Tim_Configure( void ) { TIM_TimeBaseInitTypeDef TIM_OCInitTypeDef TIM_ICInitTypeDef //1800, 2000, 2048, 2057
void GPIO_Configure(void) { GPIO_InitTypeDef GPIO_InitStructure; /* 设 置 USART1 复 用 端 ----------------------------------------------------- */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /* TXD */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /* RXD */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 口
理解STM32定时器中的输入捕获滤波器

理解STM32定时器中的输入捕获滤波器关于STM32定时器中的输入捕获滤波器的功能描述,在中文参考手册中描述如下:我不理解官方的说明,在网上搜了老半天,基本都是下面这几句话:1)当滤波器连续采样到N次个有效电平时,认为一次有效的输入电平。
2)该数字滤波器实际上是个事件计数器,它记录到N个事件后会产生一个输出的跳变。
例如:当f(CK_INT) = 72MHz, CKD[1:0] = 01时,选择f(DTS) = f(CK_INT)/2 = 36MHz;而ETF[3:0] = 0100,则采样频率f(SAMPLI NG) = f(DTS) / 2 = 18MHz, N = 6,此时高于3M Hz的信号将被这个滤波器滤除,这样就有效地屏蔽了高于3MHz的干扰。
看了这些说法,我还是不理解这个数字滤波器到底是如何工作的,问题如下:问题1:当滤波器连续采样到N次个有效电平时,是输出这个电平?还是输出一个跳变?问题2:当滤波器没有连续采样到N次个有效电平时,输出是的什么?带着这两个问题,我们来分析一下,下面以TIM3为例:首先可以肯定输入捕获过程如下:详细信息见参考手册中的14.2节,通用定时器框图TIM3_C H1(PA.6) ----> TI1(外部信号) -------> 输入滤波器I C1F[3:0] -----> IC1(滤波器输出信号) -------> 输入捕获预分频器IC1PSC[1:0] ----> 捕获/比较1寄存器CCR1从上面的过程可以知道,1)发生输入捕获所需要的跳变沿是由滤波器输出产生的。
2)滤波器和预分频器可软件编程,如果IC1F[3:0] = 0x0,则滤波器全通,即TI1 和IC1是同一个信号。
STM32定时器输入捕获模式测频率

频)72M/2M //以 2MHz 计数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//向上计数
TIM_TimeBaseStructure.TIM_Period = 65535;
//装载值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
/* Get the Input TIM2IC_ReadValue value */ TIM2IC_ReadValue2[0] = TIM_GetCapture1(TIM2);
/* TIM2IC_ReadValue computation */ if (TIM2IC_ReadValue2[0] > TIM2IC_ReadValue1[0]) {
TIM2Capture[0] = (TIM2IC_ReadValue2[0] - TIM2IC_ReadValue1[0]); } else {
TIM2Capture[0] = ((0xFFFF - TIM2IC_ReadValue1[0]) + TIM2IC_ReadValue2[0]); } /* Frequency computation */ Frequency0= 2000000/ TIM2Capture[0];// 计算频率=2MHz/时钟计数 IM2CaptureNumber[0] = 0; TIM_ITConfig(TIM2, TIM_IT_CC1, DISABLE); } } else if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == SET) { /* Clear TIM3 TIM2IC_ReadValue compare interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
输入捕获模式
库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\I nputCapture
在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。
当捕获事件发生时,相应的CCxIF标志(TIMx_SR寄存器)被置’1’,如果使能了中断或者DMA操作,则将产生中断或者DMA操作。
在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。
PWM输入模式
库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\P WM_Input
该模式是输入捕获模式的一个特例
例如,你需要测量输入到TI1上的PWM信号的长度(TIMx_CCR1寄存器)和占空比(TIMx_CCR2寄存器),具体步骤如下(取决于CK_INT的频率和预分频器的值)
● 选择TIMx_CCR1的有效输入:置TIMx_CCMR1寄存器的CC1S=01(选择TI1)。
● 选择TI1FP1的有效极性(用来捕获数据到TIMx_CCR1中和清除计数器):置CC1P=0(上升沿有效)。
● 选择TIMx_CCR2的有效输入:置TIMx_CCMR1寄存器的CC2S=10(选择TI1)。
● 选择TI1FP2的有效极性(捕获数据到TIMx_CCR2):置CC2P=1(下降沿有效)。
● 选择有效的触发输入信号:置TIMx_SMCR寄存器中的TS=101(选择TI1FP1)。
● 配置从模式控制器为复位模式:置TIMx_SMCR中的SMS=100。
● 使能捕获:置TIMx_CCER寄存器中CC1E=1且CC2E=1。
由于只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1 /TIMx_CH2信号。
强置输出模式
在输出模式(TIMx_CCMRx寄存器中CCxS=00)下,输出比较信号(OCxREF和相应的OCx)能够直接由软件强置为有效或无效状态,而不依赖于输出比较寄存器和计数器间的比较结果。
例如:CCxP=0(OCx高电平有效),则OCx被强置为高电平。
置TIMx_CCMRx 寄存器中的OCxM=100,可强置OCxREF信号为低。
输出比较模式
此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。
当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作:
● 将输出比较模式(TIMx_CCMRx寄存器中的OCxM位)和输出极性(TIMx_CCER 寄存器中的CCxP位)定义的值输出到对应的引脚上。
在比较匹配时,输出引脚可以保持它的电平(OCxM=000)、被设置成有效电平(OCxM=001)、被设置成无效电平(OCxM=010)或进行翻转(OCxM=011)。
● 设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。
● 若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCxIE位),则产生一个中断。
● 若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器
中的CCDS位选择DMA请求功能),则产生一个DMA请求。
输出比较模式的配置步骤:
1. 选择计数器时钟(内部,外部,预分频器)
2. 将相应的数据写入TIMx_ARR和TIMx_CCRx寄存器中
3. 如果要产生一个中断请求和/或一个DMA请求,设置CCxIE位和/或CCxDE 位。
4. 选择输出模式,例如当计数器CNT与CCRx匹配时翻转OCx的输出引脚,CCRx 预装载未用,开启OCx输出且高电平有效,则必须设置OCxM=’011’、OCxPE=’0’、CCxP=’0’和CCxE=’1’。
5. 设置TIMx_CR1寄存器的CEN位启动计数器
PWM 模式
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx 寄存器确定占空比的信号。
在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。
必须设置TIMx_CCMRx 寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。
下面是一个PWM模式1的例子。
当TIMx_CNT<TIMx_CCRx时PWM信号参考
OCxREF为高,否则为低。
如果TIMx_CCRx中的比较值大于自动重装载值(TIMx_ARR),则OCxREF保持为’1’。
如果比较值为0,则OCxREF保持为’0’。
下图为TIMx_ARR=8时边沿对齐的PWM波形实例。
单脉冲模式
单脉冲模式(OPM)是前述众多模式的一个特例。
这种模式允许计数器响应一个激励,并在一个程序可控的延时之后,产生一个脉宽可程序控制的脉冲。
可以通过从模式控制器启动计数器,在输出比较模式或者PWM模式下产生波形。
设置TIMx_CR1寄存器中的OPM位将选择单脉冲模式,这样可以让计数器自动地在产生下一个更新事件UEV时停止。
仅当比较值与计数器的初始值不同时,才能产生一个脉冲。
启动之前(当定时器正在等待触发),必须如下配置:
向上计数方式:CNT < CCR x ≤ ARR (特别地,0 < CCRx),向下计数方式:CNT > CCRx。
编码器接口模式
两个输入TI1和TI2被用来作为增量编码器的接口。
参看表77,假定计数器已经启动(TIMx_CR1寄存器中的CEN=’1’),计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动。
TI1FP1和TI2FP2是TI1和TI2在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则TI1FP1=TI1,TI2FP2=TI2。
根据两个输入信号的跳变顺序,产生了计数脉冲和方向信号。
依据两个输入信号的跳变顺序,计数器向上或向下计数,同时硬件对TIMx_CR1寄存器的DIR位进行相应的设置。
不管计数器是依靠TI1计数、依靠TI2计数或者同时依靠TI1和TI2计数。
在任一输入端(TI1或者TI2)的跳变都会重新计算DIR位。
编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。
这意味着计数器只在0到TIMx_ARR寄存器的自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计数)。
所以在开始计数之前必须配置TIMx_ARR;同样,捕获器、比较器、预分频器、触发输出特性等仍工作如常。
在这个模式下,计数器依照增量编码器的速度和方向被自动的修改,因此计数器的内容始终指示着编码器的位置。
计数方向与相连的传感器旋转的方向对应。
下表列出了所有可能的组合,假设TI1和TI2不同时变换。
下图是一个计数器操作的实例,显示了计数信号的产生和方向控制。
它还显示了当选择了双边沿时,输入抖动是如何被抑制的;抖动可能会在传感器的位置靠近一个转换点时产生。
在这个例子中,我们假定配置如下:
● CC1S=’01’ (TIMx_CCMR1寄存器,IC1FP1映射到TI1)
● CC2S=’01’ (TIMx_CCMR2寄存器,IC2FP2映射到TI2)
● CC1P=’0’ (TIMx_CCER寄存器,IC1FP1不反相,IC1FP1=TI1)
● CC2P=’0’ (TIMx_CCER寄存器,IC2FP2不反相,IC2FP2=TI2)
● SMS=’011’ (TIMx_SMCR寄存器,所有的输入均在上升沿和下降沿有效).
● CEN=’1’ (TIMx_CR1寄存器,计数器使能)
TIM 与Hall接口
霍尔传感器位于三相电机。