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

定时器输入捕获功能

  • 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 = 1msTIM_TimeInitStruct.TIM_Prescaler = 720 - 1;//预分频器,72M/720 = 100kHzTIM_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通道对应的引脚PA0RCC_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 headervoid PWM_Init(void);
void PWM_Set(uint16_t Compare);
void Set_PSC(uint32_t Pres);#endif

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

#include "stm32f10x.h"                  // Device headervoid 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 headervoid 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 = 1KHzwhile(1){	OLED_ShowNum(1,6,Get_Freq(),5);}
}	

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

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

#include "stm32f10x.h"                  // Device headervoid 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 = 1KHzwhile(1){	OLED_ShowNum(1,6,Get_Freq(),5);OLED_ShowNum(2,6,IC_GetDuty(),3);}
}	

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

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

相关文章

【Java设计模式】Bridge模式:在Java中解耦抽象与实现

文章目录 【Java设计模式】Bridge模式:在Java中解耦抽象与实现一、概述二、Bridge设计模式的别名三、Bridge设计模式的意图四、Bridge模式的详细解释及实际示例五、Java中Bridge模式的编程示例六、Bridge模式类图七、Java中何时使用Bridge模式八、Java中Bridge模式的…

如何成为一个飞控算法工程师?

兄弟,这个问题问得好,但也别想着靠看几本书就能一步登天。飞控算法这玩意儿,真要干好了,不是简简单单几个公式几个库就能搞定的。你本科电子专业有点基础,玩过四轴飞行器也算是入门了,但要搞真算法&#xf…

第8讲 ,ISP 串口程序下载

1 硬件的连接 需要使用 串口下载软件。 flymcu 这是 正点原子的 自启动电路。 2 stm32 的串口下载的原理 stm32 下载 只能是 串口一 , 也就是 PA9, PA10 3 然后是 stm32 的启动顺序 这里使用的是 第二种的 启动模式, 也就是 通过 串口进行烧…

如何使用IDEA搭建Mybatis框架环境(详细教程)

文章目录 ☕前言为什么学习框架技术Mybatis框架简介 🍹一、如何配置Mybatis框架环境1.1下载需要MyBatis的jar文件1.2部署jar文件1.3创建MyBatis核心配置文件configuration.xml1.4.创建持久类(POJO)和SQL映射文件1.5.创建测试类 🧋二、 MyBatis框架的优缺…

Unity获取SceneView尺寸

获取SceneView尺寸 var sceneView SceneView.lastActiveSceneView; var size new Vector2(sceneView.position.width,sceneView.position.height);

综合评价 | 基于层次-熵权-变异系数-正态云组合法的综合评价模型(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 综合评价 | 基于层次-熵权-变异系数-正态云组合法的综合评价模型(Matlab) AHP层次分析法是一种解决多目标复杂问题的定性和定量相结合进行计算决策权重的研究方法。该方法将定量分析与定性分析…

vscode中如何设置不显示隐藏文件

在vscode中,有时候,会显示一些隐藏文件,如何设置让其不显示呢? 解决办法 例如:我这里有一个.vscode隐藏文件夹,是vscode默认生成的一个配置目录,我想要它不在资源管理器中进行显示。 操作步骤&a…

Cesium 地球云图

Cesium 地球云图 使用自定义图原(Primitive)实现。 支持速度和透明的动态调整。 支持设置云图高度, 当相机高度小于云图高度时, 渐隐消失。 Cesium 地球云图

在 VS Code 中使用 Git 源代码管理【Mac 版】

文章目录 一、Git 使用文档二、使用示例1、复制远程仓库地址2、查看当前所在的分支2.1、界面查看2.2、终端查看 3、修改/新增文件4、显示增改的详细内容5、添加暂存区6、查看/取消暂存的更改7、提交本地代码库8、待提交文件9、推送到远程仓库10、验证11、查看推送记录11.1、关于…

全国大学生数学建模比赛——关联规则

一、问题背景与关联规则适用性 在数学建模比赛中,常常会遇到需要分析大量数据以寻找变量之间潜在关系的问题。关联规则分析作为一种数据挖掘技术,特别适用于这种场景。例如,在一些实际问题中,可能需要从众多的因素中找出哪些因素之…

Unet改进15:添加TripletAttention||减少冗余计算和同时存储访问

本文内容:在不同位置添加TripletAttention注意力机制 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 由于注意机制具有在通道或空间位置之间建立相互依赖关系的能力,近年来在各种计算机视觉任务中得到了广泛的研究和应用。在本文中,我们研究了轻量级但…

MAC环境导出项目的目录结构

一、安装Homebrew包管理工具 /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)" 官网网址:https://brew.idayer.com/ 二、用brew包管理工具安装tree brew install tree 三、打开终端,导出项目…

【机器学习】循环神经网络(RNN)介绍

引言 在现代人工智能(AI)和机器学习领域,循环神经网络(Recurrent Neural Networks, RNNs)作为一种能够处理序列数据的神经网络架构,已经成为众多应用的核心技术之一。RNNs的出现为处理时间序列数据和自然语言处理等任务提供了强大的工具,使得计算机能够理解和生成具有时…

NLP从零开始------16.文本中阶处理之序列到序列模型(1)

1. 序列到序列模型简介 序列到序列( sequence to sequence, seq2seq) 是指输入和输出各为一个序列(如一句话) 的任务。本节将输入序列称作源序列,输出序列称作目标序列。序列到序列有非常多的重要应用, 其中最有名的是机器翻译( machine translation), 机…

中仕公考怎么样?公务员考试什么时候补录?

公务员考试补录的时间和方法通常因地区和职位的不同有所区别,一般来说,这一过程会在面试、体检和考核环节完成后启动。 如果在招录过程中出现职位空缺或者并未全部招满的情况,就会进行补录。用人单位会通过其官方或公告形式公布相关信息&…

【数据结构】队列(Queue)

目录 队列概念 ​方法 队列模拟实现 链表实现队列 入队列 出队列 获取队头元素 数组实现队列 入队列 出队列 返回头队列 返回尾队列 完整代码 双链表实现队列 数组实现队列(设计循环队列) 队列概念 队列:只允许在一段进行插入…

鸿蒙HarmonyOS开发:如何灵活运用服务卡片提升用户体验

文章目录 一、ArkTS卡片相关模块二、卡片事件能力说明三、卡片事件的主要使用场景3.1、使用router事件跳转到指定UIAbility3.1.1、卡片内按钮跳转到应用的不同页面3.1.2、服务卡片的点击跳转事件 3.2、通过message事件刷新卡片内容3.2.1、在卡片页面调用postCardAction接口触发…

Linux 背景、命令

一、嵌入式、Linux背景 1、嵌入式: 硬件与软件相结合 定制、为硬件设计相关代码来进行操作,代码测试,烧进板子,通过语音、图像、按钮等操作方式来调用。 2、操作系统种类: Dos,Windows,Uni…

数据分析处理库(pandas)

目录 数据预处理 数据读取 DataFrame结构 数据索引 创建DataFrame Series操作 数据分析 统计分析 pivot数据透视表 groupby操作 常用函数操作 Merge操作 排序操作 缺失值处理 apply自定义函数 时间操作 绘图操作 大数据处理技巧 数值类型转换 属性类型转换…

51单片机——实时时钟

1、DS1302介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能 RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟…