云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > stm32 PWM输入捕获

stm32 PWM输入捕获

  • 62 次阅读
  • 3 次下载
  • 2025/5/31 14:22:26

stm32 定时器pwm输入捕获

输入捕捉的功能是记录下要捕捉的边沿出现的时刻,如果你仅仅捕捉下降沿,那么两次捕捉的差表示输入信号的周期,即两次下降沿之间的时间。

如果要测量低电平的宽度,你应该在捕捉到下降沿的中断处理中把捕捉边沿改变为上升沿,然后把两次捕捉的数值相减就得到了需要测量的低电平宽度。

如果要的测量低电平太窄,中断中来不及改变捕捉方向时,或不想在中断中改变捕捉方向,则需要使用PWM输入模式,或使用两个TIMx通道,一个通道捕捉下降沿,另一个通道捕捉上升沿,然后对两次捕捉的数值相减。PWM输入模式也是需要用到两个通道。使用两个通道时,最好使用通道1和通道2,或通道3和通道4,这样上述功能只需要使用一个I/O管脚,详细请看STM32技术参考手册中的TIMx框图。 //0----------------------- 一、概念理解

PWM输入捕获模式是输入捕获模式的特例,自己理解如下

1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。 2. 同一个TIx输入映射了两个ICx信号。 3. 这两个ICx信号分别在相反的极性边沿有效。

4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。

5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。

6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)

7. 由此可以计算出PWM的时钟周期和占空比了 frequency=f(TIM时钟频率)/n。 duty cycle=(高电平计数个数/n), 若m为高电平计数个数,则duty cycle=m/n 若m为低电平计数个数,则duty cycle=(n-m)/n

注:因为计数器为16位,所以一个周期最多计数65535个,所以测得的最小频率=TIM时钟频率/65535。 二、程序设计与分析

1. 程序概述:选择TIM3作为PWM输入捕获。IC2设置为上升沿,并设置为有效的触发输入信号。所以IC2的捕获寄存器捕获PWM周期,

IC1的捕获寄存器捕获PWM的高电平周期。 2.程序代码如下:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //时钟配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_7; //GPIO配置 PIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel= TIM3_IRQn; //NVIC配置 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1; NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE; NVIC_Init(&NVIC_InitStructure);

TIM_ICInitStructure.TIM_Channel =TIM_Channel_2; //通道选择 TIM_ICInitStructure.TIM_ICPolarity= TIM_ICPolarity_Rising; //上升沿触发

TIM_ICInitStructure.TIM_ICSelection= TIM_ICSelection_DirectTI; //管脚与寄存器对应关系 TIM_ICInitStructure.TIM_ICPrescaler= TIM_ICPSC_DIV1; //输入预分频。意思是控制在多少个输入周期做一次捕获,如果

//输入的信号频率没有变,测得的周期也不会变。比如选择4分频,则每四个输入周期才做一次捕获,这样在输入信号变化不频繁的情况下, //可以减少软件被不断中断的次数。

TIM_ICInitStructure.TIM_ICFilter= 0x0; //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF

TIM_PWMIConfig(TIM3,&TIM_ICInitStructure); //根据参数配置TIM外设信息 TIM_SelectInputTrigger(TIM3,TIM_TS_TI2FP2); //选择IC2为始终触发源

TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件

TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable); //启动定时器的被动触发

TIM_Cmd(TIM3,ENABLE); //启动TIM2 TIM_ITConfig(TIM3,TIM_IT_CC2, ENABLE); //打开中断 中断处理函数

voidTIM3_IRQHandler(void) {

TIM_ClearITPendingBit(TIM3,TIM_IT_CC2); //清楚TIM的中断待处理位

IC2Value =TIM_GetCapture2(TIM3); //读取IC2捕获寄存器的值,即为PWM周期的计数值 if (IC2Value != 0) {

DutyCycle= (TIM_GetCapture1(TIM3) * 100) / IC2Value; //读取IC1捕获寄存器的值,并计算占空比

Frequency= 72000000 / IC2Value; //计算PWM频率。 } else {

DutyCycle= 0; Frequency= 0; } }

注(一):若想改变测量的PWM频率范围,可将TIM时钟频率做分频处理 TIM_TimeBaseStructure.TIM_Period= 0xFFFF; //周期0~FFFF

TIM_TimeBaseStructure.TIM_Prescaler = 5; //时钟分频,分频数为5+1即6分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割

TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;//模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//基本初始化

注(二):定时器TIM的倍频器X1或X2。在APB分频为1时,倍频值为1,否则为2

、、

---------------------------------------------------------------------------------------=============================================

再来看看捕获/比较模式寄存器 1:TIMx_CCMR1,这个寄存器在输入捕获的时候,非常有 用,有必要重新介绍,该寄存器的各位描述如图 15.1.1 所示: 图 15.1.1 TIMx_CCMR1 寄存器各位描述

当在输入捕获模式下使用的时候,对应图 15.1.1 的第二行描述,从图中可以看出,

TIMx_CCMR1 明显是针对 2 个通道的配置,低八位[7:0]用于捕获/比较通道 1 的控制,而高八

位[15:8]则用于捕获/比较通道 2 的控制,因为 TIMx 还有 CCMR2 这个寄存器,所以可以知道

CCMR2 是用来控制通道 3 和通道 4(详见《STM32 参考手册》290 页,14.4.8 节) 。

//==============================================================================================================

其中 CC1S[1:0],这两个位用于 CCR1 的通道配置,这里我们设置 IC1S[1:0]=01,也就是配 置 IC1 映射在 TI1 上(关于 IC1,TI1 不明白的,可以看《STM32 参考手册》14.2 节的图 98- 通用定时器框图) ,即 CC1 对应 TIMx_CH1。

//=========================================================================================================================

输入捕获 1 预分频器 IC1PSC[1:0],这个比较好理解。我们是 1 次边沿就触发 1 次捕获,所 以选择 00 就是了。

输入捕获1滤波器IC1F[3:0], 这个用来设置输入采样频率和数字滤波器长度。 其中, 是定时器的输入频率(TIMxCLK) ,一般为 72Mhz,而 则是根据 TIMx_CR1 的 CKD[1:0] 的设置来确定的,如果 CKD[1:0]设置为 00,那么 = 。N 值就是滤波长度,举个简

单的例子:假设 IC1F[3:0]=0011,并设置 IC1 映射到通道 1 上,且为上升沿触发,那么在捕获

到上升沿的时候,再以 的频率,连续采样到 8 次通道 1 的电平,如果都是高电平,则说 明却是一个有效的触发,就会触发输入捕获中断(如果开启了的话) 。这样可以滤除那些高电平

搜索更多关于: stm32 PWM输入捕获 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

stm32 定时器pwm输入捕获 输入捕捉的功能是记录下要捕捉的边沿出现的时刻,如果你仅仅捕捉下降沿,那么两次捕捉的差表示输入信号的周期,即两次下降沿之间的时间。 如果要测量低电平的宽度,你应该在捕捉到下降沿的中断处理中把捕捉边沿改变为上升沿,然后把两次捕捉的数值相减就得到了需要测量的低电平宽度。 如果要的测量低电平太窄,中断中来不及改变捕捉方向时,或不想在中断中改变捕捉方向,则需要使用PWM输入模式,或使用两个TIMx通道,一个通道捕捉下降沿,另一个通道捕捉上升沿,然后对两次捕捉的数值相减。PWM输入模式也是需要用到两个通道。使用两个通道时,最好使用通道1和通道2,或通道3和通道4,这样上述功能只需要使用一个I/O管脚,详细请看STM32技术参考手册中的TIMx框图。 //0----------------------- 一、概念理解

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com