旋转编码器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

相关文章

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

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

二维旋转公式

二维旋转公式 ros的tf工具包可以很方便的实现任意坐标系之间的坐标转换。但是,如果只是想简单的测试想法,而又不想编写过于庞杂的代码,考虑自己写二维旋转的函数。而与二维旋转问题对偶的另一个问题便是二维坐标系旋转变换。这两个问题的形式基本一样,只是旋转的角度相差一个负号。就是这个容易搞混,所以做个笔记,以备查用。 1. 二维旋转公式(算法) 而(此文只针对二维)旋转则是表示某一坐标点 ( x

算法复杂度 —— 数据结构前言、算法效率、时间复杂度、空间复杂度、常见复杂度对比、复杂度算法题(旋转数组)

目录 一、数据结构前言 1、数据结构 2、算法 3、学习方法 二、 算法效率 引入概念:算法复杂度  三、时间复杂度 1、大O的渐进表示法 2、时间复杂度计算示例  四、空间复杂度 计算示例:空间复杂度 五、常见复杂度对比 六、复杂度算法题(旋转数组) 1、思路1 2、思路2 3、思路3 一、数据结构前言 1、数据结构         数据结构(D

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,