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

相关文章

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、