|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
先上代碼為敬4 M) K( E! J% E7 i5 ?4 i
- if(!PinA && PinA_O && PinB) {
- Now++;
- }PinA_O = PinA;
- if(!PinB && PinB_O && PinA) {
- Now--;
- }PinB_O = PinB;/ d b- I& d$ i) S4 S) r
% M n! A7 E T9 Z4 B复制代码
, r8 r0 q+ ]; {# E0 L& o" `. [0 z只有六行代碼就能用EC11對Now進行加減操作
' s7 U9 z% l- c! d' t( h
/ s- O7 F8 x7 ~8 o9 [" Q为什么这样写呢?
! j3 |! A r1 z8 b1 D7 F. \上时序图1 K+ q) P" E7 O
顺时针转:* p& i" }8 K# N, ?, e: S) \1 R
. J) [3 \ c6 j1 G* Y# w# a
/ W/ M9 `: |: N- v2 p1 T8 ^
逆时针转:
& u" N# G5 v2 R* s$ U) h![]()
* L, i7 Z* x- D8 `6 L; J% d3 P
1 {7 z$ K* g( J8 r6 E% }2 l我们看到,当顺时针转时: B0 i, W- |6 L) l% V7 D; I; y, I$ c
Pin A会早于Pin B 转低电平,反之亦然5 N$ C- j, z( I& F. u
8 U7 V" `5 C" V* h6 ^2 X( z4 L* V( i代码解读:; r/ |5 c1 O4 d, Z) s
!PinA && PinA_O && PinB//当Pin A 为低电平而之前为高电平(即下降沿)并且Pin B为高电平+ i" e( N4 G! F) C3 `
这一句就捕捉到顺时针转时序图中箭指着的那一刹那的情况5 k, z7 t3 v& q8 @2 `1 u
于是Now加1
. ~# b: ], N/ z2 u F! B
% A# S3 J6 y& |" m y. f& Q! V; @3 v!PinB && PinB_O && PinA//当Pin B 为低电平而之前为高电平(即下降沿)并且Pin A为高电平, D1 i6 K- T; X7 \
这一句就捕捉到逆时针转时序图中箭指着的那一刹那的情况: Q* t% ]) e) h8 W
于是Now减1* W. v6 J) d$ c3 e, B1 D
/ G0 k: o( C4 U- b2 T9 ]
) L( T# y: M; O
/ V- ?4 z2 N3 }/ H5 k9 K如果编码器不加电容消抖; s w: H3 E( f! o
就用软件消抖
. w0 Z, n& i0 }4 a) x6 H; a$ H2 c
$ ^, c* {2 A2 K3 R/ U- if(ScanCount++ > 50) { //其数值按单片机速度加减
- ScanCount = 0;
- if(PinA && !PinA_O && PinB) {
- Now++;
- }PinA_O = PinA;
- if(PinB && !PinB_O && PinA) {
- Now--;
- }PinB_O = PinB;
- Now>9? Now = 0:_nop_();
- Now<0? Now = 9:_nop_();
- }
$ j7 d) T; J2 c/ G% Y% ` F
7 o- Y" m2 K" t$ ^: a复制代码
$ D% T9 {3 d$ P2 c: M现附上小应用实例一则
' n$ d+ C3 T3 [5 o. r. o基如STC15F104E的EC11软串口六位密码检查程序 T' l' A; J0 e3 @& ], w4 Q
如发现顺逆时针相反,对调PinA/PinB 定义脚即可
* C' E( B9 w b |
|