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 headervoid 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;    // CCRTIM_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)
{// 初始化oledOLED_Init();PWM_Init();IC_Init();OLED_ShowString(1, 1, "Freq:00000Hz");PWM_SetPrescaler(720-1);// 计算频率的公式,Freq = 72M / (PSC + 1) / (ARR + 1)/100PWM_SetCompare1(50);    // 计算占空比的公式 Duty = CCR / 100 // 输入捕获代码while (1){OLED_ShowNum(1,6,IC_GetFreq(),5);}
}

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

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

相关文章

kubernetes-有状态和无状态服务

kubernetes-有状态和无状态服务 kubernetes-有状态和无状态服务1.有状态的应用1.1、理解1.2、特点 2、无状态应用2.1、理解2.2、特点 3、玩一下3.1、启动一个nginx无状态的业务3.2、启动一个nginx有状态的业务 4、无头服务4.1、无头服务的特点:4.2、无头服务的用途&…

verilog 从入门到看得懂---verilog 的基本语法数据和运算

笔者之前主要是使用c语言和matab 进行编程,从2024年年初开始接触verilog,通过了一周的学习,基本上对verilog 的语法有了基本认知。总统来说,verilog 的语法还是很简单的,主要难点是verilog是并行运行,并且强…

2024/3/15 记录简版抖音部署遇到的问题

1、Centos连不上网 参考这一篇:虚拟机 CentOS 有线连接图标直接消失,网络连接不上,网络连接失败的解决方案(亲测有效)_centos网络图标不见了-CSDN博客 2、SQLyog连接不到docker中的mysql 原因是对密码有加密过程 &a…

面向对象编程第三式: 多态 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

浅谈C/C++的常量const、指针和引用问题

今天我们来探讨C/C中const、指针和引用的相关问题。这些概念是编程中的重要组成部分,它们的正确使用对于代码的可读性和可维护性至关重要。通过深入了解const的不可变性、指针的灵活性以及引用的简洁性,我们能够更好地掌握编程的精髓,并写出更…

顺序表操作

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝既然选择了远方,当不负青春…

Python语法糖

N u m P y NumPy NumPy的 n d i t e r nditer nditer nditer 是 NumPy 提供的一种多维迭代器,用于对多维数组进行迭代操作。它可以替代传统的嵌套循环,在处理多维数组时更加方便和高效。 迭代器可以按照不同的顺序遍历数组的元素,也可以控制…

(含链接)2024年NVIDIA GPU技术大会开发者合集(专为开发者挑选的合集)

2024年NVIDIA GPU技术大会开发者合集 我专门为开发者整理了NVIDIA GPU技术大会上专注技术的内容合集, 希望可以帮助开发者朋友们快速了解NVIDIA的最新技术. 注意:在电脑端打开更友好, 可以直接进入每一项的网页 文章目录 2024年NVIDIA GPU技术大会开发者合集如何登录和预约会…

【论文笔记合集】ARIMA 非平稳过程通过差分转化为平稳过程

本文作者: slience_me 文章目录 ARIMA 非平稳过程通过差分转化为平稳过程文章原文具体解释详解参照 ARIMA 非平稳过程通过差分转化为平稳过程 文章原文 Many time series forecasting methods start from the classic tools [38, 10]. ARIMA [7, 6] tackles the fo…

虚拟内存相关知识汇总(程序重定位)

前置知识: Windows的内存可以被分为两个层面:物理内存和虚拟内存。其中,物理内存非常复杂,需要进入到Windows内核级别ring0才能看到。通常在用户模式下,用调试器看到的内存地址都是虚拟地址。 1.虚拟内存的定义 虚拟…

Java实现知乎热点小时榜爬虫

1.效果演示 1.1 热点问题列表 启动程序后&#xff0c;自动展示热点问题&#xff0c;并等待终端输入 1.2 根据序号选择想看的热点问题 输入问题序号&#xff0c;展示回答内容 1.3 退出 输入q即可退出程序 2.源码 2.1 pom.xml <?xml version"1.0" enco…

腾讯云怎么申请免费服务器?2024免费云主机申请教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

2024年腾讯云免费服务器申请教程,个人和企业均可领取

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

大数据数据分析-scala、IDEA、jdk之间的搭配关系

Scala主要是一门面向对象编程语言和函数式编程语言。 一、大数据框架&#xff08;处理海量/流式数据&#xff09; - ---以HADOOP 2. x为系列的大数据生态系统处理框架 离线数据分析&#xff0c;分析的数据为N1天数据 -----MapReduce 并行计算框架&#xff0c;分而治之…

Java数据结构二叉树练习

1.检查两棵二叉树是否都是相同的练习 我要求时间复杂度为1&#xff0c;所以我们不用前序中序后序是否都一样来进行判断 如何判断二叉树是否都是相同的子问题方式 先判断根节点是否相同 再判断左子树和右子树是否都是相同的 先用代码判断不相同的情况&#xff0c;都相同的化…

多线程JUC 第2季 wait和notify唤醒机制

一 wait和notify的区别与相同 1.1 wait和notify的作用 1) 使用wait()、notify()和notifyAII()时需要先对调用对象加锁。否则直接调用的话会抛出 IllegalMonitorStateExceptiona。 2) 调用wait()方法后&#xff0c;线程状态。由RUNNING变为WAITING&#xff0c;并将当前线程放置…

pyinstaller打包不显示DOS窗口

1 使用pyinstaller 打包 会不显示DOS窗口 打包的时候把-w去掉就行了

微信小程序开发学习笔记——4.1小程序官方api文档showToast提示框

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a;https://www.bilibili.com/video/BV19G4y1K74d?p26&vd_source9b149469177ab5fdc47515e14cf3cf74 一、showToast属性 https://developers.weixin.q…

Chapter 16 Techniques of Design-Oriented Analysis: Extra Element Theorems

Chapter 16 Techniques of Design-Oriented Analysis: Extra Element Theorems 这一章介绍Middlebrook’s Extra Element Theorem (EET), 这是一个强力的分析复杂电路传输函数的工具. 16.1 Extra Element Theorem 对于一个已知的传输函数, Extra Element Theorem可以帮助算出…

Java学习笔记(15)

JDK7前时间相关类 Date时间类 Simpledateformat Format 格式化 Parse 解析 默认格式 指定格式 EE&#xff1a;表示周几 Parse&#xff1a;把字符串时间转成date对象 注意&#xff1a;创建对象的格式要和字符串的格式一样 Calendar日历类 不能创建对象 Getinstance 获取当…