一、编码开关原理?
--------------有趣的是顺时针方向A端子比B端子快半个周期,而逆时针方向A端子比B端子慢半个周期
二、示例代码
1.头文件
代码如下(示例):
#ifndef __EC11_H_
#define __EC11_H_
void EC11_Key_Detect(void);
#define K1 _pc0 //根据自己所使用的芯片规则定义
#define K1A _pc2 //根据自己所使用的芯片规则定义
#define K1B _pc1 //根据自己所使用的芯片规则定义
//如果实际的正转和反转方向不对可以把K1A和K1B引脚定义调换
#define TIME_OF_ROTATION 2 //根据自己所使用的编码器的灵敏度和芯片的主频来设定
#endif
2.C文件
代码如下(示例):
#include "EC11.h"
void EC11_Key_Detect(void)
{
static unsigned char input_status=0;
static unsigned char last_status=0;
static unsigned char Left_status=0;
static unsigned char right_status=0;
// 根据原理图可以知道关键点在以下的4个状态
if(K1A) {
if(K1B) input_status=1; //11
else if(!K1B) input_status=2; //10
}
else if(!K1A) {
if(K1B) input_status=3; //01
else if(!K1B) input_status=4; //00
}
//
if(last_status != input_status) {
if(input_status == 2 && last_status == 1) {
++Left_status; right_status=0;
}
else if(input_status == 4 && last_status == 2) {
++Left_status; right_status=0;
}
else if(input_status == 3 && last_status == 4) {
++Left_status; right_status=0;
}
else if(input_status == 1 && last_status == 3) {
++Left_status; right_status=0;
} //反转
else if(input_status == 3 && last_status == 1) {
++right_status; Left_status=0;
}
else if(input_status == 4 && last_status == 3) {
++right_status; Left_status=0;
}
else if(input_status == 2 && last_status == 4) {
++right_status; Left_status=0;
}
else if(input_status == 1 && last_status == 2) {
++right_status; Left_status=0;
} //正转
if(Left_status >= TIME_OF_ROTATION || right_status >= TIME_OF_ROTATION ) { //防抖动
if(Left_status >= TIME_OF_ROTATION) {
; //执行左旋的功能
}
else if(right_status >= TIME_OF_ROTATION) {
; //执行右旋的功能
}
Left_status=0;
right_status=0;
}
last_status=input_status;
}//last_status != input_status
}
电路设计
例如:R9 R12 为上拉电阻 C11 C12为下拉电容 大家可以适当调整阻值和容值 (感兴趣的可以尝试)。
总结
本人抱着学习的心态 , 欢迎大家指教 , 无论是代码或者电路方面的疑问或者存在错误 , 本人乐意解答和学习,欢迎加本人QQ 243700588