目录
前言
编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器把角位移或直线位移转换成电信号。
一、EC11原理
二、代码
/********************************宏定义***********************************/
#define Clk_EncodeA RCC_APB2Periph_GPIOB
#define Pin_EncodeA GPIO_Pin_13
#define Port_EncodeA GPIOB
#define Clk_EncodeB RCC_APB2Periph_GPIOB
#define Pin_EncodeB GPIO_Pin_14
#define Port_EncodeB GPIOB
/********************************变量声明***********************************/
typedef struct
{
uint8_t A_cur;
uint8_t A_prv;
uint8_t B_cur;
uint8_t B_prv;
uint8_t flag;
}Encode_TypeDef;
//引脚初始化
void Encode_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(Clk_EncodeA | Clk_EncodeB, ENABLE); //使能EncodeA端口时钟
GPIO_InitStructure.GPIO_Pin = Pin_EncodeA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(Port_EncodeA, &GPIO_InitStructure); //初始化GPIOA
GPIO_InitStructure.GPIO_Pin = Pin_EncodeB;
GPIO_Init(Port_EncodeB, &GPIO_InitStructure); //初始化GPIOA
}
//放在主函数扫描
void Encode_Handle(void)
{
encode_struct.A_cur = GPIO_ReadInputDataBit(Port_EncodeA, Pin_EncodeA);
encode_struct.B_cur = GPIO_ReadInputDataBit(Port_EncodeB, Pin_EncodeB);
if (encode_struct.A_cur)
{
encode_struct.A_prv = encode_struct.A_cur;
}
else
{
if (encode_struct.A_prv)
{
if (encode_struct.B_cur)
{
forward_times_cnt = 0;
reverse_times_cnt++;
}
else
{
reverse_times_cnt = 0;
forward_times_cnt++;
}
}
encode_struct.A_prv = encode_struct.A_cur;
}
}