当前位置: 首页 > news >正文

3-4 STM32F405--定时器输入捕获

功能描述:测量方波频率和占空比。通过将TIM9配置为输入捕获模式

  • main.c文件内容如下
    #include "stm32f4xx.h"                  // Device header
    #include "Delay.h"
    #include "MyDMA.h"
    #include "Serial.h"
    #include "Timer.h"int main(void)
    {Serial_Init();	//初始化串口Timer_Init();	//初始化定时器Serial_SendString(USART1,"Hello, world!\n"); //串口输出字符串while(1){//IC_GetFreq()获得信号频率,通过串口显示Serial_Printf(USART1,"The frequency of the sign is %dHz\n", IC_GetFreq());//IC_GetDutyRatio()获得信号占空比,通过串口显示Serial_Printf(USART1,"The duty ratio of the sign is %.1f%% \n", 100*IC_GetDutyRatio());Delay_ms(500);}
    }
    
  • Timer.c文件内容如下
    #include "Timer.h"                  /*** @摘要  		初始化TIM* @参数  		无* @返回值  	无* @说明  		无*/
    void Timer_Init(void)
    {//开启GPIOA时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//将PA2配置为复用模式,复用为TIM9的CH1引脚GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM9);//定义GPIO初始化结构体GPIO_InitTypeDef GPIO_InitStructure;//初始化上述结构体GPIO_StructInit(&GPIO_InitStructure);//配置GPIO模式为复用模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//配置GPIO输出类型为推挽输出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//配置GPIO输入类型为上拉输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//配置GPIO的速度为高速100MHZGPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;//指定GPIO引脚为Pin2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//初始化对应的GPIOGPIO_Init(GPIOA, &GPIO_InitStructure);//开启TIM9时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE);			//选择TIM9的时钟模式为内部模式,时钟源为内部时钟(84*2=168MHZ)TIM_InternalClockConfig(TIM9);									//定义时基单元初始化结构体TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//初始化上述结构体TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);				//配置预分频系数为168-1TIM_TimeBaseInitStructure.TIM_Prescaler = 168-1;				//配置自动重装值为0XFFFFTIM_TimeBaseInitStructure.TIM_Period = 0XFFFF;					//配置计数模式为向上计数TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//配置定时器时钟频率与数字滤波器所使用的采样时钟之间的分频比TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		//配置重复计数器的值为0TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;			//初始化时基单元TIM_TimeBaseInit(TIM9, &TIM_TimeBaseInitStructure);				//定义输入捕获单元初始化结构体TIM_ICInitTypeDef TIM_ICInitStruct;//初始化上述结构体TIM_ICStructInit(&TIM_ICInitStruct);//选择通道TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//配置输入捕获通道的滤波器TIM_ICInitStruct.TIM_ICFilter = 0x6;//选择触发的边沿类型TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//配置输入捕获通道的分频器TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//输入信号选择TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//初始化输入捕获单元TIM_ICInit(TIM9, &TIM_ICInitStruct);//配置TIM,使其可测占空比TIM_PWMIConfig(TIM9, &TIM_ICInitStruct);//上面这句等同于下面这段注释内容
    //	//初始化上述结构体
    //	TIM_ICStructInit(&TIM_ICInitStruct);
    //	//选择通道
    //	TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;
    //	//配置输入捕获通道的滤波器
    //	TIM_ICInitStruct.TIM_ICFilter = 0x6;
    //	//选择触发的边沿类型
    //	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;
    //	//配置输入捕获通道的分频器
    //	TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    //	//输入信号选择
    //	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;
    //	//初始化输入捕获单元
    //	TIM_ICInit(TIM9, &TIM_ICInitStruct);//选择从模式触发源TIM_SelectInputTrigger(TIM9, TIM_TS_TI1FP1);//选择从模式的执行动作TIM_SelectSlaveMode(TIM9, TIM_SlaveMode_Reset);//开启TIM9,此时计数器开始工作TIM_Cmd(TIM9, ENABLE);	
    }/*** @摘要  		获得输入捕获通道信号的频率* @参数  		无* @返回值  	输入捕获通道信号的频率* @说明  		无*/
    uint32_t IC_GetFreq(void)
    {uint32_t cnt = TIM_GetCapture1(TIM9);if(cnt == 0)return 0;elsereturn 1000000/cnt;//周期=计数值/计数频率,频率=计数频率/计数值
    }/*** @摘要  		获得输入捕获通道信号的占空比* @参数  		无* @返回值  	输入捕获通道信号的占空比* @说明  		无*/
    double IC_GetDutyRatio(void)
    {uint32_t cnt = TIM_GetCapture1(TIM9);if(cnt != 0)return (double)TIM_GetCapture2(TIM9)/cnt;//占空比=高电平持续时间/周期return 0;
    }
    
  • Timer.h文件内容如下
    #ifndef __TIMER_H
    #define __TIMER_H#include "stm32f4xx.h"                  // Device headervoid Timer_Init(void);
    uint32_t IC_GetFreq(void);
    double IC_GetDutyRatio(void);#endif
    

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【机器学习】3. 欧式距离,曼哈顿距离,Minkowski距离,加权欧式距离
  • 【Python】FastAPI:路径操作
  • 【图像去雨】MPRNet:性能炸裂!MPRNet:多阶段渐进式图像恢复(图像去雨、去模糊、去噪)
  • 【面试题系列Vue04】Vue.js中 $nextTick 原理及作用
  • 《黑神话:悟空》的AI技术解析:游戏智能的新境界
  • WPS Office两个严重漏洞曝光,已被武器化且在野利用
  • Spring Boot中的过滤器与拦截器实战:实现用户认证与资源访问控制
  • 无法找到模块“vuex”的声明文件。“../node_modules/vuex/dist/vuex.mjs”隐式拥有 “any“ 类型。
  • 使用uart串口配置TMC2209模块
  • [Matsim]Matsim学习笔记-population.xml的创建
  • flv和 rtmp视频负载类型的差异
  • 机器人拾取系统关节机械臂通过NY-PN-EIPZ进行命令控制
  • PCIe学习笔记(27)
  • 2024年中科院SCI期刊牛顿-拉夫逊优化算法NRBO优化Transformer-LST模型的多变量时间序列预测
  • 【Harmony OS 4.0】像素单位 - px、vp、fp
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • css系列之关于字体的事
  • dva中组件的懒加载
  • ES10 特性的完整指南
  • Java的Interrupt与线程中断
  • sessionStorage和localStorage
  • vue--为什么data属性必须是一个函数
  • WePY 在小程序性能调优上做出的探究
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 从输入URL到页面加载发生了什么
  • 关于 Cirru Editor 存储格式
  • 关于extract.autodesk.io的一些说明
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 正则表达式小结
  • 从如何停掉 Promise 链说起
  • 第二十章:异步和文件I/O.(二十三)
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • !!Dom4j 学习笔记
  • #07【面试问题整理】嵌入式软件工程师
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (1)(1.11) SiK Radio v2(一)
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (编译到47%失败)to be deleted
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二十三)Flask之高频面试点
  • (三)Honghu Cloud云架构一定时调度平台
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (算法)前K大的和
  • (一)Java算法:二分查找
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)Unity3DUnity3D在android下调试
  • ... 是什么 ?... 有什么用处?
  • .net(C#)中String.Format如何使用
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .net反混淆脱壳工具de4dot的使用