旋转编码器SIQ-02FVS3驱动(AuroraFOC)

2024-01-29 05:36

本文主要是介绍旋转编码器SIQ-02FVS3驱动(AuroraFOC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 简介

本次将基于AuroraFOC开发板,来教大家如何将旋转编码器按键优雅地使用起来,为大家开发多功能按键提供一种思路。请添加图片描述

开发环境

  1. STM32CubeMX HAL库
  2. Clion

作者: FPGA之旅(ValentineHP)

二. 原理(图)介绍

旋转编码器按键原理图如下,它有左旋转、右旋转和按下这三种状态。在默认情况下,EC_AR和EC_BR均为高电平,旋转的时候,它们会依次变为低电平,并且持续一小段时间后变为高电平,不同方向旋转的时候,它们电平的变化会有一个相位差,根据这个方向就可以来判断旋转的方向了。

EC_KEYR默认情况应该是悬空的,在按键按下的时候会拉低,使用的时候需要注意,单片机内部需要将IO口设置为上拉模式,否则读到的值一直为0。
请添加图片描述
请添加图片描述

作者: FPGA之旅(ValentineHP)

三. 编程实现

  1. 定义旋转编码器的状态类型。状态的扩展上主要是在按键上,多了长按和双击,多的两种状态的实现是设计的难点。
//EncoderKey 状态
typedef enum EncoderKeyState{EncoderKey_None = 0,EncoderKey_Click,       //单击EncoderKey_LClick,      //长按EncoderKey_DClick,      //双击EncoderKey_Left,        //左边EncoderKey_Right        //右边
}EncoderKeyState;
  1. 先挑简单的实现: 左右旋转检测(在FPGA驱动电机的文章中已经介绍过了,原理一样)。设置旋转编码器的A相为电平中断,中断类型为上下边沿,那么第一次进入中断一定是下降沿,第二次进入中断一定是上升沿,通过这两次进入中断来判断B相的电平,结合上图,就可以判断出编码器的方向了。
 else if( GPIO_Pin == EC_AR_Pin){ //旋转检测if( ec_flag == 0){if( HAL_GPIO_ReadPin(EC_AR_GPIO_Port,EC_AR_Pin) == 1)   //消除误差,防止误判ec_flag = 0;else  if( HAL_GPIO_ReadPin(EC_BR_GPIO_Port,EC_BR_Pin) == 1)ec_flag = 1;elseec_flag = 2;}else{if( HAL_GPIO_ReadPin(EC_AR_GPIO_Port,EC_AR_Pin) == 0) //消除误差,防止误判;//ec_flag = 0;else if( ec_flag == 1 && HAL_GPIO_ReadPin(EC_BR_GPIO_Port,EC_BR_Pin) == 0)key_state = EncoderKey_Right;else if(ec_flag == 2 && HAL_GPIO_ReadPin(EC_BR_GPIO_Port,EC_BR_Pin) == 1)key_state = EncoderKey_Left;ec_flag = 0;}//  usb_printf("%d %d %d \r\n",ec_flag,HAL_GPIO_ReadPin(EC_AR_GPIO_Port,EC_AR_Pin),HAL_GPIO_ReadPin(EC_BR_GPIO_Port,EC_BR_Pin));}
  1. 终于到了按键检测。需要检测三种不同的按键状态,就需要使用到定时器了,CubeMX默认是使用了SysTick滴答定时器作为了基本的时钟源,所以就不需要使用额外的定时器了。我们可以通过HAL_GetTick这个函数获取当前系统运行的时间戳,这个函数至关重要,也是检测三种不同按键状态的关键

    同样在CubeMX设置按键为电平中断,中断类型为下降上升沿中断(按键默认电平为高电平)。

    1. 第一次按键按下,这个时候会进入中断,我们获取当前系统运行的时间戳,第一次按键释放,也会进入中断,通过两次获取的时间戳差值判断这次按键是否有效(进行消抖处理),这就是检测单击。
    2. 第一次按键释放,通过两次获取的时间戳差值,是否达到了长按的时间的标准,来判断是否为长按。
    3. **双击啦!!!**第二次按键按下,进入中断后,将第一次按键释放时的时间戳 ,与当前时间戳进行比较,两个差小于设置值,说明这次是双击。双击中包含了单击的这一操作,这就会有个冲突,要解决这个冲突其实非常简单,那就是在获取按键状态的时候,如果按键的状态为单击,就来判断当前的时间戳和第一次按键释放时的时间戳的差值是否大于了双击的标准 ,是的话,就返回单击,否则的话就返回没有动作发生。
    /* 获取按键状态 如果按键按下 则会清除按键状态 */
    EncoderKeyState EncoderKey_Driver::get_key_state(){EncoderKeyState state;if( key_state == EncoderKey_Click){if((int32_t)HAL_GetTick() - (int32_t)key_tick < 400 || (int32_t)key_tick - (int32_t)HAL_GetTick() > 400)return EncoderKey_None;}
    #ifdef DEBUG_PRINTFif( key_state != EncoderKey_None){usb_printf("%d\r\n",key_state);}
    #endifstate = key_state;key_state = EncoderKey_None;return state;
    }
    void EncoderKey_Driver::EncoderKey_EXTI_Callback(uint16_t GPIO_Pin) {//按键if( GPIO_Pin == EC_KEY_Pin){if(HAL_GPIO_ReadPin(EC_KEY_GPIO_Port,EC_KEY_Pin) == 0) {if (HAL_GetTick() - key_tick < 400)dclick_flag = 1;elsedclick_flag = 0;key_tick = HAL_GetTick();}else{if( HAL_GetTick() - key_tick > 800)   //长按key_state = EncoderKey_LClick;else if(HAL_GetTick() - key_tick  > 5){key_state = (dclick_flag == 0)? EncoderKey_Click : EncoderKey_DClick;}dclick_flag = 0;}}
    }
    

是不是总体是还是比较简单的,如果大家有更好的实现方法,可以一起交流交流哦!!

这篇关于旋转编码器SIQ-02FVS3驱动(AuroraFOC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/655862

相关文章

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

css实现图片旋转功能

《css实现图片旋转功能》:本文主要介绍了四种CSS变换效果:图片旋转90度、水平翻转、垂直翻转,并附带了相应的代码示例,详细内容请阅读本文,希望能对你有所帮助... 一 css实现图片旋转90度.icon{ -moz-transform:rotate(-90deg); -webkit-transfo

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

poj 2187 凸包or旋转qia壳法

题意: 给n(50000)个点,求这些点与点之间距离最大的距离。 解析: 先求凸包然后暴力。 或者旋转卡壳大法。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <s

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk