目录
一、飞梭编码器工作原理
1、如下图:
正转:当 A 触发下降沿中断并且为低电平的时候,B为低电平(2点);同时当 A 触发上升沿中断并且为高电平的时候,B为高电平(4点);
反正:当 A 触发下降沿中断并且为低电平的时候,B为高电平(1点);同时当 A 触发上升沿中断并且为高电平的时候,B为低电平(3点);
二、C源码实现
/* Encoder.c */
#include "Encoder.h"
#include "timer.h"
#define EC_PORT GPIOB
#define EC_A_PIN GPIO_PIN_1
#define EC_B_PIN GPIO_PIN_0
#define EC_READ_A() gpio_input_bit_get(EC_PORT,EC_A_PIN)
#define EC_READ_B() gpio_input_bit_get(EC_PORT,EC_B_PIN)
/********************************************************************************
* @brief 编码器初始化
*******************************************************************************/
void Encoder_Init(void)
{
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_AF); //一定要加上
//GPIOB1
gpio_init(EC_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, EC_A_PIN);
//GPIOB0
gpio_init(EC_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, EC_B_PIN);
/* enable and set key EXTI interrupt to the lowest priority */
nvic_irq_enable(EXTI1_IRQn, 7U, 0U); //ENET_IRQn
/* connect key EXTI line to key GPIO pin */
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_1);
/* configure key EXTI line */
exti_init(EXTI_1, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
exti_interrupt_flag_clear(EXTI_1);
}
u8 B1_Status=2;
u8 B2_Status=2;
//中断服务函数
void EXTI1_IRQHandler(void)
{
if(RESET != exti_interrupt_flag_get(EXTI_1)) //产生中断
{
if(gpio_input_bit_get(EC_PORT,EC_A_PIN) == 0)
{
if(gpio_input_bit_get(EC_PORT,EC_B_PIN))
{
B1_Status=1;
}
else
{
B1_Status=0;
B2_Status=0;
}
}
else
{
if(vaildCount) //可在定时器添加一个定时去读取脉冲再响应,防止跳变太快
{
if(gpio_input_bit_get(EC_PORT,EC_B_PIN))
{
B2_Status=1;
}
else
{
B2_Status=0;
}
if(B1_Status && (B2_Status==0))
{
//正转处理
}
else if((B1_Status==0) && B2_Status)
{
//反转处理
}
vaildCount=0;
}
B1_Status=2;
B2_Status=2;
}
exti_interrupt_flag_clear(EXTI_1);
}
}