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

STM32定时器的输入捕获模式(测量PWM的周期与占空比)

1. STM32输入比较模式的使用

stm32的输入比较模式常用于测量PWM信号的周期和占空比,其系统的架构图如图1所示

图1 STM32通用定时器输入捕获模式的架构

如图所示,通用定时器有4个通道,每个通道输入的信号经过滤波以后可以输入到两个捕获/比较寄存器。以通道1所示,TI1信号经过滤波以后,可以产生TI1FP1直连输入到CCR1,也可作为TIFP2映射到CCR2。

在捕获比较模式中,为了测量PWM的周期与占空比做以下设置,如图2所示:

图2 stm32的测量PWM信号周期与占空比

在第一个上升沿的时候,将CCR1和CCR2都清0,接下来在下降沿将计数器CNT的值存入CCR1,那么CCR1中的计数器值N1*时间基准t就是高电平所占的时间;

随后在下一个上升沿的时候,将计数器的值存入CCR2寄存器,那么CCR的值*时间基准t就是周期,所以占空比

duty=\frac{CCR1}{CCR2}

2. STM32输入比较模式的代码

2.1 初始化代码

#include "stm32f10x.h"                  // Device header/*** 函    数:输入捕获初始化* 参    数:无* 返 回 值:无*/
void IC_Init(void)
{/*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);			//开启TIM3的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟/*GPIO初始化*/GPIO_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);							//将PA6引脚初始化为上拉输入/*配置时钟源*/TIM_InternalClockConfig(TIM3);		//选择TIM3为内部时钟,若不调用此函数,TIM默认也为内部时钟/*时基单元初始化*/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;               //预分频器,即PSC的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);             //将结构体变量交给TIM_TimeBaseInit,配置TIM3的时基单元/*PWMI模式初始化*/TIM_ICInitTypeDef TIM_ICInitStructure;							//定义结构体变量TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;				//选择配置定时器通道1TIM_ICInitStructure.TIM_ICFilter = 0xF;							//输入滤波器参数,可以过滤信号抖动TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;		//极性,选择为上升沿触发捕获TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;			//捕获预分频,选择不分频,每次信号都触发捕获TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;	//输入信号交叉,选择直通,不交叉TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);						//将结构体变量交给TIM_PWMIConfig,配置TIM3的输入捕获通道//此函数同时会把另一个通道配置为相反的配置,实现PWMI模式/*选择触发源及从模式*/TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);					//触发源选择TI1FP1TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);					//从模式选择复位//即TI1产生上升沿时,会触发CNT归零/*TIM使能*/TIM_Cmd(TIM3, ENABLE);			//使能TIM3,定时器开始运行
}/*** 函    数:获取输入捕获的频率* 参    数:无* 返 回 值:捕获得到的频率*/
uint32_t IC_GetFreq(void)
{return 1000000 / (TIM_GetCapture1(TIM3) + 1);		//测周法得到频率fx = fc / N,这里不执行+1的操作也可
}/*** 函    数:获取输入捕获的占空比* 参    数:无* 返 回 值:捕获得到的占空比*/
uint32_t IC_GetDuty(void)
{return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);	//占空比Duty = CCR2 / CCR1 * 100,这里不执行+1的操作也可
}

2.2 代码的总结

上述代码主要做了以下事情:

(1). 开启时钟

(2). 初始化GPIO

(3).初始化时间基准单元,确定计数器+1所用的时间

(4).初始化PWM输入的模式,其中主要设置输入信号的信号源,以及设置从模式在每次测量之后将计数器的值清零。

http://www.dtcms.com/a/536204.html

相关文章:

  • 智慧校园数字孪生选型指南:选对平台做好交付,从平台适配到交付落地的全流程解决方案
  • php招生网站开发标准网站建设价格
  • 【NestJS】在 nest.js 项目中,如何使用 Postgresql 来做缓存?
  • 解决由于没有远程桌面授权服务器可以提供许可证,远程会话被中断.的方法
  • 初始化服务器
  • 玉林建设信息网站帮别做网站
  • 【C++ 内存管理、模板初阶与 STL 简介】:打通高效编程的关键链路
  • web开发,在线%高校舆情分析%系统demo,基于python,flaskweb,echart,nlp,ida,tf-idf,多爬虫源,数据库mysql
  • 安装双系统
  • AI研究-113 DeepSeek-OCR 原理与架构全解|视觉压缩长文本 SAM-base 16×下采样 CLIP-L 3B-MoE
  • R语言绘制复杂加权数据(nhanes数据)生存分析决策曲线
  • 常州溧阳建设工程管理中心网站做网站平台的公司
  • 政务领域应用:国密 SSL 证书如何守护 “一网通办” 的数据安全?
  • LM实现教程:基于 nanochat项目 从零开始理解大语言模型
  • 【南京大学主办】第三届数学与机器学习国际学术会议(ICMML 2025)
  • 淮北市建设局网站福建省住房和城乡建设局网站
  • 无锡企业网站龙岩kk网最新招聘
  • 告别纸张,迎接更加高效的文档管理——Paperless-ngx介绍
  • 题解:P14309 【MX-S8-T2】配对
  • SQL之表的增删
  • 【计算机网络核心】TCP/IP模型与网页解析全流程详解
  • HTML 理论系统笔记2
  • 微软Copilot被用于窃取OAuth令牌,AI Agent成为攻击者帮凶
  • 免费网站建站w海口企业自助建站
  • 全球 PyTorch 大会与 Triton 大会释放强信号:算子语言繁荣和分化背后,编译器核心地位日益凸显
  • PyCharm 快速运行 django project
  • 自己动手制作网站外呼电销系统
  • 网站建设出错1004有专门下载地图做方案的网站吗
  • OpenCV C++ 中,访问图像像素三种常用方法
  • MATLAB基于小波云模型时间序列预测,以年径流预测为例