当前位置:首页 >> 能源/化工 >>

STM32的捕获模式应用


STM32 捕获模式应用。。。。。 1、stm32 脉冲方波捕获 脉冲方波长度捕获 a)目的:基础 PWM 输入也叫捕获,以及中断配合应用。使用前一章的输出管脚 P B1(19 脚),直接使用跳线连接输入的 PA3(13 脚),配置为 TIM2_CH4,进行 实验。 b)对于简单的 PWM 输入应用,暂时无需考虑 TIM1 的高级功能之区别,按照目前 我的应用目标其实只需要采集高

电平宽度,而不必知道周期,所以并不采用 PWM 输入模式,而是普通脉宽捕获模式。 c)初始化函数定义: void TIM_Configuration(void); d)初始化函数调用: TIM_Configuration(); //TIM 初始化函数调用 //定义 TIM 初始化函数

e)初始化函数,不同于前面模块,TIM 的 CAP 初始化分为三部分——计时器基本 初始化、通道初始化和时钟启动初始化: void TIM_Configuration(void)//TIM2 的 CAP 初始化函数 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器初始化结构

TIM_ICInitTypeDef TIM_ICInitStructure; 构

//通道输入初始化结

//TIM2 输出初始化 TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 5; TIM_TimeBaseStructure.TIM_ClockDivision = 0; //周期 0~FFFF //时钟分频 //时钟分割

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式
1

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//基本初始化

//TIM2 通道的捕捉初始化 TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;//通道选择 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;//下降 沿 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;// 管脚与寄存器对应关系 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频器 TIM_ICInitStructure.TIM_ICFilter = 0x4; 个周期跳变认定波形稳定 0x0~0xF TIM_ICInit(TIM2, &TIM_ICInitStructure); //滤波设置,经历几

//初始化

TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);

//选择时钟触发源

TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);//触发方式 TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //启 动定时器的被动触发 TIM_ITConfig(TIM2, TIM_IT_CC4, ENABLE); //打开中断

TIM_Cmd(TIM2, ENABLE); }

//启动 TIM2

f)RCC 初始化函数中加入 TIM 时钟开启: RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM3, ENABLE);
2

g)GPIO 里面将输入和输出管脚模式进行设置。IN_FLOATING,50MHz。 h)使用中断的话在 NVIC 里添加如下代码: //打开 TIM 中断(与前一章相同) NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

i)简单应用: 变量 = TIM_GetCapture4(TIM2); j)注意事项: i.由于我的需求只跟高电平宽度有关,所以避免了使用 PWM 输入模式,这样可以 每个管脚捕捉一路信号。如果使用 PWM 模式,每一路需要占用两个寄存器,所以 一个定时器只能同时使用两路 PWM 输入。 ii.由于捕捉需要触发启动定时器,所以 PWM 输出与捕捉不容易在同一个 TIM 通 道上实现。如果必须的话只能增加计数溢出的相关代码。 iii.有些程序省略了捕捉通道的初始化代码,这是不对的 iv.在基本计时器初始化代码里面注意选择适当的计数器长度,最好让波形长度 不要长于一个计数周期, 否则需要增加溢出代码很麻烦。一个计数周期的长度计 算跟如下几个参数有关: (1) RCC 初始化代码里面的 RCC_PCLKxConfig,这是 TIM 的基础时钟源与系统时 钟的关系。 (2)TIM 初始化的 TIM_Period,这是计数周期的值 (3)TIM 初始化的 TIM_Prescaler,这是计数周期的倍频计数器,相当于调节计 数周期,可以使 TIM_Period 尽量大,提高计数精度。

2、使用 STM32 的 TIMER 捕获功能,求取输入 PWM 信号的周期,误差很大,
3

请求解决! 使用的是 TIMER2 的 CH1 通道,PWM 信号接在 PA0 脚。输入 PWM 的周期信 号为 100Hz,根据捕获值计算出来却是 105Hz,这误差也太大了吧!!哪位高 手知道是什么原因呀,指点一下呀,万分感谢呀!! 下面是我的相关部分程序: 1、时钟部分,TIMER2 的时钟频率,我是初始化为 36M. RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速 AHB 时钟=系统 时钟/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 倍 频系数为 9 PLLCLK=8*9=72 2、TIMER 初始化 TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_Prescaler = 18; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV4; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_PWMIConfig(TIM2, &TIM_ICInitStructure); TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); 模式为从模式 TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //使能主从模式

//复位

TIM_Cmd(TIM2, ENABLE); //使能 TIM2 计数器 TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE); //使能 CC2 中断请求 3、TIMER 中断处理 void TIM2_IRQHandler(void) { /* Clear TIM2 Capture compare interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); /* Get the Input Capture value */ IC2_Value = TIM_GetCapture2(TIM2);

3、STM32

TIM 输入捕获模式记录
4

调试的过程中,总能遇到一些问题,很庆幸能遇到那么多的问题,也许这就是最 好的学习过程: 继续我的笔记: 在 main 函数中,文件名:main.c 对 TIM2 的 CH1,CH2 配置如下: TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; 置为输入捕获模式 TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; 通道 1 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

//配 //选择 //输入上 // 通道 //每次

升沿捕获 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; 方向选择 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; 检测到捕获输入就触发一次捕获 TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_ICInit(TIM2, &TIM_ICInitStructure); //

TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; //配置为 输入捕获模式 TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //选择 通道 2 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上 升沿捕获 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 通道 方向选择 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每次 检测到捕获输入就触发一次捕获 TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_ICInit(TIM2, &TIM_ICInitStructure); //

TIM1->PSC = 10; //由于要测量的信号频率为 200-1000HZ 采取 10 倍的预 分频 TIM2->PSC = 10; //如果不分频最小的频率为 1100hz, 分频后可以测量的频
5

率为 110HZ,为了达到最佳捕捉效果,且满足要求建议分频系数设为 6; /* Select the TIM2 Input Trigger: TI2FP2 【输入触发源选择】*/ TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1); //参考 TIM 结 构图选择滤波后的 TI2 输入 寄存器 SMCR /* Select the slave Mode: Reset Mode */ TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //复位模式-选 中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号 /* Enable the Master/Slave Mode */ TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable); /主从模式选择

/

说说我要测量两路信号频率的思路吧:
我想把两路信号跟别加到 TIM2 的 CH1 跟 CH2 上面去,然后通过 TI1FP1 跟 TI 2FP2 轮流触发 ,TIM2->CCR1 与 TIM2->CCR2 记录下来的数据就是信号的周 期,接着根据具体的情况计算出信号的频率。那么,究竟是怎么实现 TI1FP1 跟 TI2FP2 轮流触发呢?这就是 DMA 的问题了,当信号的周期被 TIM2->CRRx 收 到, DMA 就会将这个数据送到一个存储器区。 DMA 传输完数据后就会发生中断, 我在 DMA 传输中断函数中修改触发信号源。 比如说 DMA-CH5 传输到是 TIM2->CRR1 他的中断函数如下: void DMAChannel5_IRQHandler(void) { if (DMA_GetITStatus(DMA_IT_TC5) != RESET) { DMA_ClearITPendingBit(DMA_IT_TC5); /* Select the TIM2 Input Trigger: TI2FP2 【输入触发源选择】*/ TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2); 上句就是修改触发源轮流触发 } } 但是实验的过程中发现 两个通道所测量得到信号的周期 怎么着都只有一组是 正确 例如:
6

最后通过高人的指点才发现: 原来这个定时器只有一个 COUNT(计数器) 当我选择执行 TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);这个函 数,问题就来了,当一路有信号触发,count 复位,那么另一路永远也得不到正 确的值。。所以测量信号频率还有待改良。

4、STM32

的定时器--输入捕捉模式

调试 STM32 的定时器好几天了,也算是对 STM32 的定时器有了点清楚的 认识了。 我需要测量 4 路信号的频率然后通过 DMA 将信号的频率传输到存储器 区域,手册说的很明白每个定时器有 4 个独立通道。然后我就想能不能将这 4 路信号都连接到一个定时器的 4 个通道上去。理论上应该是行的通的。刚开始俺 使用的是 TIM2 的 1 2 3 通道,TIM4 的 2 通道来进行频率的测量。由于没有频率 发生器,所以我用 tim3 作为信号源,用 TIM2,TIM4 来进行测量就 ok 了。 请看一开始的程序,以 TIM2 的 1,3 通道为例子:
7

TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; 输入捕获模式 TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; 1 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; 升沿捕获 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; 方向选择 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; 测到捕获输入就触发一次捕获 TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; 输入捕获模式 TIM_ICInitStructure.TIM_Channel = TIM_Channel_3; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; 升沿捕获 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; 检测到捕获输入就触发一次捕获 TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_ICInit(TIM2, &TIM_ICInitStructure); 这个是输入捕获配置 还需要做的工作就是(参考 stm32 参考手册的 TIM 的结构框图) : /* Select the TIM2 Input Trigger: TI2FP2 【输入触发源选择】*/ TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); 结构图选择滤波后的 TI1 输入作为触发源,触发下面程序的复位 // //

//配置为

//选择通道

//输入上

// 通道

//每次检

//配置为

//选择通道 3 //输入上

// //每次

//参考 TIM

8

/* Select the slave Mode: Reset Mode */ TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //复位模式-选

中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号 /* Enable the Master/Slave Mode */ TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //主从模式选择 这样我们就可以很轻松的就得到了 连接在 TIM2 的通道 1 上的信号的频率, 但是 3 通道的频率的值永远都是跳动的不准,测试了半天也没有找到根本原因, 请看 TIM 的结构框图的一部分

红色箭头所指,这才找到原因,触发的信号源只有这四种,而通道 3 上的计 数器的值不可能在接受到信号的上升沿时候,有复位这个动作,找到原因了。这 就是 3 通道上的数据不停跳动的原因,要想的到信号的频率也是有办法的,可以 取连续两次捕捉的值之差, 这个值就是信号的周期,自己根据实际情况去算频率 吧。 有以上可以得到: stm32 的 TIM 的四个通道可以同时配置成输入捕捉模式,但是计算 CH3, CH4 信号的频率步骤有点繁琐(取前后捕捉的差值) ,但是他的 CH1,和 CH2 可以轻松得到: 通道 1
9

/* Select the TIM2 Input Trigger: TI2FP2 【输入触发源选择】*/ TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); 结构图选择滤波后的 TI1 输入作为触发源,触发下面程序的复位 /* Select the slave Mode: Reset Mode */ TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //复位模式-选 //参考 TIM

中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号 TIMx->CRR1 的值即为信号的周期 通道 2: TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2); 结构图选择滤波后的 TI1 输入作为触发源,触发下面程序的复位 /* Select the slave Mode: Reset Mode */ TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //复位模式-选 //参考 TIM

中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号 TIMx->CRR2 的值即为信号的周期 笔记记得不是太好,还希望对调试这部分的朋友有所帮助!

10


相关文章:
STM32的捕获模式应用
(TIM2); 3、STM32 TIM 输入捕获模式记录 4 调试的过程中,总能遇到一些问题,很庆幸能遇到那么多的问题,也许这就是最 好的学习过程: 继续我的笔记: 在 main...
stm32 pwm输入捕捉模式学习笔记
stm32 pwm 输入捕捉模式学习笔记(本文来自:android_chunhui 的博客) PWM 输入是输入捕获的一个特殊应用,输入捕获就是当连接到定时器的引脚上产生电平变化时对应的...
STM32输入捕获模式
STM32输入捕获模式_工学_高等教育_教育专区。STM32定时器应用输入捕获模式 库函数例程位置: STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examp...
输入捕获模式理解
输入捕获模式理解_电子/电路_工程科技_专业资料。STM32 输入捕获模式理解在C 博客里面看到一篇对输入捕获模式理解的文档,感觉很好, 因此复制过来,以增加理解 内容如...
STM32 输入捕获和输出比较
有以上可以得到: stm32 的 TIM2 的四个通道可以同时配置成输入捕捉模式, 但是...特别是对广大电子 DIY 爱好者的应用: 智能小车的电机控制:我们可以利用 pwm 来...
STM32输入捕获简介
STM32输入捕获简介_计算机软件及应用_IT/计算机_专业资料。STM32 输入捕获简介输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,...
用STM32触发捕捉实现高速高精度测频
STM32触发捕捉实现高速高精度测频_计算机软件及应用_IT/计算机_专业资料。用 STM32 触发捕捉实现高速高精度测频黄春平 中山职业技术学院电子信息工程系,中山 528...
stm32 PWM输入捕获
stm32 定时器 pwm 输入捕获 输入捕捉的功能是记录下要捕捉的边沿出现的时刻, ...为输入捕获模式的出现的问题 技术类别:ARM 2008-10-14 19:14:10 在应用的...
STM32F407通用定时器输入捕获
STM32F407通用定时器输入捕获_电子/电路_工程科技_专业资料。STM32F407通用定时...输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图...
STM32输入捕获控制测量频率方法程序
STM32输入捕获控制测量频率方法程序_电子/电路_工程科技_专业资料。stm32 输入捕获配置 void TIM3_Confguration() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure...
更多相关标签:
stm32捕获模式测频率 | stm32捕获模式 | stm32输入捕获测频率 | stm32定时器输入捕获 | stm32 输入捕获 | stm32 pwm捕获 | stm32f103输入捕获pwm | stm32脉冲捕获计数 |