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

阅读: 评论:0

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

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:运行结果

本文发布于:2024-02-03 08:12:03,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170691912149760.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:编码器   驱动程序   原理
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23