STM32输入捕获模式测频率

在这里插入图片描述在这里插入图片描述在这里插入图片描述STM32频率的测量:高频适合使用的方法是测频法,低频适合使用的是测周法,(其中使用测频法测量频率比较稳定,使用测周法测量频率的方式没有这么稳定,因为测周法只会通过一次的测量就能得出结果所以测试出来的频率波动相对较大)

在测量频率的过程中会存在误差,所以当N的值越大的时候误差是越小的

在这里插入图片描述在这里插入图片描述输入捕获通道一的详细图解
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述输入捕获接接线图

在这里插入图片描述

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);
// 选择输入触发源TRGI
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
// 选择输出触发源TRGO
void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);
// 选择从模式
void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);
// 分别单独配置通道 1 2 3 4 分频器
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);
// 分别读取4个通道的CCR
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);
/*
** 输出比较模式下:CCR是只写的,要使用SetCompare写入
输入捕获模式下:CCR是只读的,要使用GetCapture读出**
*/

PWM.C
在这里插入图片描述

`#include "stm32f10x.h"                  // Device header

void PWM_Init(void){
  // 开启时钟,这里TIM2是通用寄存器
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	// GPIO初始化代码
		/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);		//开启GPIOA的时钟
	// GPIO引脚重映射,表示重映射和引脚之间的关系
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	
	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	// 使用复用开漏推挽输出模式
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);						//将PA1和PA2引脚初始化为推挽输出
	
	
	
	// 选择时基单元的时钟,选择内部时钟的模式,定时器默认使用的是内部单元的时钟
	TIM_InternalClockConfig(TIM2);
	
	/*
	   PWM频率的公式:== 更新频率 = 72M/(PSC+1)/(ARR+1)
	*/
	
	// 配置时基单元,初始化结构体
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	// 将结构体成员都引用出来放置在这个位置
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;    // 配置参数是否分屏
	TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; // 选择计数的模式选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 100 -1;               // 表示ARR自动重装器的值,这两个参数的取值都要在0-65535之间
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720-1;              // PSC预分频器的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;           // 重复计数器的值
	// 初始化结构体并将结构体的地址放置在init函数中
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
  // 初始化输出比较单元
	TIM_OCInitTypeDef TIM_OCInitStructure;
	// 给结构体赋初始值
	TIM_OCStructInit(&TIM_OCInitStructure);
  // 设置输出比较的模式
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  // 设置输出比较的极性,选择高极性
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	// 设置输出使能,输出状态
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable ;
	//设置CCR,设置ccr寄存器的值
	TIM_OCInitStructure.TIM_Pulse = 0;    // CCR
	
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);

	
	// 启动定时器
	TIM_Cmd(TIM2, ENABLE);
}
void PWM_SetCompare1(uint16_t Compare){
        TIM_SetCompare1(TIM2,Compare);
}
void PWM_SetPrescaler(uint16_t Prescaler){
	// 单独写入PSC的函数:第一个参数表示使用的定时器,第二个参数是需要写入PSC的值,第三个参数重装模式
  TIM_PrescalerConfig(TIM2, Prescaler,TIM_PSCReloadMode_Immediate);

}

`

PWM.h在这里插入图片描述IC.C
在这里插入图片描述

`#include "stm32f10x.h"    
	// 初始化的步骤 1: RCC开启时钟将GPIO和TIM的时钟开启
	// GPIO初始化将GPIO初始化为输入模式一般为上拉输入或者是浮空输入
	// 第三步:配置时基单元让CNT计数器在内部时钟的驱动下进行自增
	// 第四步:配置输入捕获单元包括输入,极性,直连通道还是交叉通道,分频参数等
	// 第五步:选择从模式的触发源触发源选择为TI1FP1,使用调用库函数的方式给一个参数
	// 第六步:选择触发之后执行的操作执行reset操作,使用库函数的方式实现
	// 第七步:调用TIM_CMD函数开启定时器

void IC_Init(void){
      // 开启时钟,这里TIM2是通用寄存器
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	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);						//将PA1和PA2引脚初始化为推挽输出
	
	
	
	// 选择时基单元的时钟,选择内部时钟的模式,定时器默认使用的是内部单元的时钟
	TIM_InternalClockConfig(TIM3);
	
	/*
	   PWM频率的公式:== 更新频率 = 72M/(PSC+1)/(ARR+1)
	*/
	
	// 配置时基单元,初始化结构体
	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自动重装器的值,这两个参数的取值都要在0-65535之间
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1;                // PSC预分频器的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;           // 重复计数器的值
	// 初始化结构体并将结构体的地址放置在init函数中
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
	
	/*
	  初始化输入捕获单元
	*/
	// 初始化结构体变量
	TIM_ICInitTypeDef TIM_ICInitStructure;
	// 选择输入捕获的通道
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
	// 输入捕获的滤波器
	TIM_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_ICInit(TIM3, &TIM_ICInitStructure);
	// 配置触发源
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); 

  // 启动定时器
	TIM_Cmd(TIM3,ENABLE);
	
}
uint32_t IC_GetFreq(void){
     return 1000000 /  (TIM_GetCapture1(TIM3) + 1);
	
	
}



`

IC.H
在这里插入图片描述main.c
在这里插入图片描述

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"


int main(void)
{
  // 初始化oled
	OLED_Init();
	PWM_Init();
	IC_Init();
	OLED_ShowString(1, 1, "Freq:00000Hz");
	PWM_SetPrescaler(720-1);// 计算频率的公式,Freq = 72M / (PSC + 1) / (ARR + 1)/100
	PWM_SetCompare1(50);    // 计算占空比的公式 Duty = CCR / 100 
	// 输入捕获代码
	while (1)
	{
     OLED_ShowNum(1,6,IC_GetFreq(),5);
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

任务管理器进程结束错了,电脑显示白屏该怎么办

电脑就是一个全白,吓人的一批,毕竟以前出过cmd运行出错,然后黑屏,最后只能重装系统。这里出现白屏是还好的,切换了另外的用户,发现电脑上原来的文件还在,所有按下面的方法就解决了。 1.打开任务…

网络编程—DAY3

模拟面试 1.什么是IP地址 是给互联网上的每台主机分配的唯一标识 2.IP地址和mac地址的区别 mac地址是设备的硬件地址,ip地址是给主机分配的网络地址 3.当电脑从一个网络切换到另一个网络哪个会变 ip地址会变,mac地址不会变 4.什么是端口号 用于区…

leetcode 热题 100_环形链表 II

题解一: 哈希表:遍历链表,用哈希表存储遍历过的链表节点,判断链表节点是否在哈希表中存在,如果存在说明链表出现过,第一个重复出现的节点即为开始入环的第一个节点。 import java.util.HashSet;public cla…

【计算机网络】什么是http?

​ 目录 前言 1. 什么是HTTP协议? 2. 为什么使用HTTP协议? 3. HTTP协议通信过程 4. 什么是url? 5. HTTP报文 5.1 请求报文 5.2 响应报文 6. HTTP请求方式 7. HTTP头部字段 8. HTTP状态码 9. 连接管理 长连接与短连接 管线化连接…

无线局域网——wlan

目录 一.wlan的含义和发展 二.wlan技术带来的挑战 1.企业办公场景多样 2.位置速度的要求 3.安全的要求 4.规范的挑战 三.家庭和企业不同的部署需求 1.胖AP模式组网 2.AC瘦AP模式组网 3.组网模式的不同 四.三层隧道转发实验 1.拓扑 2.AP上线 核心交换机vlan ​编辑…

IIS上部署.netcore WebApi项目及swagger

.netcore项目一般是直接双击exe文件,运行服务,今天有个需求,需要把.netcore项目运行在IIS上,遇到了一个小坑,在这里记录一下。 安装IIS,怎么部署站点,这些过于简单就不细说了,不知道…

vue3+Ts项目按需引入Echarts,并封装成hooks

记录 vue3Ts 项目中,按需引入echarts并进行二次封装使用。 1、安装:npm i echarts 2、新增按需引入配置文件:echartsConfig.ts // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。 import * as echarts from …

代码随想录阅读笔记-字符串【反转字符串】

题目 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印…

Web核心,HTTP,tomcat,Servlet

1,JavaWeb技术栈 B/S架构:Browser/Server,浏览器/服务器架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web资源,服务器把Web资源…

windows 免密码ssh登录linux;linux免密码ssh登录其他linux

1、windows 免密码ssh登录linux 参考:https://blog.csdn.net/qq285744011/article/details/118293937 1)windows先生成公钥私钥 ssh-keygen -t rsa -C "你的邮箱地址"生成后放在用户命令.ssh文件下 2)把公钥复制到linux /root/…

【STM32 定时器(二)TIM 输入捕获PWM 总结】

STM32定时器之输入捕获总结 OC介绍PWM介绍PWM初始化代码部分开启时钟配置时基单元配置CCR配置GPIO配置复用和重定义功能 开启定时器代码实现 :实现呼吸灯 OC介绍 PWM介绍 PWM参数计算 分辨率越细,分的分量越精细,越稳定,假如它为…

洛谷P8972 『GROI-R1』 一切都已过去(树上前缀和+运算符重载)

『GROI-R1』 一切都已过去 题目背景 悦关上窗,拉上帘布。 果然还是想不起来啊。 隐约记得曾和什么人一起做过这样的事。 仰面躺下,手执一只木笺。 「究竟如何,才能拥有“过去”啊……」 她闭上双眼。 「6 岁前的记忆……究竟如何才能…

Python Flask框架 -- url

这里限定了int,所以只能输入数字 完整代码: # 从flask这个包中导入Flask类 from flask import Flask, request# 使用Flask类创建一个app对象 # __name__ 代表当前app.py这个模块 app Flask(__name__)app.route(/blog/path) def hello_world():return H…

ThingsBoard初始化数据库Postgres

视频教程: ThingsBoard初始化数据库postgres_哔哩哔哩_bilibilihingsBoard是一个基于Java的开源物联网平台,旨在实现物联网项目的快速开发、管理和扩展。本课程主要从0到1带你熟悉ThingsBoard,学习优秀的物联网变成思维与思想,主…

C++ 笛卡尔树

目录 一、性质二、构建笛卡尔树三、应用四、源码 一、性质 堆性质: 笛卡尔树是一种满足堆性质的树。每个节点包含两个值:键值(key)和优先级值(priority)。在笛卡尔树中,根节点的优先级值最大&am…

【图论】拓补排序 - 邻接表

文章目录 题目:310. 最小高度树题目描述代码与注释 题目:310. 最小高度树 题目描述 代码与注释 func findMinHeightTrees(n int, edges [][]int) (ans []int) {if n 1 {return []int{0}}g : make([][]int, n)degree : make([]int, n) // 记录每个节点…

粤嵌6818开发板触摸屏应用

一、触摸屏应用 1.触摸屏设备的名字 在Linux下,一切皆文件,触摸屏也是一个文件。 触摸屏设备的名字:/dev/input/event0 2.触摸屏的两个专业术语 事件 ->event0 当一些外接控制设备(鼠标、键盘,wifi,触摸屏&am…

【Linux】信号保存{sigset_t/sigpending/sigprocmask/bash脚本/代码演示}

文章目录 1.信号相关常见概念2.管理信号的数据结构3.初识sigset_t4.信号集操作函数4.1sigpending4.2sigprocmask4.2代码测试1.测试12.测试23.测试3 4.3bash 脚本文件 1.信号相关常见概念 信号相关动作:产生 发送 接收 阻塞 递达(处理) 实际执行信号的处理动作称为信…

Spring Boot中application配置文件的生效顺序

Spring Boot的一个重要特性就是它的自动配置,这一特性在很大程度上依赖于名称为application的配置文件。本文将详细介绍在Spring Boot中,这些配置文件的加载顺序以及每份文件的应用范围。 文章目录 配置文件的种类配置文件的加载顺序配置文件的环境切换 …

一起玩儿3D打印机——03 Marlin固件的获取和安装环境的配置

摘要:本文介绍Marlin固件的获取和安装环境的配置 Marlin是一款开源软件,其主页为:https://marlinfw.org/,首页正中就是下载连接,如下图所示: 单击下面的“Download Marlin 2.1.2.2”按钮就会进入下载页面&a…