06:【江科大stm32】:定时器输入捕获功能

news2025/4/19 11:54:06

定时器输入捕获功能

  • 1、通过定时器的输入捕获功能测量PWM波的频率
  • 2、PWMI模式测量频率和占空比

1、通过定时器的输入捕获功能测量PWM波的频率

在这里插入图片描述在这里插入图片描述定时器标准库相关的编程接口:

在这里插入图片描述

①PWM.c文件的代码如下:

/*
	通过定时器TIM2生成一个分辨率为10us,频率为1KHz的PWM波,
*/
#include "stm32f10x.h"                  // Device header

/*
	使用定时器TIM2,通过通道CH1(PA0)输出PWM波
*/
void PWM_Init(void)
{
	//1.使能时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	//2.选择内部时钟
	TIM_InternalClockConfig(TIM2);
	
	//3.对时基单元进行配置
	TIM_TimeBaseInitTypeDef TIM_TimeInitStruct;
	TIM_TimeInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟源分频
	TIM_TimeInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIM_TimeInitStruct.TIM_Period = 100 - 1;//计数器,PWM的频率 = 1KHz,T = 1ms
	TIM_TimeInitStruct.TIM_Prescaler = 720 - 1;//预分频器,72M/720 = 100kHz
	TIM_TimeInitStruct.TIM_RepetitionCounter = 0;//重复计数器
	
	TIM_TimeBaseInit(TIM2,&TIM_TimeInitStruct);
	
	//4.对输出比较单元进行配置
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);//给结构体默认初始值
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//选择PWM1模式
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//选择正极性
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//通道使能
	TIM_OCInitStruct.TIM_Pulse = 0;//CCR的初始值
	
	TIM_OC1Init(TIM2, &TIM_OCInitStruct);
	
	//5.配置CH1通道对应的引脚PA0
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	//6.使能定时器
	TIM_Cmd(TIM2,ENABLE);
}

void PWM_Set(uint16_t Compare)
{
	TIM_SetCompare1(TIM2,Compare);//更改CCR的值,及改变占空比
}

void Set_PSC(uint32_t Pres)
{
		TIM_PrescalerConfig(TIM2,Pres,TIM_PSCReloadMode_Immediate);//更改预分频PSC的值
}

②PWM.h文件的代码如下:

#ifndef __PWM_H
#define __PWM_H
#include "stm32f10x.h"                  // Device header

void PWM_Init(void);
void PWM_Set(uint16_t Compare);
void Set_PSC(uint32_t Pres);

#endif

③IC.c文件的代码如下:

#include "stm32f10x.h"                  // Device header

void IC_Init(void)
{
	/*
		由于输入捕获通道和输出比较通道不能够同时的使用
	    我们使用了TIM2的CH1产生了1KHz的PWM波形,所以
		我们使用TIM3的CH1(PA6)进行对PWM波形的输入进行捕获,测量其频率
		接线时,将输出PWM的引脚(PA0)连接到输出捕获的引脚(PA6)
	*/	
	
	//1. 使能TIM3的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	//2. 选择内部时钟源
	TIM_InternalClockConfig(TIM3);
	
	//3.配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeInitStruct;
	TIM_TimeInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟源滤波分频
	TIM_TimeInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIM_TimeInitStruct.TIM_Period = 65536 - 1;//计数器
	TIM_TimeInitStruct.TIM_Prescaler = 72 - 1;//预分频器,1MHz,即1us计数1次
	TIM_TimeInitStruct.TIM_RepetitionCounter = 0;//重复计数器
	TIM_TimeBaseInit(TIM3,&TIM_TimeInitStruct);
	
	//4.对输入捕获引脚进行初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	//5.对输入捕获单元进行初始化
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//选择通道CH1,它不像输出比较每个通道都有一个函数TIM_OC?Init()
	TIM_ICInitStruct.TIM_ICFilter = 0xF;//对捕获的信号进行滤波
	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//极性不反向
	TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//对捕获信号进行1分频
	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择直接连接
	TIM_ICInit(TIM3, &TIM_ICInitStruct);
	
	//6.对从模式进行配置
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);//从模式触发源选择
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//从模式的触发的模式,对计数器清零
	
	TIM_Cmd(TIM3,ENABLE);
}

uint32_t Get_Freq(void)
{
	return 1000000 / TIM_GetCapture1(TIM3);//TIM_GetCapture1()为获取通道CH1的CCR的值
}

④IC.h文件的代码如下:

#ifndef __IC_H
#define __IC_H
#include "stm32f10x.h"                  // Device header

void IC_Init(void);
uint32_t Get_Freq(void);
	
#endif

⑤主程序文件的代码如下:

/*
	通过输入捕获功能,捕获定时器产生的PWM波形的频率,和PWM波的占空比
*/

#include "stm32f10x.h" 
#include "OLED.h"
#include "PWM.h"
#include "IC.h"

int main(void)
{
	OLED_Init();
	OLED_Clear();
	PWM_Init();
	IC_Init();
	OLED_ShowString(1,1,"Freq:00000Hz");

	PWM_Set(50);//设置占空比为50%的PWM波形
//	Set_PSC(720 - 1);//更改预分频的值,即分辨率的值,72M/720 = 100KHz,
	                   //则分辨率为:1/100KHz = 10us,则PWM的T = 100 * 10us = 1ms,F = 1KHz
	while(1)
	{	
		OLED_ShowNum(1,6,Get_Freq(),5);
	}
}	

2、PWMI模式测量频率和占空比

在这里插入图片描述①IC.c文件的代码如下:

#include "stm32f10x.h"                  // Device header

void IC_Init(void)
{
	/*
		由于输入捕获通道和输出比较通道不能够同时的使用
	  我们使用了TIM2的CH1产生了1KHz的PWM波形,所以
		我们使用TIM3的CH1(PA6)进行对PWM波形的输入进行捕获,测量其频率
	*/	
	
	//1. 使能TIM3的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	//2. 选择内部时钟源
	TIM_InternalClockConfig(TIM3);
	
	//3.配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeInitStruct;
	TIM_TimeInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟源滤波分频
	TIM_TimeInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIM_TimeInitStruct.TIM_Period = 65536 - 1;//计数器
	TIM_TimeInitStruct.TIM_Prescaler = 72 - 1;//预分频器,1MHz,即1us计数1次
	TIM_TimeInitStruct.TIM_RepetitionCounter = 0;//重复计数器
	TIM_TimeBaseInit(TIM3,&TIM_TimeInitStruct);
	
	//4.对输入捕获引脚进行初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	//5.对输入捕获单元进行初始化
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//选择通道CH1,它不像输出比较每个通道都有一个函数TIM_OC?Init()
	TIM_ICInitStruct.TIM_ICFilter = 0xF;//对捕获的信号进行滤波
	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿开始捕获
	TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//对捕获信号进行1分频
	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择直接连接
	TIM_ICInit(TIM3, &TIM_ICInitStruct);
	
//	TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;//选择通道CH2,它不像输出比较每个通道都有一个函数TIM_OC?Init()
//	TIM_ICInitStruct.TIM_ICFilter = 0xF;//对捕获的信号进行滤波
//	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//下降沿开始捕获
//	TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//对捕获信号进行1分频
//	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;//选择间接连接
//	TIM_ICInit(TIM3, &TIM_ICInitStruct);

/*
	如果配置了通道CH1,然后通过PWMI传入这些参数,
	那么PWM配置的是和CH1通道的参数相反,且这个函数
	只支持CH1和CH2。不能这样配置CH3和CH4
*/
	TIM_PWMIConfig(TIM3,&TIM_ICInitStruct);//和上面的配置相等
	
	//6.对从模式进行配置
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);//从模式触发源选择
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//从模式的触发的模式,对计数器清零
	
	TIM_Cmd(TIM3,ENABLE);
}

uint32_t Get_Freq(void)//获取频率的函数
{
	return 1000000 / TIM_GetCapture1(TIM3);//获取通道CH1的CCR的值
}

uint32_t IC_GetDuty(void)//获取占空比
{
	return (TIM_GetCapture2(TIM3) * 100/ TIM_GetCapture1(TIM3)) ;
}

②主程序文件里面的代码如下:

/*
	通过输入捕获功能,捕获定时器产生的PWM波形的频率,和PWM波的占空比
*/

#include "stm32f10x.h" 
#include "OLED.h"
#include "PWM.h"
#include "IC.h"

int main(void)
{
	OLED_Init();
	OLED_Clear();
	PWM_Init();
	IC_Init();
	OLED_ShowString(1,1,"Freq:00000Hz");
	OLED_ShowString(2,1,"Duty:000%");

	PWM_Set(30);//设置占空比为30%的PWM波形
//	Set_PSC(720 - 1);//更改预分频的值,即分辨率的值,72M/720 = 100KHz,
	                   //则分辨率为:1/100KHz = 10us,则PWM的T = 100 * 10us = 1ms,F = 1KHz
	while(1)
	{	
		OLED_ShowNum(1,6,Get_Freq(),5);
		OLED_ShowNum(2,6,IC_GetDuty(),3);
	}
}	

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2094784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

八皇后问题代码实现(java,递归)

简介:著名的八皇后问题是由棋手马克斯贝瑟尔在1848年提出来的,要求在 8 8 的棋盘上摆放8个皇后,使”皇后“们不能互相攻击 ,当任意两个皇后都不处于同一行、同一列或同一条斜线上时就不会相互攻击,即为目标解。 说明…

C语言中的预处理指令的其中之一——#line

目录 开头1.什么是预处理指令——#line?2.预处理指令——#line的实际应用改__FILE__宏改__LINE__宏改__FILE__宏和__LINE__宏…… 下一篇博客要说的东西 开头 大家好,我叫这是我58。今天,我们要学一下关于C语言中的预处理指令的其中之一——#line的一些…

4-6 使用bios 中断 显示字符

1 显示的逻辑 bios 首先通过中断,访问到 最前面的中断向量表,然后 通过中断向量表然后 访问到具体的 bios 的函数,这些函数是bios 自带的,具体的位置 , 我也不知道。只知道有这个函数。 3 显示的原理 ; 主要…

纯蓝图事件

一、创建事件分发器 1、蓝图中可直接添加Event Dispatchers事件分发器 2、还可以设置事件的传递参数 3、直接将创建好的事件分发器拖入EventGraph中会显示出Call、Bind、UnBind、Assign等方法 二、广播事件通知 三、订阅、取消订阅事件通知

算法数学加油站:一元高斯分布(正态分布)Python精美科研绘图(PDF、CDF、PPF、ECDF曲线;QQ图)

这类博客针对算法学习时可能遇到的数学知识补充,但不会太多废话,主要是公式结合Python代码精美绘图理解! 本期重点: 参数:期望、标准差曲线:概率密度曲线PDF、累积概率密度函数CDF、百分点函数PPF应用&am…

14:LDO电源模块的布局

1.器件要和边框相聚5mm的距离作为工艺边,工艺边可以布线,但不能摆放器件 LDO布局原则 ①输出靠近负载端 和DCDC布局一样

Springcloud微服务合并打包,重复路径引发的血案

你好,我是柳岸花开。 在微服务架构的世界里,各种服务之间的接口调用犹如人类的神经系统,构成了整个系统的核心。然而,正是这些看似简单的接口路径,可能会引发一场惊天血案。今天,我们就来揭开一起因“重复路…

Git高手必备:掌握这些指令,轻松玩转版本控制(一)

前言 注:本文下的除非特殊声明,否则一律不作为实际加号,仅表示连接 所有的版本控制系统,只能跟踪文本文件的改动比如txt文件,网页,所有程序的代码等,能清楚的知道改动了什么。但是类似于图片、…

嵌入式全栈开发学习笔记---Linux系统编程(文件编程)

目录 Linux文件概述 系统IO 创建文件creat() 打开文件open() 写文件write() 读文件read() 文件指针---lseek() 系统IO拷贝 标准IO 标准IO和系统IO的区别 缓冲区的分类 行缓存测试 打开文件fopen() 写文件fwrite() 读文件read() 标准IO拷贝 标准IO和系统IO的效…

实践:根据时区显示时间

背景 在数据库中存储时间,不会自动对时区进行处理,要想针对不同时区作时间显示的适配,需要在程序中做适配,本文即为解决这一问题的实践案例。 数据库存 UTC 时间 插入记录时,使用 datetime.utcnow()获取当前 utc 时…

MFCC C++实现与Python库可视化对比

MFCC C实现与Python库对比 MFCC理论基础 在音频、语音信号处理领域,我们需要将信号转换成对应的语谱图(spectrogram),将语谱图上的数据作为信号的特征。语谱图的横轴x为时间,纵轴y为频率,(x,y)对应的数值代表在时间x时频率y的幅…

动作损失 ​ 的定义

动作损失 La是在弱监督时间动作定位(Weakly-Supervised Temporal Action Localization, WSTAL)任务中用于优化模型的一种损失函数。它的主要目标是确保模型能够准确地预测视频中动作发生的时间段,并对视频级别标签进行良好的分类。下面是对动…

【Python系列】 Python 中的枚举使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PyTorch中,动态调整学习率(Learning Rate Scheduling),也可以根据损失函数的损失数值自动调整学习率

在PyTorch中,动态调整学习率(Learning Rate Scheduling)是一种常用的技术, 用于在训练过程中根据一定的策略调整学习率,以优化模型的训练效果和收敛速度。以下是一些常见的学习率调整策略: 1. **固定步长…

金融科技初创企业建设指南

金融科技领域正以前所未有的速度发展,重塑我们与金钱和金融服务的互动方式。随着我们迈向 2025 年,尖端技术的融合、不断变化的消费者期望以及全球对金融包容性的推动正在创造前所未有的机遇。创新者现在有独特的机会在金融科技领域留下自己的印记。 以下几个因素使得即将到…

<计算机网络>笔记1: TCP/IP五层协议

<计算机网络>笔记1: TCP/IP五层协议 文章目录 <计算机网络>笔记1: TCP/IP五层协议ref1. 概述名词因特网组成性能指标TCP/IP模型: 实际普及全球的协议 2. 物理层3. 数据链路层点对点信道3.1. 基本问题3.3.2 点对点协议PPP Point-to-Point Protocol3.3.3. 使用广播信…

力扣3272.统计好整数的数目

力扣3272.统计好整数的数目 贪心 枚举所有回文数&#xff0c;再找不重复的排列组合 因为是个回文数&#xff0c;所有只找左半边即可 最终排列组合的个数为上式 class Solution {public:long long countGoodIntegers(int n, int k) {vector<long long> fac(n1);fa…

Nuxt 项目实战 - 15:自定义unocss规则,让编写样式更高效

与UI设计师约定颜色命名规则 配置color变量 color.scss $colors: ((#ffffff,#f8f8f8,#ebebeb,#dbdbdb,#cccccc,#999999,#666666,#333333,#000000),(#daf6ef, #b4ecde, #08c193, #228f73, #43d7b2),(#f62f3b, #edc9c9, #f0e2e2, #ffecea, #f78185),(#f2f5f8, #e3e8eb, #c3cace, …

永恒之蓝漏洞复现记录

准备工作 实验环境搭建 下载并安装VMware Workstation软件查看VMware的虚拟网卡和虚拟网络设置安装Windows虚拟机镜像和Kali linux虚拟机镜像 实验目的 掌握Windows网络服务远程渗透攻击基本理论知识。掌握Windows漏洞及漏洞利用方法原理。掌握Windows网络服务远程渗透攻击…

Spring02——bean基础配置、bean实例化——构造方法/静态工厂/实例工厂与FactoryBean、bean的生命周期

IOC相关内容 通过前面两个案例&#xff0c;我们已经学习了bean如何定义配置&#xff0c;DI如何定义配置以及容器对象如何获取的内容&#xff0c;接下来主要是把这三块内容展开进行详细的讲解。 bean基础配置bean实例化——构造方法bean实例化——静态工厂bean实例化-实例工厂…