编程语言
首页 > 编程语言> > 杰理AC692X系列编码器通过GPIO采集实现编程

杰理AC692X系列编码器通过GPIO采集实现编程

作者:互联网

1、分别定义两个IO口并将其初始化
#define A_ENCODER_PORT JL_PORTA
#define B_ENCODER_PORT JL_PORTA
#define A_ENCODER_BIT BIT(3)
#define B_ENCODER_BIT BIT(4)
#define ENCODER_INIT() do{A_ENCODER_PORT->DIR |= (A_ENCODER_BIT);A_ENCODER_PORT->PD &= ~
(A_ENCODER_BIT);A_ENCODER_PORT->PU |= (A_ENCODER_BIT);
B_ENCODER_PORT->DIR |= (B_ENCODER_BIT);B_ENCODER_PORT->PD &= ~
(B_ENCODER_BIT);B_ENCODER_PORT->PU |= (B_ENCODER_BIT);}while(0)

#define A_ENCODER_IN ((A_ENCODER_PORT->IN & A_ENCODER_BIT))
#define B_ENCODER_IN ((B_ENCODER_PORT->IN & B_ENCODER_BIT))
2、 扫描编码器子函数
/**********************************************************
在编码器引脚A为低电平期间:
编码器引脚B从0到1为正转,编码器引脚B从1到0为反转。
**********************************************************/
static void encoder_scan(void)
{
static u8 Aold = 0, Bold = 0; //定义了两个变量用来储蓄上一次调用此方法是编码开关两引脚的电平
static u8 st1 = 0, st2 = 0; //定义了一个变量用来储蓄以前是否出现了两个引脚都为高电平的状态

ENCODER_INIT();

if ((A_ENCODER_IN && B_ENCODER_IN)) {
st1 = 1;
}

else if (((!A_ENCODER_IN) && (!B_ENCODER_IN))) {
st2 = 1;
}

if (st1) {
if (((!A_ENCODER_IN) && (!B_ENCODER_IN))) {
if (Bold) { //为高说明编码开关在向加大的方向转
st1 = 0;
task_post_msg(NULL, 1, MSG_VOL_UP);
}
if (Aold) { //为高说明编码开关在向减小的方向转
st1 = 0;
task_post_msg(NULL, 1, MSG_VOL_DOWN);
}
}
}

if (st2) {
if (((A_ENCODER_IN) && (B_ENCODER_IN))) {
if (!Bold) { //为高说明编码开关在向加大的方向转
st2 = 0;
task_post_msg(NULL, 1, MSG_VOL_UP);
}
if (!Aold) { //为高说明编码开关在向减小的方向转
st2 = 0;
task_post_msg(NULL, 1, MSG_VOL_DOWN);
}
}
}

if (A_ENCODER_IN) {
Aold = 1;
} else {
Aold = 0;
}

if (B_ENCODER_IN) {
Bold = 1;
} else {
Bold = 0;
}

LOOP_DETECT_REGISTER(encoder_scan_loop) = {
.time = 1 //2ms中断扫描
.fun = encoder_scan,
};

VX FY1174801586 发布了15 篇原创文章 · 获赞 0 · 访问量 194 私信 关注

标签:编码器,Bold,引脚,ENCODER,杰理,AC692X,BIT,PORT,define
来源: https://blog.csdn.net/FY1174801586/article/details/104158528