07:【江科大stm32】:编码器通过定时器测速

news2024/11/15 10:31:44

编码器通过定时器测速

编码器的转动方向不同,则输出波形的相位也不同。如下图所示:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述编码器标准库的编程接口:

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

#include "stm32f10x.h"                  // Device header

//使用PA6(TIM3_CH1)和PA7(TIM3_CH2)进行编码器的输入

void Encoder_Init(void)
{
	//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 = 1 - 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_Pin_7;
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	//5.对输入捕获单元进行初始化
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICStructInit(&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_ICInit(TIM3, &TIM_ICInitStruct);
	
	//6.配置编码器接口
	TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
	
	TIM_Cmd(TIM3,ENABLE);
}

int16_t Encoder_Get(void)
{
	return TIM_GetCounter(TIM3);//获取计数器的值
}

int16_t Encoder_GetSpeed(void)
{
	int16_t temp;
	temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3,0);//给计数器清零
	return temp;
}

②主程序文件代码如下:

/*
	通过外部中断使用旋转编码器计次
*/

#include "stm32f10x.h"                 
#include "OLED.h"
#include "Timer.h"
#include "Encoder.h"

int16_t Speed;

int main(void)
{
	OLED_Init();
	OLED_Clear();
	Timer_Init();
	Encoder_Init();
	OLED_ShowString(1,1,"Speed:");
	while(1)
	{
		OLED_ShowSignedNum(1,7,Speed,5);
	}
}

void TIM2_IRQHandler(void)//定时器中断设置的是每隔1s执行一次,
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)//判断中断标志位
	{
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志位
		Speed = Encoder_GetSpeed();
	}
}

通过每隔1s就获取定时器TIM3计数器里面的值等于速度。

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

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

相关文章

黑马-Cloud21版-实用篇05:分布式搜索引擎02:DSL查询文档、搜索结果处理、RestClient查询文档、黑马旅游案例

分布式搜索引擎02 在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用DSL和Res…

[Linux]:基本指令(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 与Windows环境不同,我们在linux环境下需要通过指令进行各操作&…

PHP8、ThinkPHP8框架中间的应用教程详解

前言 虽然PHP的落幕的话题一直不绝,但是实际在WEB端项目中PHP占有率达到了70%以上,一直在WEB一枝独秀,它以快速、高效的开发闻名,出圈了几十年,等待只是下一次的涅槃。而经过PHP8、PHP9的演变发展,PHP逐渐…

微软最新轻量级、多模态Phi-3.5-vision-instruct模型部署

Phi-3.5-vision-instruct是微软最新发布的 Phi-3.5 系列中的一个AI模型,专注于多模态任务处理,尤其是视觉推理方面的能力。 Phi-3.5-vision-instruct模型具备广泛的图像理解、光学字符识别(OCR)、图表和表格解析、多图像或视频剪…

【STM32】通用定时器TIM(输入捕获)

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发 目录 前言 输入捕获简介 输入捕获配置 初始化IO口 输入捕获初始化 选择触发源及从模式 测量频率方法 输入捕获代码 IC.h IC.c 输入捕获测占空比 前言 建议先阅读这篇博客&#xf…

Open3D mesh 均值滤波

Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述 均值滤波(Mean Filtering)是一种基本的网格平滑技术,通过将每个顶点的位置替换为其邻域…

[ABC369C] Count Arithmetic Subarrays

首先看了下题意 大致题意就是让你在长度为的序列找出所有的等差数列。 -----------------------------------------------------------------------------------------我是分界线 我的思路了,就是先从2开始计算等差数列,从3开始判断,如果是…

C#从入门到精通(21)—Mutex互斥锁在多线程、多进程下的使用

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!人工智能学习网站 前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任…

C语言调用子函数时入/出栈(保护/恢复现场)全过程分析:以Cortex-M3为例

0 参考资料&工具 Cortex M3权威指南(中文).pdf keil5(用于仿真查看寄存器、栈变化)1 C语言调用子函数时出入/出栈(保护/恢复现场)全过程分析 使用C语言调用子函数是如何保护/恢复现场的呢?本文以Cortex-M3为例&a…

Zynq之IIC使用示例

前言 明确设计思路,精准定位问题,对于我们后期理解迭代工程有很大的帮助。 这就是我们常说的40%设计,20%编写和剩下的40%时间进行调试优化。 今天为大家带来的是Zynq-PS端的IIC使用demo,通过驱动外设DS1337来强化对IIC的使用方…

【C++二分查找 贪心】1552. 两球之间的磁力

本文涉及的基础知识点 C二分查找 贪心:决策兼容性 LeetCode1552. 两球之间的磁力 在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子,第 i 个篮子的位…

百日草花语探秘:天长地久的情感寄托与丰富内涵解析

百日草宛如一颗璀璨的明珠,散发着独特的魅力。它那鲜艳夺目的花朵,仿佛是大自然用最细腻的笔触勾勒而成,每一朵都蕴含着无尽的奥秘与情感。当我们漫步于花海之间,不经意间与百日草相遇,那绚烂的色彩和别致的形态定会让…

李沐动手学深度学习:树叶分类竞赛

视频地址:30 第二部分完结竞赛:图片分类【动手学深度学习v2】 竞赛地址:https://www.kaggle.com/competitions/classify-leaves !nvidia-smi # 查看 GPU 信息 # !lscpu # 查看 CPU 信息 # !free -h # 查看内存(RAM) 信息 # !p…

datax编译:解决datax不支持MongoDB 6.0.10的问题

1. 需求及问题 最近使用datax同步MongoDB中的数据到hive,使用了mongodbreader和hdfswriter插件。MongoDB的版本是6.0.10,而datax的默认编译安装包中mongodbreader插件不支持MongoDB 6.0.10。 DataX工具介绍数据同步工具之DataX-CSDN博客 官方地址 https://github.com/alib…

模型 U型思考法(深度思考)

系列文章 分享 模型,了解更多👉 模型_思维模型目录。探索本质,创新求解。 1 U型思考法的应用 1.1 小罐茶的品牌创新 背景: 小罐茶作为一家新兴的茶叶品牌,面临着传统茶叶市场的激烈竞争和消费者需求的多样化。为了在…

地震模板代码 - 第三部分

Seismic stencil codes - part 3 — ROCm Blogs (amd.com) 2024年8月12日,作者:Justin Chang 和 Ossian O’Reilly。 在前两篇博客文章中,我们开发了一个 HIP 内核,能够计算地震波传播中常用的高阶有限差分。经过优化后&#xf…

Redis KEY操作实战手册:从设计到维护的全面指南

​ 🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索Redis的key的相关操作之旅✨ 👋 大家好!文本…

在 Ubuntu 环境下使用 VSCode 和 PlatformIO 下载程序到 Arduino Uno

安装 VSCode 访问 VSCode 官网 下载 .deb 包使用以下命令安装&#xff1a;sudo dpkg -i <下载的文件名>.deb sudo apt-get install -f安装 PlatformIO 扩展 在 VSCode 中&#xff0c;转到扩展市场&#xff08;CtrlShiftX&#xff09;搜索 “PlatformIO IDE”点击 “安装”…

刷题记录-HOT 100(一)40道

记录题解和思路。 一、哈希表解决问题 1、两数之和 思路&#xff1a; 创建哈希表&#xff1a; 初始化了一个空字典来存储已经访问过的数字及其对应的索引。 遍历数组&#xff1a; 逐一遍历数组中的每个元素。在遍历过程中&#xff0c;针对每个元素 num&#xff0c;计算出它…

手机FM LNA方案设计

一 概述 关于手机FM的使用&#xff0c;较为传统的则是在打开FM应用前先插入有线耳机才能使用FM应用。然而随着智能手机的进步以及有线耳机日益被无线蓝牙耳机所代替&#xff0c;内置FM LNA方案被应用的越来越多&#xff0c;无需插入有线耳机&#xff0c;复用例如GSM天线也能实…