一:基本介绍 1:产品介绍
EC35编码器主要用于频率调节,高度调节,温度调节及音量调节等参数调节 。注意编码器避免储藏于高温潮湿及腐蚀的场所,拆包装后未使用完的剩余产品请在防潮防毒的环境下保存 。
2:产品参数:
额定:10mA 5VDC
使用温度范围:–40? to +85℃
【360°旋转中空编码器EC35原理及驱动程序】输出电压:1mA 5V DC(电阻负载)时 2.5V以下
耐电压:300V AC for
操作寿命:50,
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
⑤:main.c文件
#include "gd32f30x.h"#include "gd32f303r_start.h"#include "systick.h"#include #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你财富安全吗 360的你财富
- 23款奔驰GLC260L升级原厂360全景影像 打破死角
- 23款奔驰GLC300L升级原厂360全景影像 高清环绕无死角
- 旋转导电滑环有哪些特性
- 光纤技术对旋转导电滑环厂家的重要性
- 13600kf有必要水冷吗
- C语言----基于旋转编码器按键的菜单结构
- Givens旋转与Householder反射
- 360n4s无限重启 360n4s无限重启元凶
- ipad看电视怎么旋转屏幕