32定时器定时输出比较输入捕获编码器接口

一.定时器简介

1.基本定时器

2.通用定时器

滤波器可以滤掉信号的抖动和干扰,其工作原理:在一个固定的时钟频率f下进行采样,如果连续n隔采样点都为相同的电平,那就代表输入的信号稳定了。如果采样值不全都相同,那就说明信号有抖动,这时就保证上一次的输出,或者直接输出低电平也行,这样就能保证输出信号在一定程度上的滤波,采样频率f和采样点数N都时滤波器的参数

频率越低,采样点数越多,滤波效果就越好,信号延迟就越大

采样频率f可以由内部时钟分频而来,由参数ClockDivision决定

3.高级定时器

4.定时器基本结构

上图对应函数

 5.计数器时序

 5.时钟树

二.代码实现

一.定时器定时

<1>显示屏自动计时

(1)跨文件使用变量

timer.c

#include "stm32f10x.h"                  // Device header
extern uint16_t Num;//告诉编译器,在其他地方已经定义了Num的值,自己去找
void Timer_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);/*选择时钟函数*/TIM_InternalClockConfig(TIM2);//也可以不写,因为定时器上电以后默认就是内部时钟/*配置时基单元*/TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//指定时钟分频,这里不进行分频TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period=10000-1;//周期,就是ARR自动重装器的值TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1;//PSC预分频器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器的值,高级定时器才有TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//为将初始化的值由缓冲寄存器写入,会立刻更新一个中断,所以下面的计数会从1开始而不是0TIM_ClearFlag(TIM2,TIM_FLAG_Update);//手动清除更新中断标志位,避免刚初始化完就进入中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断,更新中断NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//中断通道NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM2,ENABLE);//启动定时器
}
void TIM2_IRQHandler(void)
{if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)==SET){Num++;	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "Timer.h" 
uint16_t Num;
int main()
{OLED_Init();OLED_ShowString(1,1,"NUM:");Timer_Init();while(1){OLED_ShowNum(1,5,Num,3);OLED_ShowNum(2,5,TIM_GetCounter(TIM2),5);}	
}
(2) 将中断函数放在主函数里面

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "Timer.h" 
uint16_t Num;
int main()
{OLED_Init();OLED_ShowString(1,1,"NUM:");Timer_Init();while(1){OLED_ShowNum(1,5,Num,3);OLED_ShowNum(2,5,TIM_GetCounter(TIM2),5);}	
}
void TIM2_IRQHandler(void)
{if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)==SET){Num++;	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}
}

 Timer.c

#include "stm32f10x.h"                  // Device header
extern uint16_t Num;//告诉编译器,在其他地方已经定义了Num的值,自己去找
void Timer_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);/*选择时钟函数*/TIM_InternalClockConfig(TIM2);//也可以不写,因为定时器上电以后默认就是内部时钟/*配置时基单元*/TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//指定时钟分频,这里不进行分频TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period=10000-1;//周期,就是ARR自动重装器的值TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1;//PSC预分频器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器的值,高级定时器才有TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//为将初始化的值由缓冲寄存器写入,会立刻更新一个中断,所以下面的计数会从1开始而不是0TIM_ClearFlag(TIM2,TIM_FLAG_Update);//手动清除更新中断标志位,避免刚初始化完就进入中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断,更新中断NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//中断通道NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM2,ENABLE);//启动定时器
}//void TIM2_IRQHandler(void)
//{
//	if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)==SET)
//	{
//		
//		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
//	}
//}

<2>对射式红外计数

Timer.c

#include "stm32f10x.h"                  // Device header
extern uint16_t Num;//告诉编译器,在其他地方已经定义了Num的值,自己去找
void Timer_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*初始化GPIO*/GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);/*选择时钟函数*///第二个参数:外部触发预分频器;第三:外部触发极性(上升或下降触发);第四:外部触发滤波器(这里启动滤波防止CNT计数时发生跳变)TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0f);/*配置时基单元*/TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//指定时钟分频,这里不进行分频TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period=10-1;//周期,就是ARR自动重装器的值TIM_TimeBaseInitStructure.TIM_Prescaler=1-1;//PSC预分频器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器的值,高级定时器才有TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//为将初始化的值由缓冲寄存器写入,会立刻更新一个中断,所以下面的计数会从1开始而不是0TIM_ClearFlag(TIM2,TIM_FLAG_Update);//手动清除更新中断标志位,避免刚初始化完就进入中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断,更新中断NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//中断通道NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM2,ENABLE);//启动定时器
}
uint16_t Count(void)//返回计数器的值
{return TIM_GetCounter(TIM2);
}//void TIM2_IRQHandler(void)
//{
//	if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)==SET)
//	{
//		
//		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
//	}
//}

main.c 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "Timer.h" 
uint16_t Num;
int main()
{OLED_Init();OLED_ShowString(1,1,"NUM:");OLED_ShowString(2,1,"CNT:");Timer_Init();while(1){OLED_ShowNum(1,5,Num,3);OLED_ShowNum(2,5,Count(),5);}	
}
void TIM2_IRQHandler(void)
{if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)==SET){	Num++;		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}
}

 

 

当外部输入信号功率很小,而IO内部的上拉电阻可能会影响到输入信号,可以使用浮空输入来防止影响外部输入的电平

二.定时器输出比较

三.定时器输入捕获

四.定时器的编码器 接口

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

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

相关文章

DataTable.Load(reader)注意事项

对于在C#中操作数据库查询&#xff0c;这样的代码很常见&#xff1a; using var cmd ExecuteCommand(sql); using var reader cmd.ExecuteReader(); DataTable dt new DataTable(); dt.Load(reader); ...一般的查询是没问题的&#xff0c;但是如果涉及主键列的查询&#xf…

(2024,CompAgent,LLM,提示分解,基于布局的对象组合)分而治之:语言模型可以规划和自我纠正组合文本到图像的生成

Divide and Conquer: Language Models can Plan and Self-Correct for Compositional Text-to-Image Generation 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1…

【郑益慧】模拟电子技术:8.结型场效应管特性和参数

结型场效应管特性&#xff08;N沟道&#xff09; &#xff1a;当日事当当日毕 &#xff1a;通过讨论加强学习的深度 中间是一个N型区参杂了两个高浓度的P 栅极控制了两个P。 源端电压给0&#xff0c;看一看到图中天生就沟道。 如何控制呢&#xff1f; 给Ugs加反偏电压&…

网络安全B模块(笔记详解)- Sql注入之绕过

1.使用渗透机场景kali中的工具扫描服务器场景,打开搜索页面,并将页面url做为Flag提交(IP地址不提交例如:http:123.com:8080/a/b/a.html提交/a/b/a.html); 2.使用渗透机场景windows7访问服务器场景搜索页面,利用该页面的漏洞,查询数据库的字段,并将字段数作为Flag提交…

仿真APP在金属波纹管液压胀形工艺设计中的应用

一、背景介绍 金属波纹管是带有波纹状截面的金属管状零件&#xff0c;在工业中应用广泛。金属波纹管特殊的截面形状使其具备较好的柔韧性&#xff0c;能够在一定范围内伸缩弯曲。这一特性赋予波纹管两大用途&#xff1a;一是作为变形补偿器&#xff0c;可用于补偿管道设备由于…

Windows系统安装OpenSSH+VS Code结合内网穿透实现远程开发

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

将 Quartz.NET 调度框架与 Stimulsoft Reports 结合使用

今天&#xff0c;我们将深入探讨软件开发的一种现代趋势 - 流程自动化&#xff0c;这自然是 Stimulsoft 产品中报表处理的一部分。在本文中&#xff0c;我们将讨论如何使用第三方调度程序自动执行与 Web 项目中的报告相关的任务。作为对报告执行操作的示例&#xff0c;我们考虑…

Shell脚本中的函数

目录 一.shell函数的作用&#xff1a; 二&#xff1a;shell函数的定义&#xff1a; 三.调用函数的方法&#xff1a; ​四.Shell函数返回值&#xff1a; ​五.函数传参&#xff1a; 六.函数变量的作用范围&#xff1a; ​七.函数的递归&#xff1a; ​八.函数库&#xff…

亚马逊鲲鹏系统的使用方法及操作指南

亚马逊鲲鹏系统作为提升店铺流量与销量的有效工具&#xff0c;其使用方法与功能十分强大。以下是详细的使用方法及操作指南&#xff1a; 1. 批量注册功能&#xff1a; 注册时&#xff0c;需要绑定国外IP代理和最新的反指纹技术&#xff0c;这样每个账号独立运行时就不会造成关…

后序遍历的线索化二叉树

对于后序遍历&#xff0c;需要明确&#xff0c;往往叶子结点&#xff0c;只能指向右子树&#xff08;如果右子树存在的情况&#xff09;&#xff0c;或者指向该结点&#xff08;因为这才是后序遍历&#xff09;&#xff0c;同样在进行退出到前一次递归的时候&#xff0c;我们要…

如何做谷歌seo排名优化?

要优化谷歌搜索排名&#xff0c;网站内容是重中之重&#xff0c;最主要就是创建质量高、相关性强的网站内容&#xff0c; 何谓质量高&#xff1f;最起码要求图文并茂&#xff0c;文章要长&#xff0c;要有视频引用&#xff0c;这是质量高的最基础要求&#xff0c;同时还需要确…

07.领域驱动设计:3种常见微服务架构模型的对比和分析

目录 1、概述 2、整洁架构 3、六边形架构 4、三种微服务架构模型的对比和分析 5、从三种架构模型看中台和微服务设计 5.1 中台建设要聚焦领域模型 5.2 微服务要有合理的架构分层 5.2.1 项目级微服务 5.2.2 企业级中台微服务 5.3 应用和资源的解耦与适配 6、总结 1、概…