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

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

[复制链接]
perpetuiy 发布时间:2015-11-7 23:07
本帖最后由 perpetuiy 于 2015-11-7 23:08 编辑
+ `, y+ ^9 Y+ z8 ~$ }
. o. j2 B! X* }' x1 N最近在项目上,用到鼠标上用的编码器,按照厂家给的编程方法,发现容易产生误判,故而自己用外部中断的方式来做,发现这样误判的情况会得到很大的改善,现发上来与大家分享。
6 ^+ b+ d; a0 @#include "stm8s103f3p.h"
2 ?0 S7 ]: S( N; S& s" L#include "stm8s_bitsdefine.h"5 m+ H0 b+ \* o8 N; `( T; F. C
#include "typedef.h"
$ r  {) _; N6 c- v" P#define  CodeA PB_IDR_0
3 J$ i7 o" ?2 a  ~/ @. f0 Z#define  CodeB PB_IDR_1
& g0 U9 k& ^9 c( \9 yuint8_t CodeB_last,CodeB_current,whe_ch,ADJ;
$ o- x+ V/ f+ M, m) `void UART1_Init(void)
7 d! B  v" ?# ]* V5 H" K{     w7 X& X& S' H) |) g8 ?, h
        UART1_CR2=0x00;        9 F2 M0 M- f5 Z# G$ Y% l
        UART1_CR1=0x00;             F/ Z$ f& {# T4 |; o1 ~
        UART1_CR3=0x00;           
# x0 v0 i( [0 j* D        UART1_BRR2=0x00;% S' q" F7 }3 M% q+ l. v. k* o0 _
        UART1_BRR1=0x0d;         
, a3 A  t7 K0 e9 j* T        UART1_CR2=0x2C;              & V, u- N  R. W- s
}
' R* `. {# H9 i( i$ }( jvoid UART1_SendChar(uint8_t  ch)
0 q1 N# o4 o# I! Z{
2 j7 w0 P. o9 d3 H, y4 |8 G        while((UART1_SR & 0x80) == 0x00);
$ h' b  P! o. T/ Q0 X9 L        UART1_DR = ch;  ( p6 c$ w( d1 [# l2 @6 M' Z
        + b1 u+ w5 Y& t6 }( b) n! ~# _
}
: n  d( \5 b* Mvoid IO_Init(void)" X( r- u; R) u& m5 [7 z- |, J
{5 i$ p/ x" T. ?4 X# N1 S: b  [
        PB_DDR=0x04;
; _1 A4 ^2 f  d! l) b; y! _        PB_CR1=0x07;& O! V- R) E7 m- A' U
        PB_CR2=0x01;$ W( V( P; {& X( t
}
+ \! b3 s- Q- E. vvoid EXTI1_INIT(void)
( [# `- y! D/ a# ]5 p# b{
( s! a3 i. a8 o/ m        EXTI_CR1=0x08;+ |! a, Q; r5 R+ y# l
}) J6 D6 ~0 c' q2 C, W' e, j
main()
2 y% j7 E- L/ u$ I: i  v{
& B8 v4 Z7 V% m0 }6 _9 m  D) l5 S        IO_Init();/ ~: {' l0 h8 u2 t2 Z1 k/ y
        EXTI1_INIT();' Y3 l2 }$ n2 \& e% H! X
        UART1_Init();8 U8 B. M* `8 L; h
        _asm("rim");
2 B# W% R5 R5 V8 K0 N7 c# M$ {+ D        while(1) ;
6 |" x  N$ v) v}; {/ ]' {( m7 H9 P0 W
@far @interrupt void EXTI1_IRQHandler(void)
7 H( Y( s( t9 W$ N4 D{
+ x7 f7 o. n0 L6 l/ c, m- x( r        _asm("sim");
  |7 \6 U% H1 M- B3 Y% _        whe_ch++;5 `, p) w; u" A' {& P
        if(whe_ch==1)% ]  Y3 \9 O( b* u; _/ I
        {% }9 _( }# u5 {" Z1 P, a! g
                CodeB_last=CodeB;3 j- `: }( A+ b2 n! \: F: S
                IO_Init();
( P) {9 A% `9 j- Z                EXTI_CR1=0x04;
- e* p4 _7 G2 Z        }9 w& L6 }, k: K" H
        if(whe_ch==2)' n! M- s4 m  U5 _' A# L/ K
        {$ C3 X, @* k9 ~. J, i- |
                whe_ch=0;# c2 L2 \- x+ w
                CodeB_current=CodeB;, v. g4 \, y5 Z5 p$ A
                IO_Init();
& {. I/ A' ^% o% j                EXTI_CR1=0x08;
. h4 [0 N# }0 s- A, n4 ?( x, j        }
1 ~3 C' m' t* e" o. V8 w5 \  j- s        if((CodeB_last==1)&&(CodeB_current==0))& s. I' [" C3 E; C( {
        {; H8 _8 b( n8 a: H" n% F
                ADJ++;
9 ?- w& e7 o1 n; @8 R3 L3 S7 S                UART1_SendChar(ADJ);+ ^# K# j1 ^- ]" ~) W2 {. i
        }7 f- {- g: K" Y3 p6 E
        if((CodeB_last==0)&&(CodeB_current==1))" {& A9 B. P( ]" N( q) B
        {
  F7 p. q7 O  P$ z" W  u, M                ADJ--;; T- w7 e7 f2 j
                UART1_SendChar(ADJ);
9 f; M. m9 S( y' o" Q7 c1 s        }9 s  y# {. [/ `2 I
        _asm("rim");4 w8 h# M' \) n4 N' k9 A! m
        return;
8 f/ l. o. p& [$ G" s! C  X}, ]2 [, e3 X2 ^3 y3 C) W! Z
' k8 [* A. G6 [  d7 z" V1 Y$ A* G
- ~8 e! X! n" `8 b
收藏 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
& t0 R* @$ G. M) a7 C' R# _3 k
! H% d: i' s% v4 o* N7 E7 ?1 Z
好文章,值得学习
32F 回答时间:2015-12-7 13:18:46
! g8 m! n/ |, H$ ]
这个赞一下,很有用
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 手机版