STM32 HAL高级定时器正交编码模式案例

STM32 HAL高级定时器正交编码模式案例


  • 🔖基于stm32F030RBT6单片机采用高级定时器1,编码器模式,测试EC11编码器。
  • 🎬EC11测试效果:
    在这里插入图片描述

  • 🌿STM32定时器编码器有3种映射模式:

在这里插入图片描述

  • ✨本次采用的是上面的模式3,EC11编码器每转动一小格,TIM1定时器可以捕获到4个脉冲信号,也就是定时器捕获4个脉冲信号就代表编码器旋转了一小格。

在这里插入图片描述
在这里插入图片描述

  • 🌿EC11编码器原理图
    在这里插入图片描述

🛠STM32CubeMX配置

  • 🌿使能高级定时器TIM1,配置编码器模式。
    在这里插入图片描述

  • 🔧参数配置
    在这里插入图片描述

  • 🌿编码器引脚配置:
    在这里插入图片描述

  • 🌿EC11编码器按键引脚配置
    在这里插入图片描述

  • 🌿中断配置
    在这里插入图片描述

📓功能代码实现部分

  • 📝中断回调部分
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef* htim)
{if(htim == &htim1){__HAL_TIM_CLEAR_IT(htim, TIM_FLAG_TRIGGER);//清除中断标志位if(__HAL_TIM_GET_FLAG(htim, TIM_CHANNEL_1) != RESET){Trg++;}if(__HAL_TIM_GET_FLAG(htim, TIM_CHANNEL_2) != RESET){Trg++;}if((++Trg)==4){Trg =0;CaptureNum = __HAL_TIM_GET_COUNTER(&htim1) / 4;}}
}
/*** @brief 更新溢出回调函数* @retval None*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)
{__HAL_TIM_CLEAR_IT(htim, TIM_FLAG_UPDATE);//清除更新中断标志位
}
void EXTI4_15_IRQHandler(void)
{/* USER CODE BEGIN EXTI4_15_IRQn 0 *//* USER CODE END EXTI4_15_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(EC11M_Pin);/* USER CODE BEGIN EXTI4_15_IRQn 1 */// 清除中断标志位__HAL_GPIO_EXTI_CLEAR_IT(EC11M_Pin);// 调用外部中断回调函数HAL_GPIO_EXTI_Callback(EC11M_Pin);/* USER CODE END EXTI4_15_IRQn 1 */
}//重写外部中断回调函数EC11按键清零计数值
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{/*判断是中断引脚*/if(GPIO_Pin == EC11M_Pin){__HAL_TIM_SET_COUNTER(&htim1, 0);    }}
  • 📑main函数代码
int main(void)
{/* USER CODE BEGIN 1 */uint32_t TimerUART;uint32_t Temp;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM1_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */
//	HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);//查询方式__HAL_TIM_SET_COUNTER(&htim1, 0);__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);/* 清零中断标志位 */__HAL_TIM_CLEAR_IT(&htim1, TIM_IT_UPDATE);HAL_TIM_Encoder_Start_IT(&htim1, TIM_CHANNEL_ALL);//中断方式TimerUART = HAL_GetTick();printf("STM32F030 SysClockFreq:%d \r\n", HAL_RCC_GetSysClockFreq());/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if((HAL_GetTick() - TimerUART) > 1000){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);TimerUART = HAL_GetTick();}if(CaptureNum != Temp){Temp = CaptureNum;HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim1)==0?printf("正转\tCaptureNum:%d\r\n",CaptureNum):printf("反转\tCaptureNum:%d\r\n",CaptureNum);}}/* USER CODE END 3 */
}

📚测试工程(模式三)

链接:https://pan.baidu.com/s/1idS6b4bA5YZXg54joM1WsA 
提取码:a0eg

🏳‍🌈模式一和模式二使用介绍

  • 🔖编码模式1和编码模式2使用方法一样,只不过触发信号通道不一样而已,EC11编码器每转动一小格,触发定时器计数脉冲数都是2次。
    在这里插入图片描述

  • 📋定时器输入捕获中断回调函数执行做调整修改即可。

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef* htim)
{if(htim == &htim1){__HAL_TIM_CLEAR_IT(htim, TIM_FLAG_TRIGGER);//清除中断标志位if(__HAL_TIM_GET_FLAG(htim, TIM_CHANNEL_1) != RESET){Trg++;}
//        if(__HAL_TIM_GET_FLAG(htim, TIM_CHANNEL_2) != RESET)
//        {
//					Trg++;
//        }if((++Trg)==2){Trg = 0;CaptureNum = __HAL_TIM_GET_COUNTER(&htim1) / 2;}}
}
  • 🔖此文章仅作为个人学习探索知识的总结,不作为他人或引用者的理论依据,由于学识所限,难免会出现错误或纰漏,欢迎大家指正。

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

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

相关文章

postgresql14-模式的管理(三)

基本概念 postgresql成为数据库管理系统DBMS,在内存中以进程的形态运行起来成为一个实例,可管理多个database。 数据库databases:包含表、索引、视图、存储过程; 模式schema:多个对象组成一个模式,多个模…

2023年10月22日找工作面试交流遇到的基本问题

交叉编译解决的痛点问题 不同硬件体系结构之间的编译问题。嵌入式系统开发需要在主机上编写代码。提高效率和节省时间。软件移植和管理依赖关系。 不同硬件体系结构之间的编译问题:例如,你开发了一个针对Intel x86架构的应用程序,但想要在Ra…

学成在线第一天-课程内容管理服务搭建以及查询课程接口设计

目录 一、搭建课程内容管理服务 二、设计接口 三、面试题 四、总结 一、搭建课程内容管理服务 没什么好说的,直接就是创建内容模块 然后这个继承父模块,然后再课程内容模块下面创建三个子模块,model、sevice、controller model依赖base…

分享一下微信小程序的文章中怎么添加营销活动

在数字化时代,小程序已经成为企业营销的重要工具。通过小程序,企业可以提供更加便捷、高效的服务,吸引更多的用户和客户。本文将以小程序营销活动为主题,介绍如何在小程序文章中加入营销活动,提高品牌知名度和销售额。…

告别SQL优化和数据迁移备份烦恼,NineData--小白也能成为DBA的秘密武器!

1、概述 说起sql优化,大家可能首先想到的是创建索引、避免全表扫描、减少子查询及优化查询语句、避免隐式类型转换、慢查询日志记录慢SQL、explain分析SQL的执行计划及调优等等。当然,这也是我们常使用的一些调优手段,而且对开发人员也有一定…

【C语言】用函数实现模块化程序设计

前言:如果把所有的程序代码都写在一个主函数(main函数)中,就会使主函数变得庞杂、头绪不清,使阅读和维护程序变得困难。此外,有时程序中要多次实现某一功能,如果重新编写实现此功能就会使得程序冗长、不精炼。 &#x…

pubsub-js在react中的使用

pubsub-js 是一个用于实现发布-订阅模式的 JavaScript 库,可以用于不同组件之间的通信。在 React 中,可以使用 pubsub-js 来实现组件之间的通信。 以下是在 React 中使用 pubsub-js 的示例代码: 安装 pubsub-js 库 使用 npm 或 yarn 安装 …

【数字IC设计/FPGA】FIFO与流控机制

流控,简单来说就是控制数据流停止发送。常见的流控机制分为带内流控和带外流控。 FIFO的流水反压机制 一般来说,每一个fifo都有一个将满阈值afull_value(almost full)。当fifo内的数据量达到或超过afull_value时,将满…

天气、气象相关API汇总分享

空气质量查询:支持国内3400个城市的整点观测,并附带空气质量监测点(全国共2335个)的整点观测数据。天气预报查询:支持全国以及全球多个城市的天气查询,包含国内3400个城市以及国际4万个城市的实况数据&…

KNN 和 SVM 图片分类 任务 代码及细节分享

使用KNN (K-最近邻) 方法进行图像分类也是一个常见的选择。以下是 使用sklearn的KNeighborsClassifier进行图像分类的Python脚本: import os import cv2 import numpy as np import logging from sklearn.neighbors import KNeighborsClassifier from sklearn.met…

MQ常见的问题(kafka保证消息不丢失)

MQ常见的问题 1,mq如何避免消息堆积问题。 消息堆积:生产者的生产速率远远大于消费者的消费速率,使消息大批量的堆积在消息队列。 解决方案:1,提升消费者的消费速率(增加消费者集群) 2&…

强化学习代码实战(2) --- 多臂赌博机

目录 前言 1.Python基础 2.Numpy基础 3.多臂赌博机 参考文献 前言 本文内容来自于南京大学郭宪老师在博文视点学院录制的视频,课程仅9元地址,配套书籍为深入浅出强化学习 编程实战 郭宪地址。 1.Python基础 1. print() 可以用该语句查看当前数据的情…

2023版 STM32实战11 SPI总线读写W25Q

SPI全称 英文全称:Serial peripheral Interface 串行外设接口 SPI特点 -1- 串行(逐bit传输) -2- 同步(共用时钟线) -3- 全双工(收发可同时进行) -4- 通信只能由主机发起(一主,多从机) 开发使用习惯和理解 -1- CS片选一般配置为软件控制 -2- 片选低电平有效,从…

2023.10.22 关于 定时器(Timer) 详解

目录 引言 标准库定时器使用 自己实现定时器的代码 模拟实现的两大方面 核心思路 重点理解 自己实现的定时器代码最终代码版本 引言 定时器用于在 预定的时间间隔之后 执行特定的任务或操作 实例理解: 在服务器开发中,客户端向服务器发送请求&#…

Spring Cloud 之 GateWay简介及简单DEMO的搭建

(1)Filter(过滤器): 和Zuul的过滤器在概念上类似,可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的…

微信小程序WeUI项目weui-miniprogram如何运行起来?

微信小程序WeUI项目weui-miniprogram如何运行起来? 解决方法: 1、下载 https://github.com/wechat-miniprogram/weui-miniprogram 2、在项目根目录weui-miniprogram-master执行以下命令安装依赖: npm install 3、继续执行编译命令: npm r…

Unity3D 基础——鼠标悬停更改物体颜色,移走恢复

方法介绍 【unity学习笔记】OnMouseEnter、OnMouseOver、OnMouseExit_unity onmouseover_一白梦人的博客-CSDN博客https://blog.csdn.net/a1208498468/article/details/117856445 GetComponent()详解_getcomponet<> 动态名称-CSDN博客https://blog.csdn.net/kaixindrag…

C# 写入文件比较

数据长度&#xff1a;128188个long BinaryWriter每次写一个long 耗时14.7828ms StreamWriter每次写一个long 耗时44.0934 ms FileStream每次写一个long 耗时20.5142 ms FileStream固定chunk写入&#xff0c;循环操作数组&#xff0c;耗时13.4126 ms byte[] chunk new byte[d…

国际物流报关流程

国际物流报关流程如下&#xff1a; 准备资料&#xff1a;根据国家和地区的要求&#xff0c;准备相关的报关资料&#xff0c;包括进出口货物清单、运输合同、发票、装箱单等文件。 海关申报&#xff1a;将准备好的报关资料递交给海关申报&#xff0c;海关会根据报关单上的信息对…

1. 前缀码判定

题目 前缀码&#xff1a;任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。 请编写一个程序&#xff0c;判断输入的n个由1和0组成的编码是否为前缀码。如果这n个编码是前缀码&#xff0c;则输出"YES”&#xff1b;否则输出第一个与前面编码发生矛盾的编码。…