STM32F407输入捕获应用--PWM 输入模式测量脉冲频率与宽度

  • 一、测量脉宽或者频率
  • 二、PWM 输入模式
  • 三、软件实现
    • 3.1、硬件准备
    • 3.2代码
    • 3.4 验证

输入捕获一般应用在两个方面,一个方面是脉冲跳变沿时间测量,另一方面
是 PWM 输入测量。

一、测量脉宽或者频率


1.测量频率

当捕获通道 TIx 上出现上升沿时,发生第一次捕获,计数器 CNT 的值会被锁存到捕获寄存器 CCR 中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到 value1 中。当出现第二次上升沿时,发生第二次捕获,计数器 CNT 的值会再次被锁存到捕获寄存器 CCR 中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到 value3 中,并清除捕获记录标志。利用 value3 和 value1 的差值我们就可以算出信号的周期(频率)。

2.测量脉宽

当捕获通道 TIx 上出现上升沿时,发生第一次捕获,计数器 CNT 的值会被锁存到捕获寄存器 CCR 中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到 value1 中。然后把捕获边沿改变为下降沿捕获,目的是捕获后面的下降沿。当下降沿到来的时候,发生第二次捕获,计数器 CNT 的值会再次被锁存到捕获寄存器 CCR 中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到 value3 中,并清除捕获记录标志。然后把捕获边沿设置为上升沿捕获。在测量脉宽过程中需要来回的切换捕获边沿的极性,如果测量的脉宽时间比较长,定时器就会发生溢出,溢出的时候会产生更新中断,我们可以在中断里面对溢出进行记录处理。

二、PWM 输入模式

测量脉宽和频率还有一个更简便的方法就是使用 PWM 输入模式。与上面那种只使用一个捕获寄存器测量脉宽和频率的方法相比,PWM 输入模式需要占用两个捕获寄存器。


当使用 PWM 输入模式的时候,因为一个输入通道(TIx)会占用两个捕获通道(ICx),所以一个定时器在使用 PWM 输入的时候最多只能使用两个输入通道(TIx)。我们以输入通道 TI1 工作在 PWM 输入模式为例来讲解下具体的工作原理,其他通道以此类推即可。

PWM 信号由输入通道 TI1 进入,因为是 PWM 输入模式的缘故,信号会被分为两路,一路是 TI1FP1,另外一路是 TI2FP2。其中一路是周期,另一路是占空比,具体哪一路信号对应周期还是占空比,得从程序上设置哪一路信号作为触发输入,作为触发输入的哪一路信号对应的就是周期,另一路就是对应占空比。作为触发输入的那一路信号还需要设置极性,是上升沿还是下降沿捕获,一旦设置好触发输入的极性,另外一路硬件就会自动配置为相反的极性捕获,无需软件配置。一句话概括就是:选定输入通道,确定触发信号,然后设置触发信号的极性即可,因为是 PWM 输入的缘故,另一路信号则由硬件配置,无需软件配置。当使用 PWM 输入模式的时候必须将从模式控制器配置为复位模式(配置寄存器 SMCR 的位 SMS[2:0]来实现),即当我们启动触发信号开始进行捕获的时候,同时把计数器 CNT 复位清零。

下面我们以一个更加具体的时序图来分析下 PWM 输入模式。

PWM 信号由输入通道 TI1 进入,配置 TI1FP1 为触发信号,上升沿捕获。当上升沿的时候 IC1 和 IC2 同时捕获,计数器 CNT 清零,到了下降沿的时候,IC2捕获,此时计数器 CNT 的值被锁存到捕获寄存器 CCR2 中,到了下一个上升沿的时候,IC1 捕获,计数器 CNT 的值被锁存到捕获寄存器 CCR1 中。其中 CCR2 测量的是脉宽,CCR1 测量的是周期。

从软件上来说,用 PWM 输入模式测量脉宽和周期更容易,付出的代价是需要占用两个捕获寄存器

三、软件实现

3.1、硬件准备

1、粤嵌开发板一套

2、迷你示波器一个

3.2代码

初始化代码

/*****************************************
引脚说明:
PB6TIM4_CH1(TIM4 -- APB1 16位  84MHZ)*****************************************/void Pwm_PB6_InputInit(void)
{GPIO_InitTypeDef           GPIO_InitStructure;TIM_TimeBaseInitTypeDef      TIM_TimeBaseStructure;NVIC_InitTypeDef          NVIC_InitStructure;TIM_ICInitTypeDef            TIM4_ICInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//时钟使能RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//使能GPIOB时钟GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_6;          //GPIOB6GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AF;            //复用功能GPIO_InitStructure.GPIO_Speed     = GPIO_Speed_100MHz;   //速度100MHzGPIO_InitStructure.GPIO_OType     = GPIO_OType_PP;       //推挽复用输出GPIO_InitStructure.GPIO_PuPd    = GPIO_PuPd_NOPULL;        //下拉GPIO_Init(GPIOB,&GPIO_InitStructure);                   //初始化// 定时器复用引脚GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4);TIM_TimeBaseStructure.TIM_Prescaler     = 83;                      //定时器分频TIM_TimeBaseStructure.TIM_CounterMode    = TIM_CounterMode_Up;  //向上计数模式TIM_TimeBaseStructure.TIM_Period        = 49999;                   //自动重装载值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;        //分频因子 配置死区时会用到TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//初始化TIM2输入捕获参数TIM4_ICInitStructure.TIM_Channel    = TIM_Channel_1;               //通道1TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //上升沿捕获TIM4_ICInitStructure.TIM_ICSelection= TIM_ICSelection_DirectTI; //映射到TI1上TIM4_ICInitStructure.TIM_ICPrescaler= TIM_ICPSC_DIV1;         //配置输入分频,不分频 TIM4_ICInitStructure.TIM_ICFilter   = 0x05;                       //IC3F=0000 配置输入滤波器 不滤波// 初始化 PWM 输入模式TIM_PWMIConfig(TIM4, &TIM4_ICInitStructure);// 当工作做 PWM 输入模式时,只需要设置触发信号的那一路即可(用于测量周期)// 另外一路(用于测量占空比)会由硬件自带设置,不需要再配置// 选择输入捕获的触发信号TIM_SelectInputTrigger(TIM4, TIM_TS_TI1FP1);// 选择从模式: 复位模式// PWM 输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器 CNT 会被复位TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);TIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);// 使能捕获中断,这个中断针对的是主捕获通道(测量周期那个)TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE);TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;      //子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器、//TIM_ITConfig(TIM4,TIM_IT_Update|TIM_IT_CC2,ENABLE);                //允许更新中断 ,允许CC2IE捕获中断   TIM_Cmd(TIM4,ENABLE );  //使能定时器4}

主函数代码

u32 IC1Value, IC2Value;
float DutyCycle,Frequency;//定时器4中断服务程序
void TIM4_IRQHandler(void)
{           /* 清除定时器捕获/比较 1 中断 */TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);/* 获取输入捕获值 */IC1Value = TIM_GetCapture1(TIM4);IC2Value = TIM_GetCapture2(TIM4);//printf("IC1Value = %d IC2Value = %d ",IC1Value,IC2Value);// 注意:捕获寄存器 CCR1 和 CCR2 的值在计算占空比和频率的时候必须加 1if (IC1Value != 0) {flag = 1;} }int main(void)
{unsigned int count = 0;//设置NVIC分组 第二分组 抢占优先级范围:0~3  响应优先级范围:0~3NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);Delay_Init();//对LED初始化Led_Init();Usart1_Init(115200);Pwm_PB6_InputInit();while(1){//每隔500ms计算一次占空比与频率。if(flag == 1){/* 占空比计算 */DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);/* 频率计算 */Frequency = 84000000/(83+1)/(float)(IC1Value+1);         printf("占空比:%0.2f%% 频率:%0.2fHz\r\n",DutyCycle,Frequency);DutyCycle = 0;Frequency = 0;flag = 0;}delay_ms(500);}return 0;
}

3.4 验证

最后发现有一定的误差,未知是不是这几百块的示波器产生的问题,还是软件的问题。还待验证,到时再找台高精度的脉冲发生器看看了。有了解的码农可以互相讨论下。

程序链接:https://download.csdn.net/download/wwwqqq2014/87148727

STM32F407输入捕获应用--PWM 输入模式测量脉冲频率与宽度相关推荐

  1. c++ 定时器_【话说定时器系列】之十:PWM输入模式测量脉宽及占空比实验

    STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍.去年,电堂推出了<STM32 TIMER基础及常规应用介绍>,为大家梳理了 STM32 TIMER 的庞大内容, ...

  2. STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期

    STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期 目录 STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期 1.介绍 2.STM32C ...

  3. stm32 笔记 PWM输入模式测量脉宽和占空比原理

    一.PWM 输入模式测量脉宽 1.1 测量脉宽简介 在测量占空比之前,我们先一步一步来,先让 STM32 可以测量脉宽. TIM3_CH1(tim3 定时器通道 1)捕获模式测量脉宽步骤如下: 1.输 ...

  4. stm32时钟(2)输入捕获以及PWM输入捕获

    输入捕获 过程 ​ 在输入捕获模式下,信号从TIx输入,一共有四个输入口,以TI1为例,经过滤波器和边沿检测器后输出TI1FPx两路信号,该信号可以直接从IC1从输入,也可以从IC2输入,此处以IC1 ...

  5. STM32入门笔记(02):定时器之定时器中断、输入捕获和PWM输出(SPL库函数版)

    目录 定时器 8个定时器 定时器功能 定时器中断 常用通用定时器的寄存器 定时器中断实验目的: 定时器库函数及步骤 实验程序讲解 PWM 简介 STM32 PWM工作过程 PWM模式1 与 PWM模式 ...

  6. STM32 输入捕获 测量频率 PWM占空比

    看了网上关于STM32输入捕获的资料,有几篇介绍的很不错,但是内容上还有一点问题,稍加修改,大家可以参考一下. 重要概念理解(对于理解输入捕获功能很重要,特别看了数据手册CCR1\CCR2\CCR3\ ...

  7. STM32定时器输入捕获,脉宽测量知识点

    定时器特性 时基初始化结构体:TIM_TimeBaseInitTypeDef typedef struct {   uint16_t TIM_Prescaler; TIM_Prescaler:定时器预 ...

  8. STM32F407输入捕获-拨开云雾见青天

    之前只用过51单片机,编程的时候全是设定寄存器,现在接触STM32发现寄存器太多了,头大了三天... 之前一直对着103的资料设定407的定时器,但是这哥俩区别真是有的,一开始就进错了门,还想找对人? ...

  9. PWM输入捕获(只使用一路定时器通道)

    前言 上一篇文章介绍了使用<STM32参考手册>上 PWM 输入模式捕获的 PWM 波,这种方法简单且准确,但是它占用的资源太多了,因为它使用定时器的两个通道,且这两个通道映射在一个通道上 ...

最新文章

  1. 云曦服务器,云曦南羡最新章节_云曦南羡全本小说
  2. 如何迅速成为Java高手[Tomjava原创]
  3. php屏幕抓取,关于屏幕抓取:如何在PHP中实现Web scraper?
  4. 公务员考试中的计算机知识点,2021年度公务员考试计算机基础知识试题.doc
  5. 逻辑综合——概述与基本概念
  6. access vba 用recordset读取表中数据的简单方法
  7. code的bootstrap如何有提示 vs_如何用DataFocus对Excel表中数据进行分析?
  8. oracle ocx加载错误,flash9.ocx 加载错误解决方法
  9. 【CAN】CAN的比特率和波特率
  10. 没有DOI,只有卷期号时的IEEE期刊论文查找方法
  11. Boxy SVG for Mac(矢量图编辑器)
  12. Windows与网络基础-27-子网掩码
  13. 玛丽·娜拉(Marie Neurath)遗失的遗产
  14. 人工智能研究中心快递柜——代码分析十
  15. PMP之总价合同、成本补偿合同、工料合同
  16. qss 更改图标_Qt实现自定义图标功能
  17. 手机iphone项-测试崩溃问题总结
  18. Bresenham快速画直线算法
  19. 小学生python游戏编程arcade----爆炸粒子类
  20. C语言指针结构体详解,结构体指针,C语言结构体指针详解

热门文章

  1. 第2章 Python编程基础知识 第2.1节 简单的Python数据类型、变量赋值及输入输出
  2. 关于zebra中thread的解析
  3. (十三)JAVA 可视化分析工具
  4. ubuntu18 重启后 网口灯不亮 网卡无IP
  5. 小米手机root解锁方法
  6. 热力学与统计物理习题
  7. 解析las文件_点云las文件读取
  8. FTL——垃圾回收GC (Garbage Collection)
  9. 都说一进外包毁所有,这样的观点早不该存在了~
  10. 第18届智能车竞赛中的智能视觉组比赛细节遗留的问题-短视频脚本