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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 视觉几何三维重建是指利用摄像机拍摄的多个视角下的图像,通过计算机图形学算法获得三维模型的过程。其中,openmvs是一种基于MVS(多视角几何重建)实现的三维重建工具。 OpenMVS是一个开源的三维重建工具,基于MVS算法,可以实现从多个图像中生成高精度的三维模型。OpenMVS的几何重建算法主要是采用光束法,通过对图像进行矩阵重建来计算相机位置和三角形点云。OpenMVS的几何重建方法相对于其他算法具有较高的稳定性和精度。 在OpenMVS的源码分析中,主要包括三个部分:几何重建、点云和网格处理。几何重建是基于多视角几何的,通过将多个图像的视角转化到同一个坐标系中,可以计算出三角形的点云。点云处理主要包括点云优化和稠密重建。网格处理则是在点云的基础上生成三角形网格模型。 OpenMVS的优势在于能够充分利用多视图几何的信息,提高三维重建的精度和效率。而且该工具具有良好的可扩展性和适应性,可以在不同场景下应用。同时,OpenMVS的开源代码也为研究者提供了一个可靠的研究平台,进行更深入的算法研究和开发。 总之,视觉几何三维重建是一项非常复杂的任务,而OpenMVS作为一个优秀的三维重建工具,通过独特的几何重建算法和优秀的可扩展性,加速了三维重建的研究和应用。 ### 回答2: 首先,视觉几何三维重建是一项重要的计算机视觉技术,其主要目的是利用多视角图像或视频序列来恢复场景的三维结构。在该过程中,重建算法必须解决诸多技术难题,如图像匹配、相机姿态估计、点云配准、三维重建等。 而OpenMVS则是一款优秀的三维重建软件,其核心算法基于多视图几何,能够高效、精确地处理大规模三维数据。具体来说,OpenMVS采用稀疏点云表示法(Sparse Point Cloud)和密集点云表示法(Dense Point Cloud)来表示场景中的点云信息,其中稀疏点云用于初始匹配,密集点云用于表面重建。 在实现中,OpenMVS采用先进的图像流水线(Image Pipeline)来处理输入的图像序列,包括预处理(Pre-processing)、特征提取(Feature Extraction)、特征匹配(Feature Matching)等多个步骤。在此基础上,OpenMVS还提供了多种优化方法,如基于非线性优化的相机姿态估计、自适应曲率滤波等,以进一步提高重建效果。 值得指出的是,OpenMVS作为一款开源软件,其源代码也是完全开放的。此外,OpenMVS还具有友好的用户界面和丰富的文档,能够帮助用户快速上手并实现高质量的三维重建。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值