0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用定时器来捕获PWM脉冲频率

GReq_mcu168 来源:未知 作者:胡薇 2018-07-10 11:05 次阅读

一、概念理解

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

1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,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);//打开中断

中断处理函数

void TIM3_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~FFFFTIM_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。

笔记:之前调试的时候,想检测低频,按照上面方法进行分频处理时,怎么都不行,后来才搞明白,由于检测时要进行计数,印记预装载值TIM_Period还是要设置成0xffff,而TIM_Prescaler是进行分频用的,也就是说,如果定时器时钟为72M,则将TIM_Prescaler设置成5后,TIM的时钟为14.4M,此时可以检测的最小频率=14.4M/0xffff,也就是说最小检测频率=14.4M/TIM_Period。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4897

    浏览量

    209885
  • 定时器
    +关注

    关注

    23

    文章

    3146

    浏览量

    112031

原文标题:STM32小白必看!一招教你定时器捕获PWM脉冲频率

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用定时器控制pwm发送脉冲,如何能够同时控制频率脉冲个数?

    大神门,使用定时器控制pwm发送脉冲,如何能够同时控制频率脉冲个数。因为需要精准控制步进电机转动角度,还有速度,需要这个功能。并且
    发表于 03-14 07:02

    stm32定时器pwm模式输入捕获功能

    stm32定时器pwm模式输入捕获##stm32中的定时器,除了TIM6和TIM7,其他定时器都有输入
    发表于 08-18 07:41

    浅析stm32定时器pwm模式输入捕获

    stm32定时器pwm模式输入捕获stm32中的定时器,除了TIM6和TIM7,其他定时器都有输入捕获
    发表于 08-19 07:33

    STM32定时器的输入捕获模式测量脉冲宽度或者测量频率

    概述在前面几章中简单的讲解了定时器用作定时PWM输出时的基本原理和配置,在这一章中讲解定时器的另一种用法输入捕获是输入
    发表于 01-06 08:02

    定时器的输入捕获模式测量脉冲宽度或者测量频率

    输入捕获定时器的输入捕获模式可以用来测量脉冲宽度或者测量频率。本教程通过测量脉冲宽度,实现四路超
    发表于 01-06 06:28

    何用STM32的定时器输入捕获功能去测量方波的频率

    测量频率的原理是什么?如何用STM32的定时器输入捕获功能去测量方波的频率呢?
    发表于 01-17 07:43

    测量PWM频率脉冲宽度,捕获寄存似乎永远不会重置怎么解决?

    了什么吗?我的目的是能够测量 PWM 频率脉冲宽度,以及知道 PWM 信号是否已关闭(我的假设是捕获寄存
    发表于 01-11 07:30

    M261芯片如何用定时器计数不同频率的外部脉冲

    M261芯片,如何用定时器计数不同频率的外部脉冲? 外部脉冲频率是变化的,从几HZ,~50K
    发表于 06-19 07:20

    使用定时器控制pwm发送脉冲,如何能够同时控制频率脉冲个数

    大神门,使用定时器控制pwm发送脉冲,如何能够同时控制频率脉冲个数。因为需要精准控制步进电机转动角度,还有速度,需要这个功能。并且
    发表于 08-05 07:09

    stm32定时器输入捕获

    不同频率、不同占空比的方波信号、PWM信号,同时做为输入捕获功能时,可以测量脉冲宽度、实现电容按键检测等等。 一、输入捕获概念 输入
    发表于 10-13 09:13 2.3w次阅读
    stm32<b class='flag-5'>定时器</b>输入<b class='flag-5'>捕获</b>

    stm32 定时器 捕获

    输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6和TIM7,其他定时器都有输入
    发表于 09-08 17:07 2181次阅读

    基于定时器捕获测量脉宽的应用示例

    我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以STM32的定时器为例来介绍基于其捕获功能实现对脉宽的测量
    发表于 11-26 16:36 9次下载
    基于<b class='flag-5'>定时器</b><b class='flag-5'>捕获</b>测量脉宽的应用示例

    STM32F4单定时器独立输出四路PWM脉冲

    本文以STM32F405单片机为例,介绍如何用一个定时器的四个通道独立地输出四路PWM脉冲。主要使用定时器输出比较的翻转功能和
    发表于 11-30 10:06 28次下载
    STM32F4单<b class='flag-5'>定时器</b>独立输出四路<b class='flag-5'>PWM</b><b class='flag-5'>脉冲</b>

    STM32CubeMX——定时器输入捕获

    通用定时器在基本定时器的基础上增加了一个外部引脚,可以实现输入捕获与输出比较等功能。高级定时器TIM1与TIM8相比于通用定时器增加了电机控
    发表于 12-02 14:06 9次下载
    STM32CubeMX——<b class='flag-5'>定时器</b>输入<b class='flag-5'>捕获</b>

    一个通道如何捕获PWM频率和占空比?

    一,前言正常情况是双通道捕获PWM波,这种方法简单且准确,但是它占用的资源太多了,因为它使用定时器的两个通道,且这两个通道映射在一个通道上,同时配置一路捕获为触发
    的头像 发表于 12-30 08:00 465次阅读
    一个通道如何<b class='flag-5'>捕获</b><b class='flag-5'>PWM</b>的<b class='flag-5'>频率</b>和占空比?