360°旋转中空编码器EC35原理及驱动程序

2023-12-09 16:50

本文主要是介绍360°旋转中空编码器EC35原理及驱动程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一:基本介绍

1:产品介绍

        EC35编码器主要用于频率调节,高度调节,温度调节及音量调节等参数调节。注意编码器避免储藏于高温潮湿及腐蚀的场所,拆包装后未使用完的剩余产品请在防潮防毒的环境下保存。

2:产品参数:

额定:10mA  5VDC

使用温度范围:–40ˆ to +85℃

输出电压:1mA 5V DC(电阻负载)时 2.5V以下

耐电压:300V AC for 1minute

操作寿命:50,000cycles

3:输出波形

 逻辑分析仪测试的正转波形

逻辑分析仪测试的反转波形

 4:原理分析

        由逻辑分析仪测试的波形可知,以A为触发源,当编码器正转的时候,C先变为低电平,紧接着是B。所以编码器正转时波形变化为依次为:A—C—B—A—C....。同理可知编码器反转时波形变化为依次为:A—B—C—A—B....

二:程序设计

1:程序思路

        本篇设计为编码器三个引脚中任意一个引脚触发单片机中断后,通过单片机读取另外两个引脚的状态,从而判断旋钮旋转方向。

        以A引脚为例:将连接编码器引脚A的单片机引脚设置为上升沿触中断,当该引脚触发中断后,如果先读到B变低电平,则此时编码器为反转。如果先读到C变低电平,则此时编码器为正转。

        同理以B引脚为例:将连接编码器引脚B的单片机引脚设置为上升沿触中断,当该引脚触发中断后,如果先读到C变低电平,则此时编码器为反转。如果先读到A变低电平,则此时编码器为正转。

        ........

2:程序编写

①:初始化初始化EC35编码器 A B C 三个引脚

		/* 初始化EC35编码器 A B C 三个引脚 */rcu_periph_clock_enable(EC35_A_CLK);gpio_init(EC35_A_PORT,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,EC35_A_PIN);rcu_periph_clock_enable(EC35_B_CLK);gpio_init(EC35_B_PORT,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,EC35_B_PIN);rcu_periph_clock_enable(EC35_C_CLK);gpio_init(EC35_C_PORT,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,EC35_C_PIN);

②:设置中断

    rcu_periph_clock_enable(RCU_AF);//打开复用时钟nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);//选择优先级组/* 配置EC35编码器 C 引脚中断 */nvic_irq_enable(C_EXTIx_IRQn, 2U, 0U);//配置抢占优先级、子优先级gpio_exti_source_select(C_PORT_SOURCE_GPIOx, C_PIN_SOURCE_x );//配置中断源exti_init(C_EXTI_x, EXTI_INTERRUPT, EXTI_TRIG_FALLING);//配置中断方式exti_interrupt_flag_clear(C_EXTI_x);//清除标志位/* 配置EC35编码器 B 引脚中断 */nvic_irq_enable(B_EXTIx_IRQn, 2U, 1U);gpio_exti_source_select(B_PORT_SOURCE_GPIOx, B_PIN_SOURCE_x);exti_init(B_EXTI_x, EXTI_INTERRUPT, EXTI_TRIG_FALLING);exti_interrupt_flag_clear(B_EXTI_x);/* 配置EC35编码器 A 引脚中断 */nvic_irq_enable(A_EXTIx_IRQn, 2U, 2U);gpio_exti_source_select(A_PORT_SOURCE_GPIOx, A_PIN_SOURCE_x);exti_init(A_EXTI_x, EXTI_INTERRUPT, EXTI_TRIG_FALLING);exti_interrupt_flag_clear(A_EXTI_x);

③:初始化串口

#include "gd32f303r_start.h"static rcu_periph_enum COM_CLK[COMn] = {EVAL_COM1_CLK, EVAL_COM2_CLK};
static uint32_t COM_TX_PIN[COMn] = {EVAL_COM1_TX_PIN, EVAL_COM2_TX_PIN};
static uint32_t COM_RX_PIN[COMn] = {EVAL_COM1_RX_PIN, EVAL_COM2_RX_PIN};
static uint32_t COM_GPIO_PORT[COMn] = {EVAL_COM1_GPIO_PORT, EVAL_COM2_GPIO_PORT};
static rcu_periph_enum COM_GPIO_CLK[COMn] = {EVAL_COM1_GPIO_CLK, EVAL_COM2_GPIO_CLK};void gd_eval_com_init(uint32_t com)
{uint32_t com_id = 0U;if(EVAL_COM1 == com){com_id = 0U;}else if(EVAL_COM2 == com){com_id = 1U;}/* enable GPIO clock */rcu_periph_clock_enable(COM_GPIO_CLK[com_id]);/* enable USART clock */rcu_periph_clock_enable(COM_CLK[com_id]);/* connect port to USARTx_Tx */gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, COM_TX_PIN[com_id]);/* connect port to USARTx_Rx */gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, COM_RX_PIN[com_id]);/* USART configure */usart_deinit(com);usart_baudrate_set(com, 9600U);usart_receive_config(com, USART_RECEIVE_ENABLE);usart_transmit_config(com, USART_TRANSMIT_ENABLE);usart_enable(com);
}

④:中断函数,当编码器正转时串口打印 ++  当编码器反转时串口打印  --  

/*
如果先读到A引脚为低电平,则代表编码器此时正转。
如果先读到B引脚为低电平,则代表编码器此时反转。
*/
void EXTI10_15_IRQHandler(void)
{	static	int a;if(RESET != exti_interrupt_flag_get(C_EXTI_x)) {for(a=0;a<200;a++)//调节a<x,可修改读取时间,x最低不可低于200{	if(A_STATUS==RESET)//如果先读到A引脚为低电平,则代表编码器此时正转。{			printf("--\n");break;//跳出循环}else if(B_STATUS==RESET)//如果先读到B引脚为低电平,则代表编码器此时反转。{printf("++\n");break;//跳出循环				}	delay_1ms(1);}exti_interrupt_flag_clear(C_EXTI_x);						}
}
/*
如果先读到A引脚为低电平,则代表编码器此时正转。
如果先读到C引脚为低电平,则代表编码器此时反转。
*/
void EXTI5_9_IRQHandler(void)
{	static	int a;if(RESET != exti_interrupt_flag_get(B_EXTI_x)) {for(a=0;a<200;a++){if(A_STATUS==RESET){printf("++\n");break;}else if(C_STATUS==RESET){				printf("--\n");break;				}	delay_1ms(1);}exti_interrupt_flag_clear(B_EXTI_x);						}
}
/*
如果先读到C引脚为低电平,则代表编码器此时正转。
如果先读到B引脚为低电平,则代表编码器此时反转。
*/
void EXTI4_IRQHandler(void)
{	static	int a;if(RESET != exti_interrupt_flag_get(A_EXTI_x)) {for(a=0;a<200;a++){if(C_STATUS==RESET){printf("++\n");break;}else if(B_STATUS==RESET){printf("--\n");break;				}	delay_1ms(1);}exti_interrupt_flag_clear(A_EXTI_x);						}
}

⑤:main.c文件

#include "gd32f30x.h"
#include "gd32f303r_start.h"
#include "systick.h"
#include <stdio.h>
#include "EC35.h"int main(void)
{	systick_config();gd_eval_com_init(EVAL_COM1);EC35_Init();while(1) {			}
}/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{usart_data_transmit(EVAL_COM1, (uint8_t)ch);while(RESET == usart_flag_get(EVAL_COM1, USART_FLAG_TBE));return ch;
}

3:运行结果

这篇关于360°旋转中空编码器EC35原理及驱动程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

MySQL的隐式锁(Implicit Lock)原理实现

《MySQL的隐式锁(ImplicitLock)原理实现》MySQL的InnoDB存储引擎中隐式锁是一种自动管理的锁,用于保证事务在行级别操作时的数据一致性和安全性,本文主要介绍了MySQL的隐式锁... 目录1. 背景:什么是隐式锁?2. 隐式锁的工作原理3. 隐式锁的类型4. 隐式锁的实现与源代码分析4

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L