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

STM32(八):定时器——输入捕获实验

目录

输入捕获模式测频率:

结构图:

步骤: 

部分函数详解:

源码:

PWMI模式测频率占空比:

结构图:

​编辑

举例说明

源码: 


输入捕获模式测频率:

结构图:

    

步骤: 

        1. RCC开启时钟,把GPIO和TIM的时钟打开。

         2. GPIO初始化,把GPIO设置为输入模式,一般选择上拉输入或者浮空输入。

        3. 配置时基单元,让CNT计数器在内部时钟的驱动下自增运行。

        4. 配置输入捕获单元,包括滤波器、极性、直连通道/交叉通道、分频器(结构体配置)。

        5. 选择从模式的触发源 TI1FP1。

        6. 选择之后执行的操作Reset。

        7. 开启定时器,TIM_CMD。

部分函数详解:

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); 配置输入捕获电路
void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);可以快速配置两个通道。

void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);可以给输入结构体赋一个初始值

void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);选择输入触发源TRGI,调用这个函数可以设置从模式的触发源。

void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);选择输出触发源TRGO,调用这个函数可以设置主模式的触发源

void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);选择从模式

void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);单独配置通道1、2、3、4的分频器;

输出比较模式下,CCR是写的,要用SetCompare写入;输入捕获模式下,CCR是只读的,要用GetCapure读出;

uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);

源码:

#include "stm32f10x.h"                  // Device headervoid IC_Init(void)
{//第一步开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//第二步配置GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//第三步配置时基单元TIM_InternalClockConfig(TIM3);//选择时基单元的时钟TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//配置采样频率(滤波器),消除抖动;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period=65536-1;//ARR自动重装器的值TIM_TimeBaseInitStructure.TIM_Prescaler=36-1;//预分频器的值 计数标准频率TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器的值(高级计数器才需要,目前不需要用给0即可)TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//时基单元配置完毕 更新事件和更新中断是同时发生的,//第四步配置输入捕获函数TIM_ICInitTypeDef TIM_ICInitStruct;TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;//指定配置哪个通道TIM_ICInitStruct.TIM_ICFilter=0xF;TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;//边沿检测极性选择,上升、下降沿触发TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;//分频器,每隔几次有效TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;TIM_ICInit(TIM3,&TIM_ICInitStruct);//第五步 配置TRGI的触发源为TI1FP1TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);//第六步,配置从模式为ResetTIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//第七步,开启定时器TIM_Cmd(TIM3,ENABLE);//开启定时器;}uint32_t IC_GetFreq(void){return 2000000/TIM_GetCapture1(TIM3);}

PWMI模式测频率占空比:

结构图:

看一下英文版本的TIM_ICSelection_IndirectTI的说明:

TIM Input 1, 2, 3 or 4 is selected to be connected to IC2, IC1, IC4 or IC3, respectively. 

设置通道2的交叉连接也就是TIM通道1输入和IC2信号连接,也就是说TIM_ICInit(TIM3,&TIM_ICInitStruct); 实际上是对ICx捕获电路进行的配置,而不是对TIM_CHx输入口进行的配置。

TIM_ICSelection_IndirectTI 这个参数是定时器输入捕获模式中的一个配置选项,用于指定输入捕获触发信号源通过复用映射连接到对应通道的输入捕获引脚的方式。具体来说,当选择TIM_ICSelection_IndirectTI时,输入捕获触发信号需要经过复用映射电路,然后再由复用映射电路将信号传递给定时器的输入捕获电路。

举例说明

假设有一个STM32微控制器,它拥有多个定时器输入捕获通道(如IC1、IC2、IC3、IC4)和多个定时器输入通道(如TI1、TI2、TI3、TI4)。这些通道之间通常可以通过直接连接或间接(复用映射)方式相连。

  1. 直接连接(TIM_ICSelection_DirectTI):
    • 假设我们选择TIM_ICSelection_DirectTI,那么输入捕获通道与输入通道之间的连接将是直接的,即IC1连接TI1,IC2连接TI2,以此类推。
    • 例如,如果TIMx_CH1(定时器x的通道1)的输入信号需要被IC1捕获,那么信号将直接通过TI1进入IC1,无需经过任何复用映射电路。
  2. 间接连接(TIM_ICSelection_IndirectTI):
    • 当选择TIM_ICSelection_IndirectTI时,输入捕获通道与输入通道之间的连接将不再是直接的,而是需要通过复用映射电路进行连接。
    • 例如,如果TIMx_CH1的输入信号需要被IC2捕获(而不是通常的IC1),那么信号首先会进入TI1,然后通过复用映射电路被重定向到IC2。这种连接方式允许将不同的输入通道信号映射到非对应的输入捕获通道上,从而增加了配置的灵活性。

源码: 

#include "stm32f10x.h"                  // Device headervoid IC_Init(void)
{//第一步开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//第二步配置GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//第三步配置时基单元TIM_InternalClockConfig(TIM3);//选择时基单元的时钟TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//配置采样频率(滤波器),消除抖动;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period=65536-1;//ARR自动重装器的值TIM_TimeBaseInitStructure.TIM_Prescaler=72-1;//预分频器的值 计数标准频率TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器的值(高级计数器才需要,目前不需要用给0即可)TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//时基单元配置完毕 更新事件和更新中断是同时发生的,//第四步配置输入捕获函数TIM_ICInitTypeDef TIM_ICInitStruct;TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;//指定配置哪个通道TIM_ICInitStruct.TIM_ICFilter=0xF;TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;//边沿检测极性选择,上升、下降沿触发TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;//分频器,每隔几次有效TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;TIM_ICInit(TIM3,&TIM_ICInitStruct);TIM_ICInitStruct.TIM_Channel=TIM_Channel_2;//指定配置哪个通道TIM_ICInitStruct.TIM_ICFilter=0xF;TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Falling;//边沿检测极性选择,下降沿触发TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;//分频器,每隔几次有效TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_IndirectTI;TIM_ICInit(TIM3,&TIM_ICInitStruct);//TIM_PWMIConfig(TIM3,&TIM_ICInitStruct);//第五步 配置TRGI的触发源为TI1FP1TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);//第六步,配置从模式为ResetTIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//第七步,开启定时器TIM_Cmd(TIM3,ENABLE);//开启定时器;}uint32_t IC_GetFreq(void){return 1000000/(TIM_GetCapture1(TIM3)+1);}
uint32_t IC_GetDuty(void){return (TIM_GetCapture2(TIM3)+1)*100/(TIM_GetCapture1(TIM3)+1);}

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [译] APT分析报告:12.APT29利用spy软件供应商创建的IOS、Chrome漏洞
  • VSCode+debugpy远程调试
  • 第六课,模运算进阶,计算机存储单位
  • 2024HarmonyOS应用开发者高级认证最新整理题库和答案(已收录182道 )
  • WiFi标签注册(电脑版)
  • Loki Unable to fetch labels from Loki (no org id)
  • LeetCode --- 412周赛
  • 文章复现,代码复现,深度学习,强化学习
  • 架构设计(13)安全架构设计理论
  • Call openai-node in the backend or call https in the frontend?
  • 大话C++:第5篇 再识作用域
  • NLP入门
  • 简单树上问题
  • Java核心API——exception类认识java异常处理机制
  • 网页html版——在线查字典的一个web服务器
  • 【391天】每日项目总结系列128(2018.03.03)
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Angular Elements 及其运作原理
  • download使用浅析
  • Flannel解读
  • Github访问慢解决办法
  • java8 Stream Pipelines 浅析
  • java中的hashCode
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • js中的正则表达式入门
  • Magento 1.x 中文订单打印乱码
  • Python_网络编程
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • SQLServer之创建显式事务
  • Xmanager 远程桌面 CentOS 7
  • 多线程 start 和 run 方法到底有什么区别?
  • 给新手的新浪微博 SDK 集成教程【一】
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 理解在java “”i=i++;”所发生的事情
  • 码农张的Bug人生 - 初来乍到
  • 判断客户端类型,Android,iOS,PC
  • 学习JavaScript数据结构与算法 — 树
  • 由插件封装引出的一丢丢思考
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (145)光线追踪距离场柔和阴影
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Python) SOAP Web Service (HTTP POST)
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (WSI分类)WSI分类文献小综述 2024
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】