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

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

[复制链接]
perpetuiy 发布时间:2015-11-7 23:07
本帖最后由 perpetuiy 于 2015-11-7 23:08 编辑 0 u& {; M- f$ {6 L1 b- B

9 }1 h5 n2 I- Y$ \最近在项目上,用到鼠标上用的编码器,按照厂家给的编程方法,发现容易产生误判,故而自己用外部中断的方式来做,发现这样误判的情况会得到很大的改善,现发上来与大家分享。
* C1 g  C3 g' z& o/ p! F3 ~#include "stm8s103f3p.h"3 T9 d$ R1 k1 N
#include "stm8s_bitsdefine.h"
  A1 |5 h0 S5 d4 H/ O' n#include "typedef.h"
& E0 J5 |/ w9 p#define  CodeA PB_IDR_00 t. H  w; ^' q: t, {
#define  CodeB PB_IDR_1% p: s: B' k8 c! H1 z
uint8_t CodeB_last,CodeB_current,whe_ch,ADJ;8 H% f& u: ^) k4 ?* C
void UART1_Init(void)+ r/ J. t, G/ r# o
{   
+ Y/ L  }5 x" }& g        UART1_CR2=0x00;        
7 y# i3 q7 S8 J4 Q( J        UART1_CR1=0x00;           
* s: s% I6 J* A* ^# O7 v- \        UART1_CR3=0x00;           7 y$ U4 o! Z* G- Q5 _. Z/ u
        UART1_BRR2=0x00;
% O; `) D8 H- M7 Y        UART1_BRR1=0x0d;         * ^1 B9 V, h. }- r" r5 @1 _
        UART1_CR2=0x2C;              
, _- e- e* B; S}/ V, Y& E8 i4 R; I4 n
void UART1_SendChar(uint8_t  ch)3 I' a  D. _8 B2 P
{. D% @# L9 Z. c* }$ X% U) U
        while((UART1_SR & 0x80) == 0x00); / e$ z5 j& K& V. k8 i% E) k
        UART1_DR = ch;  
) _7 ]) l+ h5 F) l        
# P; F5 T2 M; {3 C  b/ }2 m9 ?' u3 F}
7 c' I5 S  O/ C9 ?6 Xvoid IO_Init(void)- \6 t, g5 P) k. [4 s
{
4 S9 T* w! u6 Z  a" O- p        PB_DDR=0x04;1 s0 D$ Z6 D: P& x* a
        PB_CR1=0x07;. Y* }; ~+ q$ e
        PB_CR2=0x01;8 s% v( r' Z4 P$ W, n- c
}
& K, |, `/ c* K$ Q) Kvoid EXTI1_INIT(void)7 r( n  F, F" A( W
{
# Z/ ~  z% H8 m        EXTI_CR1=0x08;
- y! z# a% B2 L& D1 [}
# j8 F. F; [# B/ n+ n1 _' u7 `main()
4 h# g+ v& k3 Z4 v2 T( I* @9 [1 J{
7 X8 w6 t' S! G9 Y        IO_Init();
: z+ b% t# b$ |' u2 [2 c2 f        EXTI1_INIT();3 \, r7 O% p$ _/ D: [
        UART1_Init();% f: ]6 ^, h5 X1 L5 \: l
        _asm("rim");
! B; Y/ L5 o9 X9 N0 s/ r        while(1) ;
  X  N5 d  q; P( b# P}* p2 M* H$ |, B5 A: a7 ?( f; e
@far @interrupt void EXTI1_IRQHandler(void)
8 g2 j2 k9 o' T" V: ^/ B2 v% D{
& o: u! A; S5 {+ {        _asm("sim");
# s" k3 @% r* k+ B! S, q  k        whe_ch++;
( _& t, s; M. b        if(whe_ch==1)8 [% T. c$ m9 `0 a7 U
        {
% W5 d) H$ I; r- j+ W                CodeB_last=CodeB;
0 Z, f, G6 T5 P! i% M& \( B* @5 y                IO_Init();
) E3 w1 Y3 o0 {) @) F1 ~0 o  D: ^' Q. r                EXTI_CR1=0x04;' J7 ^( {1 J4 R: {
        }
/ Y  o7 D6 f! W) S. l        if(whe_ch==2)
8 n/ e! Q) l* w& C. z1 a        {
( [4 k( ~8 ^0 ^- e  {' m                whe_ch=0;
, K. K, r; U" P1 L  p                CodeB_current=CodeB;0 \( f( G- Y, v: J, Z
                IO_Init();
' X, P' u# f  ~. Y1 `7 g" r" l* R( `! I                EXTI_CR1=0x08;
2 r# A: H8 a2 d3 a# @        }* m' u0 w8 Y8 g# o5 o
        if((CodeB_last==1)&&(CodeB_current==0))
: g2 {5 C) j: c6 R) n4 n        {
% v! B1 V3 t! Z2 Z4 S* P; a5 ]                ADJ++;
; |6 }2 m0 V2 E( _% W  V1 S  z                UART1_SendChar(ADJ);1 `2 Y+ a: c3 H6 z- X4 P
        }& y8 Y, y) B0 z; H4 H/ ^
        if((CodeB_last==0)&&(CodeB_current==1))
: s( ]- Q8 X5 B- W- F3 a        {) Z* b' [# C9 ?. m
                ADJ--;" x+ j1 O' Z2 }) W) J
                UART1_SendChar(ADJ);
4 W0 U* C# D! B6 I0 w        }1 {: G5 j2 X, H9 l2 H
        _asm("rim");# |4 o  v/ c$ f, X
        return;( m+ O. [4 m; H* |4 o; K" [
}) |$ s% }4 ]7 b6 T7 i

) t/ ^% T0 _# {+ ?0 [, r) M0 z4 K
. Q* U7 w" T+ X# f! 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
! ^$ Z3 K6 r6 p2 J1 F9 ~  |" M) Y0 ~
3 Q% D4 A2 R  G% }, X
好文章,值得学习
32F 回答时间:2015-12-7 13:18:46
8 H8 M4 j! _- t" {
这个赞一下,很有用
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 手机版