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

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

[复制链接]
perpetuiy 发布时间:2015-11-7 23:07
本帖最后由 perpetuiy 于 2015-11-7 23:08 编辑
  Q* j( |; O( k) r% |/ x- F
3 T% v; i# I+ z7 t* w最近在项目上,用到鼠标上用的编码器,按照厂家给的编程方法,发现容易产生误判,故而自己用外部中断的方式来做,发现这样误判的情况会得到很大的改善,现发上来与大家分享。4 `2 ~4 J7 l% S; z* q1 ~+ A8 \
#include "stm8s103f3p.h"
! z! m" J/ u1 ?#include "stm8s_bitsdefine.h"0 i4 R& X& O, y0 k2 @- [- `
#include "typedef.h"/ A# S3 {8 ]) r( @/ l
#define  CodeA PB_IDR_0
  P3 W) f+ [- ?7 t' d. h#define  CodeB PB_IDR_1
0 C% U/ U" o5 Zuint8_t CodeB_last,CodeB_current,whe_ch,ADJ;7 J) q1 [' |* h' q
void UART1_Init(void)/ D5 b3 y2 m$ Y; ]. f+ p& f, x
{   
8 t' p" y2 Y) {; f        UART1_CR2=0x00;        0 C- |  S7 c( A- @6 P- g
        UART1_CR1=0x00;           
7 C7 f& a8 l+ O. _9 ]1 F        UART1_CR3=0x00;           
- }5 p1 H- L( A) ^9 `" D) s( G: G' d        UART1_BRR2=0x00;) q5 ?6 I, x# y% K. P5 r- @
        UART1_BRR1=0x0d;         
% I" G+ q: m. h& _3 g8 i& ?  ~        UART1_CR2=0x2C;              : q% S3 Z) k* m: c- P! d! d
}( i/ V, q# l4 @) w( }
void UART1_SendChar(uint8_t  ch), X6 ~8 l) M8 U
{2 y' a0 q% d% S: J, l- `( a
        while((UART1_SR & 0x80) == 0x00);
& M; U9 b! n1 @+ R8 j        UART1_DR = ch;  6 b+ e/ w/ d5 ]3 e& F
        
( e2 Y6 S' U% ]# n. K3 P$ d* B}9 ?6 i. w1 A8 @+ z, P
void IO_Init(void)7 n; y! C) M$ ~1 a
{
) c9 E' X4 ^: J; J. P        PB_DDR=0x04;
6 i- t+ k4 y$ G8 O- I- G        PB_CR1=0x07;" j9 a; \% d, `9 I+ @
        PB_CR2=0x01;8 R, `! i3 \! ~4 E$ t
}5 `) `  [  R+ ?5 Z+ l
void EXTI1_INIT(void), P. @2 r# z% B9 ]$ r2 {' |8 U
{  f" }9 D) B0 T7 K
        EXTI_CR1=0x08;: a# W- ~2 `8 b
}( l4 K  ~6 [3 {4 L* p/ l+ n6 N6 r
main(): _3 q# r0 l' ?* r. P- ^+ ^
{9 e/ r# J. b) h/ e
        IO_Init();
* u# E, M1 p* a* O        EXTI1_INIT();1 U8 p4 q3 }; ^0 W9 v. d! z
        UART1_Init();
" |# J( \: s( [% o        _asm("rim");0 p- z0 q) L- ^
        while(1) ;
! ^2 b$ ~  O, c- U$ Y3 L( A}5 M( ~: y- W" }4 v" b- j+ w9 q6 c2 T
@far @interrupt void EXTI1_IRQHandler(void)
: `# x  j$ M) X+ Z2 `  Y% W{# D7 _, s2 t: v6 J! t
        _asm("sim");
; g$ W0 o, N) A+ z        whe_ch++;
" V1 q, Y* {5 d& ]9 G' I% H# e        if(whe_ch==1)& n4 W9 S% K6 Y/ ], _; L
        {
) Z; a$ c8 R1 h  _) V                CodeB_last=CodeB;# g5 u& i1 t/ R; D( \
                IO_Init();
& z% h/ E4 E& P. c% G2 Y0 ^; {$ v                EXTI_CR1=0x04;6 P3 T( d2 z5 o# d
        }0 Q! U# `/ j& Q; o' e! `8 {8 u! I# Z
        if(whe_ch==2)
1 h; N& o$ i. v1 ]. r; C        {
. F3 R; H' n/ f( d1 [) y" I                whe_ch=0;' E1 [0 B# m2 B8 l& v
                CodeB_current=CodeB;
$ r3 J; |2 N! h; I3 V( O                IO_Init();, |9 s# t' N, }9 J8 f# j" M
                EXTI_CR1=0x08;+ z) z: E" i: I0 J# ~
        }' n, ?4 Y2 p, ]% Y
        if((CodeB_last==1)&&(CodeB_current==0))2 ~- p# A2 j3 e; O6 ?
        {
3 h/ t/ C$ q0 a3 N( d0 n  F                ADJ++;0 C* M7 F1 `  B
                UART1_SendChar(ADJ);
1 e6 N/ [( g# J" P$ V5 H" K* D6 I        }
' s: T2 e' u$ n# O* ^        if((CodeB_last==0)&&(CodeB_current==1))8 K& {, u1 `7 @( @
        {4 ]* F, K  \7 D0 V2 l
                ADJ--;
) }2 y+ R7 e3 [4 h' w$ I% `8 Z                UART1_SendChar(ADJ);% r6 ]: J/ b- o
        }
+ T2 Z+ Y  R4 l. j        _asm("rim");: Q/ A) ^- w# d
        return;1 D7 s. n7 b9 s3 r/ S
}
: I  h+ }7 J& H3 P" ^* g4 v; X, r* {% V1 U% v5 H1 \. c5 S
5 l, j4 D- P, F$ o
收藏 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

6 ?; X8 {7 w, m; r$ [% g) ?# u; U) o0 f' e
好文章,值得学习
32F 回答时间:2015-12-7 13:18:46
4 i  S- [, U/ ^
这个赞一下,很有用
wdshuang09 回答时间:2016-10-9 21:27:20
路过,学习了   
robter 回答时间:2018-2-12 22:30:52
这个很好,最近也在搞旋转编码器,借鉴了
adsl989 回答时间:2018-7-20 12:07:50
借鉴了
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版