文章目录

  • 前言
  • 1、输入捕获原理
    • 1.1、设置输入捕获滤波器
    • 1.2、设置输入捕获的极性
    • 1.3、设置输入捕获的映射通道
    • 1.4、设置输入捕获分频器
    • 1.5、捕获到有效信号可开启中断
    • 1.6、捕获实现频率和占空比的获取
  • 2、输入捕获功能配置流程
  • 3、部分源码

前言

  下载工程文件:
  https://gitee.com/Joseph_Cooper/blue-bridge-embedded


1、输入捕获原理

1.1、设置输入捕获滤波器

  根据输入信号的特点,配置输入滤波器为所需的带宽(即输入为TIx时,输入滤波器控制位是TIMx_CCMRx寄存器中的ICxF位)。假设输入信号在最多5个内部时钟周期的时间内抖动,我们须配置滤波器的带宽长于5个时钟周期;因此我们可以(以fDTS频率)连续采样8次,以确认在TI1上一次真实的边沿变换,即在TIMx_CCMR1寄存器中写入IC1F=0011。

1.2、设置输入捕获的极性

  改变CC1P位的值以改变上升沿触发或是下降沿触发。可通过库函数void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)来设置。

1.3、设置输入捕获的映射通道

  通道内获得的信号是可以通过设置交给不同的IC来进行处理的,比如,我们可以将通道1捕获的信号送给IC2处理。

1.4、设置输入捕获分频器

  可设置多次上升沿触发一次捕获也就是相当于分频的作用。

1.5、捕获到有效信号可开启中断

  捕获到一次信号可以进入相应的中断服务函数。

1.6、捕获实现频率和占空比的获取


1、设置为上升沿捕获、定时器值清零
2、上升沿捕获成功后记录定时器中的值A再设置为下降沿捕获
3、下降沿捕获成功后记录定时器中的值B再次设置为上升沿捕获。
4、再次设置为上升沿捕获,捕获成功后记录定时器中的值C,清空定时器计数值(C−A)⋅1fTIM(C-A)\cdot\frac1{f_{TIM}}(CA)fTIM1即为该波形的周期,其倒数即是频率,B−AC−A×100%\frac {B-A}{C-A}\times100\%CABA×100%即为占空比。


2、输入捕获功能配置流程

1、初始化定时器和通道对应IO的时钟。
2、初始化IO口,模式为输入
  GPIO_Init();
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入
3、初始化定时器ARR,PSC
   TIM_TimeBaseInit();
4、初始化输入捕获通道
  TIM_ICInit();
5、使能定时器
  TIM_Cmd();
6、如果要开启捕获中断
  TIM_ITConfig();
  NVIC_Init();
7、编写中断服务函数
  TIMx_IRQHandler();

需要用到的函数:
  通道极性设置函数
  void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
  获取捕获值
  uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx);


3、部分源码

PWM输出:

输入捕获:

main.c:

#include "Headfile.h"/**
* @file         main.c
* @brief        实现PA1捕获PA9、PA10端的输出,显示频率和占空比
* @version  1.0
* @author   JosephCooper
* @date     2020.10.09
*//** 滴答定时器实现延时中间变量 */
u32 TimingDelay = 0;
extern __IO uint32_t TIM2Freq;
extern u8 TIM2FreqReady;
extern __IO uint32_t TIM2Duty;void Delay_Ms(u32 nTime);//Main Body
int main(void)
{uint32_t i = 0;u8 Str[200];uint32_t TIM2Freq_BP = 0;uint32_t TIM2Duty_BP = 0;memset(Str,0x00,sizeof(Str));//清空数组SysTick_Config(SystemCoreClock/1000);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);Delay_Ms(200);LEDInit();//LED初始化//关闭所有LEDLEDCmd(Bit_SET);GPIO_Write(GPIOC,GPIO_ReadOutputData(GPIOC) | 0xFF00);LEDCmd(Bit_RESET);STM3210B_LCD_Init();LCD_Clear(Blue);LCD_SetBackColor(Blue);LCD_SetTextColor(White);BuzzerInit();//蜂鸣器初始化TIM2_ICInit();TIM1_PWMInit();//TIM1_PWM初始化while(1){if(TIM2FreqReady){TIM2FreqReady = 0;if( (TIM2Freq!=TIM2Freq_BP) || (TIM2Duty!=TIM2Duty_BP) ){TIM2Freq_BP = TIM2Duty;TIM2Duty_BP = TIM2Freq;sprintf((char*)Str,"TIM2Freq:%dHz           ", TIM2Freq);LCD_DisplayStringLine(Line2,Str);sprintf((char*)Str,"TIM2Duty:%d%%           ", TIM2Duty);LCD_DisplayStringLine(Line3,Str);for(i=0; i<500000; i++);//刷新延迟}}}
}//
void Delay_Ms(u32 nTime)
{TimingDelay = nTime;while(TimingDelay != 0);
}

stm32f10x_it.c:

#include "stm32f10x_tim.h"
#include "stm32f10x.h"
extern u32 TimingDelay;
...
//7、编写中断服务函数
__IO uint16_t IC2ReadValue1 = 0, IC2ReadValue2 = 0,IC2ReadValue_LOW = 0;
__IO uint16_t CaptureNumber = 0;
__IO uint32_t Capture = 0;
__IO uint32_t TIM2Freq = 0;
__IO uint32_t TIM2Duty = 0;
u8 TIM2FreqReady = 0;
void TIM2_IRQHandler(void)
{ if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == SET) {/* Clear TIM3 Capture compare interrupt pending bit */TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);if(CaptureNumber == 0){/* Get the Input Capture value */IC2ReadValue1 = TIM_GetCapture2(TIM2);CaptureNumber = 1;//设置下降沿捕获TIM_OC2PolarityConfig(TIM2,TIM_OCPolarity_Low);}else if(CaptureNumber == 1){IC2ReadValue_LOW = TIM_GetCapture2(TIM2);CaptureNumber = 2;//设置上升沿捕获TIM_OC2PolarityConfig(TIM2,TIM_OCPolarity_High);}else if(CaptureNumber == 2){/* Get the Input Capture value */IC2ReadValue2 = TIM_GetCapture2(TIM2); /* Capture computation */if (IC2ReadValue2 > IC2ReadValue1){Capture = (IC2ReadValue2 - IC2ReadValue1); }else{Capture = ((0xFFFF - IC2ReadValue1) + IC2ReadValue2);}/* Frequency computation */ TIM2Duty = ( (IC2ReadValue_LOW-IC2ReadValue1)*100 ) / Capture;TIM2Freq = 1000000 / Capture;//定时器经过72分频后的频率CaptureNumber = 0;TIM2FreqReady = 1;TIM_SetCounter(TIM2,0);}}
}

InputCaputer.c

#include "Headfile.h"void TIM2_ICInit()
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM2_ICInitStructure;GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//1、初始化定时器和通道对应IO的时钟。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//2、初始化PA1,模式为输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//3、初始化定时器(时基设置)TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1 ;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_Period = 0xFFFF;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//4、初始化输入捕获通道TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2;//定时器2的通道2TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿捕获TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//使用通道默认IC即IC2TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不分频TIM2_ICInitStructure.TIM_ICFilter = 0x00;//不滤波//5、使能定时器TIM_ICInit(TIM2, &TIM2_ICInitStructure);//IC初始化TIM_Cmd(TIM2, ENABLE);//打开定时器//6、如果要开启捕获中断NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
}

  关于LCD刷新的问题:LCD在刷新时可能因为中断打断出现乱码的问题,将要显示的字符串添加(用空格补全)至总长度超过20位即可sprintf((char*)Str,"TIM2Freq:%dHz ", TIM2Freq);

【蓝桥杯嵌入式】【STM32】10_InputCaputer之输入捕获相关推荐

  1. stm32入门学什么板子_“蓝桥杯”嵌入式stm32开发入门(1)概述

    声明:笔者绝不是给"蓝桥杯"打广告,而是笔者曾经参加过蓝桥杯嵌入式设计与开发比赛,想借此机会总结并分享自己的学习中的点点滴滴. 此系列教程将以蓝桥杯官方指定的开发板和接口板来深入浅 ...

  2. 蓝桥杯嵌入式STM32 G431 HAL库开发速成指南(1)LED

    本教程适用于报名参加蓝桥杯嵌入式用新开发板(G431)且想要快速开发的小白,不具体讲解复杂的原理,只讲Cubemx初始化配置以及在KEIL里面使用相应的库函数功能对外设进行编程. CUBEMX配置流程 ...

  3. 【STM32G431RBTx】备战蓝桥杯嵌入式→基本模块→DAC

    文章目录 前言 1.CubeMx的配置步骤 2.生成工程 3.测试代码 4.演示效果 总结 前言 前面我们配置了ADC模块,本节我们学习配置DAC模块. 1.CubeMx的配置步骤 修改之前的ADC的 ...

  4. 【蓝桥杯嵌入式】【STM32】13_PWM输入捕获模式

    文章目录 前言 1.PWM输入模式 2.硬件设计 3.软件设计 前言   STM32的定时器输入捕获模式可以通过更改输入捕获极性实现PWM的输入捕获,但实际上STM32也包含有非常方便的PWM输入捕获 ...

  5. 蓝桥杯嵌入式1--滴答定时器,输入输出模式,LED,按键

    蓝桥杯嵌入式1--滴答定时器,输入输出模式,LED,按键 滴答定时器 输入输出模式 LED 按键 滴答定时器 滴答定时器是放在stm32内核中的一个定时器,用户不可以随便操作滴答定时器的寄存器,滴答定 ...

  6. 【蓝桥杯嵌入式】【STM32】7_RTC之实时时间显示和硬件闹钟设置

    文章目录 1.RTC的三个可用时钟源 2.RTC框图 3.写代码前需要知道的一些标志位 4.配置流程 5.源代码 6.关于设置闹钟这件事  6.1.配置流程  6.2.实验源代码   下载工程文件: ...

  7. 国信长天蓝桥杯嵌入式类——stm32——使用keil4建立工程文件过程

    蓝桥杯嵌入式----使用keil4建立工程文件过程 目录 蓝桥杯嵌入式----使用keil4建立工程文件过程 一.完成文件建立 (一).先建立名为test工程文件夹,如图.并建立如下几个文件夹 (二) ...

  8. stm32 同一个定时器输入捕获测量双通道PWM占空比

    stm32 cubemx 输入捕获 stm32 同一个定时器输入捕获测量双通道PWM占空比 . 最近在做蓝桥杯嵌入式的真题,发现在使用TIM3的通道1和2同时测量PWM1和PWM2的占空比时,硬件是不 ...

  9. 蓝桥杯嵌入式类比赛经验分享

    第八届蓝桥杯大赛(嵌入式组) 蓝桥杯的嵌入式组是Stm32rbt6单片机的编程比赛,我想对于学习电子信息工程专业的同学这不是一个陌生的名词,如果你是电信专业的大四同学却没有听说过msp430或者stm ...

  10. 蓝桥杯嵌入式——题目总结及文章汇总

    蓝桥杯嵌入式--题目总结及文章汇总 一.前言 笔者也是最近准备参加第十二届蓝桥杯嵌入式的选手,希望能够和大家一起学习.我也将我自己学习过程中,学习stm32遇到的一些问题,以及刷题的代码等都进行了整理 ...

最新文章

  1. 树形结构在关系数据库中的设计
  2. 【转】ABAP的坑2
  3. 第一篇:超级工具/Terminals,xterms 和 Shells
  4. Go的string/int/int64转化
  5. linux系统下4k对齐,linux查看硬盘4K对齐方法
  6. Python学习记录——持续更新
  7. 阅读笔记 火球UML大战需求分析4
  8. 【转】TranslateAnimation详解
  9. 使用lvs实现负载均衡(V2.0)
  10. python word转pdf图片格式_Python将Word转成PDF
  11. 图卷积网络GRAPH CONVOLUTIONAL NETWORKS
  12. MFC 时钟 计算器 日期天数计算
  13. 【沐风老师】3dMax Gyroid Minimal Surface 极小曲面建模详细教程
  14. 往事不回头,今后不将就~~Fighting
  15. 达梦数据库使用小记录【关于 无效的列】
  16. MATLAB演示元胞自动机算法
  17. 从cocostudio获取控件,添加回调函数
  18. 如何使用ReadProcessMemory读取多重指针
  19. CCM5.0 应用实例(SIP X-lite)
  20. Shotcut for Mac(视频编辑器)

热门文章

  1. 多项式乘积求导 c语言,c语言实现多项式求导.docx
  2. php h5读写数据库,H5学习_番外篇_PHP数据库操作
  3. oracle修改字段的默认,oracle系统默认的账号ORACLE修改表字段的数据类型
  4. db h2 数据类型_H2数据库函数及数据类型概述-阿里云开发者社区
  5. python-kafka多线程快速读取consumer消费者数据,同时使用批读取与无限流读取改进
  6. 创建目录_聊聊Word创建目录那些事儿
  7. 医用应用计算机,计算机在医疗方面应用.doc
  8. 函数式接口 lambda表达式 方法引用
  9. nightwatch系列教程03——开发者指南:运行你的测试脚本
  10. 软件需求和问题解决-转载