你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8S003外部中断识别机械式编码器的正反转

[复制链接]
perpetuiy 发布时间:2015-11-7 23:07
本帖最后由 perpetuiy 于 2015-11-7 23:08 编辑
$ s/ b; p1 x3 w. k3 |; @5 d6 {* `* _. C
最近在项目上,用到鼠标上用的编码器,按照厂家给的编程方法,发现容易产生误判,故而自己用外部中断的方式来做,发现这样误判的情况会得到很大的改善,现发上来与大家分享。' {( o2 j8 v8 ]0 j: q0 Z
#include "stm8s103f3p.h"
* ?* E* p1 g5 X  x#include "stm8s_bitsdefine.h"- Y" ^, J# N8 w$ J5 @5 q
#include "typedef.h"
& u$ m4 j0 P2 O#define  CodeA PB_IDR_0
, H6 Y- A/ o7 v* N2 p1 y#define  CodeB PB_IDR_1
1 r2 J! }3 U1 buint8_t CodeB_last,CodeB_current,whe_ch,ADJ;) a5 x7 ]$ _9 @/ h
void UART1_Init(void)" @9 B9 B2 m9 C( w, j
{   
) ]4 d' g# X0 i6 K9 O        UART1_CR2=0x00;        
/ Q3 O3 ?; f  k: v8 a! F        UART1_CR1=0x00;           
. i5 q# m, I1 G        UART1_CR3=0x00;           : R! i  k- d& A
        UART1_BRR2=0x00;/ y1 S* c5 \$ }, ]% {, g; X3 U
        UART1_BRR1=0x0d;         
; W5 x. T  D" b9 R        UART1_CR2=0x2C;              . g) h' |( n/ k
}
- A9 X7 a0 G8 l& W: \void UART1_SendChar(uint8_t  ch)
9 x* |7 j9 i, ]2 l0 |9 [9 u: \{; d# f% k/ ?0 d4 z
        while((UART1_SR & 0x80) == 0x00);
  O  X- b7 ~1 T6 I. u5 K        UART1_DR = ch;  # O* B' x( M; k5 N- l5 m& B0 S" i
        % z& |( \! S; x8 |7 F
}
+ e0 p6 u6 M! s4 G& Lvoid IO_Init(void)% e3 h  ^2 m/ S0 C' _- x  T( \9 J' G7 w
{; J! y" x+ G: A& K* f
        PB_DDR=0x04;
+ [1 q! _! c( @+ Y# @        PB_CR1=0x07;' \% o2 w' `9 `  o
        PB_CR2=0x01;
% [3 x$ E: O! V3 x}
# D3 C4 X; X2 L1 [, b% L2 Yvoid EXTI1_INIT(void)) F' [4 j; i. o" c
{
1 W& g; y  z0 ^        EXTI_CR1=0x08;
2 K+ E0 m5 N: D3 d. C}# ]/ _% s: r, t! x& q
main()* \1 i: D; p2 H3 p) `8 N) _" \
{
& b7 B/ I' Q2 ~  U: `5 F4 i        IO_Init();: q) _9 e. f" E2 a! b
        EXTI1_INIT();/ m$ P2 X$ x  J
        UART1_Init();5 K# D! r" C9 p; n3 D
        _asm("rim");
4 L, N% Y7 b. B, f        while(1) ;9 }" x2 Y$ P6 E# I2 p* k. x$ }
}4 {/ V  Q* D7 H
@far @interrupt void EXTI1_IRQHandler(void)4 r/ q8 \& q2 e& w4 p/ m0 [& Z
{7 i' k( u5 u! _- j( o, d& [: m% w
        _asm("sim");2 c4 u" v1 `# B  q" j+ X
        whe_ch++;2 S) `. W1 A5 U- a" j& Q! l
        if(whe_ch==1)( c  q" C2 P* t
        {, K1 I( u  X1 z; g. x  j
                CodeB_last=CodeB;
2 Z, _  L2 R. Y" y2 v9 \4 s                IO_Init();
2 d- Y0 h& m/ ~5 N7 W% q/ s# j                EXTI_CR1=0x04;
5 Z4 B& j1 t8 _9 I3 K- Z        }
+ W+ I$ `4 V- R; R" J& @        if(whe_ch==2)
2 |( |" J7 [& g/ S' R4 P  K/ r/ g$ [        {$ G7 F3 W+ T+ V3 r
                whe_ch=0;2 N$ V- H+ b$ ~. M% d8 j2 O
                CodeB_current=CodeB;
: h4 K' J- B! w* z                IO_Init();$ V, \: N$ [) x  Y, R
                EXTI_CR1=0x08;
9 D" Q3 U; M4 }! m* r7 F5 K        }5 n7 ]' v. A: G, X+ y6 |$ h7 f
        if((CodeB_last==1)&&(CodeB_current==0))
' v$ I& E( O. c( j' W        {. j5 K* a: ~9 B3 w, @7 T. U8 z6 I1 ^- f
                ADJ++;
; Y* K/ @) i# a1 }1 P  b                UART1_SendChar(ADJ);
( R9 x& l+ f3 K8 T. y" A# Q! F        }
4 a# x  B# W; [1 K# ^        if((CodeB_last==0)&&(CodeB_current==1))
# Y7 `) J  C7 R1 O! f$ R        {4 c5 p( B" @0 X% w
                ADJ--;
% O, a% b4 _" {4 w" O. A                UART1_SendChar(ADJ);2 F0 p' S& K/ R1 C# [2 U( }4 P
        }
) r6 \" B. f2 g9 X        _asm("rim");
) D, G: r% I, N) L) }# t, `        return;! |% r& R: ]; D, C& j
}
* \( f- e) A$ e8 Z- F% r7 [1 i
0 \6 i3 N# N6 G4 z! X! S- B6 k( G* J0 G; }  n, [
赞 收藏 2 评论9 发布时间:2015-11-7 23:07

举报

9个回答
disheng4688 回答时间:2015-11-8 09:29:10
学习                  
ughbss 回答时间:2015-11-8 11:50:19
使用一个D触发器可以直接输出正反转
k_xg1919 回答时间:2015-11-8 12:26:09
学习                  
埃斯提爱慕 回答时间:2015-11-8 17:37:36
提示: 作者被禁止或删除 内容自动屏蔽
32F 回答时间:2015-12-1 16:04:24
) T6 V# u7 W7 f
/ k! W" @4 S' ?5 w# Q( R
好文章,值得学习
32F 回答时间:2015-12-7 13:18:46

7 Z3 g6 [2 P0 I& W8 a这个赞一下,很有用
wdshuang09 回答时间:2016-10-9 21:27:20
路过,学习了   
robter 回答时间:2018-2-12 22:30:52
这个很好,最近也在搞旋转编码器,借鉴了
adsl989 回答时间:2018-7-20 12:07:50
借鉴了

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版