找回密码
 注册
关于网站域名变更的通知
查看: 176|回复: 2
打印 上一主题 下一主题

欧姆龙增量编码器Z相测速遇到速度不连续的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-7 10:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
欧姆龙编码器(型号E6B2-CWZ3E)接的msp430f149的IO  P2.5引脚利用中断测速度
+ n& O& X0 b  s4 y7 A脚本如下:请教各位大神,中断应该如何修改,最终打印结果如下:
: f; Z, F  t" e6 V& u
  ^' X/ V$ g' t% f. a) D* P#include "config.h"8 r1 t8 V3 X; |
, c: U  _# ]: g; T; @9 x7 @
#define   keyin (P1IN & 0x0f)
3 T$ A0 A: G! E2 e, C$ o, U#define   Num_of_Results   32  Q' S) C$ G: G1 w/ K6 r- R( i% `
#define   cir_radius       30: x, Q. `, W& U( G
#define uchar unsigned char
4 f- N- e/ h4 m/ @4 \#define tiMER_CNT_NUM   509 `! E9 {1 ^  o0 _! {
#define SPEED_CNT_NUM    200, y  ]$ F+ ]+ k# X! R1 Y. S0 t
#define SPEED_IN    P2IN4 k7 a" Q2 P2 G  Z: q
#define SPEED_IO    BIT5
2 |- L9 H& T$ @' J( s#define SPEED_DIR   P2DIR& i" T0 d, D4 D( H- j; r4 @9 _1 O" A
#define SPEED_OUT   P2OUT
5 `7 o' @7 u# e+ A! \uint16_t results[Num_of_Results];    //保存ADC转换结果的数组
9 ?. l: V8 L% E4 C1 i& C( b% f$ n1 ouint32_t average;! {" C& v# M) I
uint8_t tcnt = 0;     //ADC计数
5 T5 [! q, y; X0 T! }: }uint8_t tcnt_ta=0;    //TimerA计数( k  z1 U" k. K# U* K- `' S! p
uint32_t circle_speed=0;  //后轮转速
, k: u+ |/ B! `9 [4 Z5 _uint16_t angle;
) W. q8 T0 K7 q: o7 R4 y+ ouint16_t start,end,T,sum;
" k& E, y) I0 v( t: Q5 [8 |uint8_t oveRFlow;
. Z2 ?0 A3 O1 R4 a- k! [uint8_t ta_cnt=0;         //脉冲计数
% I. {/ X# {+ J+ kuint32_t temp_cnt=0;    //临时计数, {  D: d3 _" i4 F
uint32_t down_temp_cnt=0;    //低电平计数
: c. s" M$ H/ r( suint32_t up_temp_cnt=0;      //高电平计数
& m! R# C. H# k8 O/ J5 Ruint8_t down_cnt_flag =1;
& ^+ k% e" n# ~% E" h; L% Q& p4 p/ L5 Y2 Z, V/ o5 e

# F' N1 N1 o; q+ T  ?
# F* x5 K( S  m9 M
# I: ^7 \  U8 J" Fvoid PutStr(uchar *str);5 ~0 m1 Z+ g! Y* L
void PutChar(uchar txdata);
: [) f& n8 p. p: h' fvoid printf( uint8_t *Data,...);
% o& R- e) p+ N6 t: G! }int fputc(int ch,FILE *f);( Y( {- K$ F: A. E/ i' D
void InitUART(void);
  [, w  M) l6 g6 b, ?+ w' }$ J+ Nvoid delay2s(void);
9 K% [, g4 ~& e) `char *itoa(int value, char *string, int radix);) C0 d( E- s6 h
void delay(void);, V% \  W- J2 A
void clock_Init();
$ S1 F6 N+ R8 S/ {% ~- tvoid TimerA_Init();
' M3 R: R$ W8 |) _1 m+ p+ x% ~+ B* I! i- e) g9 X* \9 e) i

' x, U1 A$ G* c7 c# Uvoid TimerA_Init(){
- u6 [8 @+ r3 l; B6 M8 p
4 Z" ?# R: x  i( b4 @! b- b: B        
, J$ g# V- D! R: K        //TACTL = TASSEL0+TACLR; //SMCLK, 计数器清除
# M# k+ D' x' E        CCTL0 = CCIE;$ X* B0 p% p7 Q+ @, d# A$ p% E8 i
        CCR0= TIMER_CNT_NUM*1000;                 //配置定时值
8 @! e' `' k- `        TACTL = TASSEL_2 + MC_1;
/ y) t# C0 n/ B( j/ \! ^! ]7 ?+ q}
  \" Y0 w# u- G1 u. m/ g& }% {4 m" e' U
void Clock_Init()
4 n# U& J! b4 z3 J/ F  j: s8 |{
) k% z+ C% q. E# W' R2 K$ C  {        uint8_t i;
% e3 k$ {# O. G* X# s        BCSCTL1&=~XT2OFF; //打开XT2振荡器) c7 ]  u% Q& o' B
        BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
  y  C( t6 U8 o: I9 J, F        do{
4 _: @; t8 r  q2 T: }+ C& V                IFG1&=~OFIFG; //清楚振荡器错误标志: l" j! m5 t& ?! Y
                for(i=0;i<100;i++)
3 m) h# p( f+ @3 u+ {) X                _NOP();. Q$ o: _4 I# j0 x3 O$ ~
        }
5 i- l8 B7 g  ?, Q, l+ r3 N- }        while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待, w* a6 F2 F0 }' }
        IFG1&=~OFIFG; 4 L, P/ s2 @1 L5 C& T# H
}1 @1 E, Q6 ^9 j0 n. g
5 m9 G/ o% c: r& ~3 v# V8 D

, l; \0 e( a8 M% g+ C  y. ^. |# X% ~8 C

! j8 t( ~; W9 K9 h5 }: d% w, k" `. e' P$ v0 P0 S( p
. ?) n# }  A  N9 ~+ X) D  X
# U  c, u1 m8 G+ z* h4 \$ L0 e# O
#pragma vector=TIMERA0_VECTOR* B4 E1 g8 S! a' }
__interrupt void timer_a0()
7 R0 p3 `& z: s9 g% y* i, ?' Q{
6 U+ m3 q. V2 ]6 |4 N0 c" B        CCR0 += TIMER_CNT_NUM*1000;
8 F! X& C2 w: ~& E3 w! Q( S' r+ v0 }        temp_cnt++;! u4 a3 {! P* [" e2 M
        if(temp_cnt>SPEED_CNT_NUM){9 J9 z5 B# j3 q
          temp_cnt=0;
$ y% o- s- N% A( Z8 N6 ~          down_temp_cnt=0;
! T- a+ U/ x/ a        }1 t+ j: d; O: _5 L+ ^( y
        if(!(SPEED_IN & SPEED_IO)){; @# S5 i1 i2 w5 ?
            down_temp_cnt++;8 U9 F3 ?3 k: C8 p5 Z$ y

% e+ B& W' r/ ]9 Y        }else if(SPEED_IN & SPEED_IO){, F! {$ h6 P) o. H' ]
# r5 c# n, Z$ B6 L  Z2 u
        }
2 Q: p! C4 F" d- Q- m" F- D# T; f  q1 L: S0 x' {( o
}6 f( {, e2 Y  w! E/ [

8 J6 L; G- |6 I$ q* K/*. W+ e8 v/ M; S6 s# @$ P" ^
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
, W' n9 s  f2 Z+ L0 _; F# R" f__interrupt void timer_a(void)
2 i6 L& x8 Y6 U{
$ N% Q* S$ {# z0 W  W" @+ L) W/ V- h% O0 {. w( Q5 W+ W; ?
        
8 c" r/ f& H" g; e8 Q( J
1 M1 x& |! B$ I) D- P        switch(TAIV) //向量查询4 _, p# y; u$ n/ @- W1 @) f6 e
        { case 2: //捕获中断
6 n# C2 G& _% m' L/ C                if(CCTL1&CM0) //上升沿
( {0 G$ i8 m" x3 d% ?9 ]3 Z                {
! C9 q9 e. ~& X                        ta_cnt++;. W* l7 u* j& a% `/ M
                        P2OUT ^= BIT1;
& h# h  b1 {3 K0 r; K' R                        Printf("%dtcnt\r\n",tcnt);
) K, {  c; d5 \                }
! D6 _' ^5 u7 Q4 a                else if (CCTL1&CM1) //下降沿, \) @4 U$ D) w8 f
                { 7 B) x8 o7 g: p1 `9 _( L

: k+ e, m. o8 ~! }. U                }
7 c4 o! i; I$ G5 U% p                break;- j- T0 ~8 p; I3 f
        case 10: //定时器溢出中断
% T, J* J6 E! x                P2OUT ^= BIT1;
; F) h; {, ]$ j, Q- @) H                break; //溢出计数加14 `; _+ w1 B  }0 ^6 I, U: ~3 F
        default:break;' b. q( h4 r& ^" P  M" E8 Y" |$ A6 f
        }3 Z0 s( i( `. C/ E# `1 Y2 ^
        tcnt_ta++;- q6 K0 i$ f) F+ F4 z* F2 f: y8 ~
        if(tcnt_ta==200)
+ O3 f) R2 T, l4 ~' w: K        {6 T4 q* ?( |" D* s$ Q2 U& R
                tcnt_ta=0;* Y8 z, |* u' A9 g2 V( X3 Z
                circle_speed=(2*314*cir_radius*ta_cnt*36);$ U, Y- C! U( d! w1 E
                ta_cnt=0;
+ A. M, d3 h$ E; L6 v# ]        }
; V8 m' B$ Y" n' B0 y; @7 K+ A! {  t
}3 p4 O" D, n! L8 D
*/
0 {- Q. T7 A3 Q1 u6 _1 Y) r4 F8 b: A5 Y9 i$ \; a
5 s: k/ v; \" a. E6 B) u0 Q3 |
/*******************************************
: c2 w, h/ o& l1 ~1 e( f& |$ z函数名称:ADC12ISR+ a# X# ]) o' }; A+ }% e8 T2 f7 E
功    能:ADC中断服务函数,在这里用多次平均的* f' o* Z9 r3 Z
          计算P6.0口的模拟电压数值( f6 o% A( Z& {& ~& g' t
参    数:无       , M! _8 ]2 I9 J
返回值  :无7 D/ i' H* w- a! s9 B
********************************************/
6 \0 n- a  _' u7 P3 q% |; b6 h
# {1 y* {- f, e4 X#pragma vector=ADC_VECTOR
8 P& ^; L+ X  Q__interrupt void ADC12ISR (void)+ q) d5 {+ g. X1 d
{
" F: e+ M, T$ a# b2 p# i    static uint8_t index = 0;
& J/ p- ]3 w9 Q    results[index++] = ADC12MEM0;               // Move results9 V$ H# B* t: e4 E
    if(index == Num_of_Results)
3 _0 t8 o7 X2 N    {3 d. @, k8 N3 c9 j
      /*
7 ~0 d$ T" v$ T! w      if(keyin != 0x0f)9 ?& W$ V8 J1 y2 l; w3 o. i/ l
        {
. f9 k  P7 ?. Q# [" r4 ~% a          delay();
6 U0 m' {) B; V# C' R- \( u, G          if(keyin != 0x0f): }- q* J0 N. S+ L; |: z7 _3 E
          {. y6 I4 p6 b: A* w4 |. v4 v
              while(keyin != 0x0f);
) o! m  w0 x* i! u6 b) f# c. H2 P              P2OUT ^= BIT0;% d; V4 H4 T9 s; g5 e" y4 J3 `
                                  //uart0发送ON5 S$ G. m  B; {
              sendString("ON");
& E8 P) |! @; J+ L* E& Y          }                $ \4 J5 }, Z' L. i
        }
/ J3 b+ q! r! p        */$ C0 C2 r. ]6 h+ {, t
      delay();$ ^3 K: h/ Z/ M0 i; p# m
        uint8_t i;
2 W- S$ n& j7 r4 V3 ?        average = 0;5 _4 U+ b+ X$ f4 T4 U1 H: b& w4 e4 m
        for(i = 0; i < Num_of_Results; i++)1 X5 w0 o  Y& |( e/ o
        {
  e% ~7 W. x; t; H& n; c            average += results;
% t" Z6 B3 V( C. O' Z0 F        }
& r! M! f! A  V9 T8 X( X        average >>= 5;                            //除以32
% s, f' w( c+ N' n        index = 0;
/ K6 m/ m. y7 ?# S                tcnt++;$ @: m* c, {& V/ h2 E
        if(tcnt == 200)      //主要是控制串口发送速度
  T5 P& I3 Y8 y; q9 y        {
! E( ]& U" i" t            LPM1_EXIT;; ]2 T; F2 n& ~
            tcnt = 0;
8 J" V8 ?# f3 e$ u        }1 Q/ u6 \! j3 ], r0 U% x) u" |0 n% j
    }
% \, A% h+ n" Y( K}: k/ U3 Y: U  z$ e6 B( R

2 {0 d2 ~* @. Zvoid main()
; t- y! v* L( S/ t/ g! g{
! \2 X1 y" ]1 u% A  o  WDTCTL = WDTPW + WDTHOLD;
, c& S/ Z6 R& n, N* {3 u  P2DIR |= BIT0;/ }: c) e+ O" a& Q! s7 F: a- r: c$ o( B
  P2OUT |= BIT0;   //L8输出,熄灭   为1熄灭,为0点亮
  ]0 t6 b; Y: D6 z  P2DIR |= BIT1;
% ^! @8 I4 k6 {9 v" c2 q  P2OUT |= BIT1;) Q& A0 ?5 M; ?" {
  Clock_Init();7 M: F2 e5 ^' Y8 ?* `0 X
  TimerA_Init();4 m9 N' ?, d, \- Y
  InitUART(); //调用初始化函数: c0 ^2 v& D2 s' I1 D# @
  Init_ADC();
9 d7 M# y9 q) y& {- P) r: T" J  _EINT();1 w% r: p3 g# \, |& S' W1 i
  while(1)
& s% H4 n/ q6 C+ A  {
% U( k% b( j# B* P% F+ ]        LPM1;; m* x0 Z  b, {+ ~  X) K
        circle_speed=2*3.14*3.6*cir_radius*down_temp_cnt;
% @3 l7 T  o% [! n5 S: O) z        angle=(360*average)/3300;
8 l0 z, u( o( E' l4 X        Printf("%dkm/h",circle_speed);
9 z% B& L7 A$ m5 V& y" x" j% C: ^        delay();
! z6 |! H8 p( D6 K) j2 w3 f* ?9 V        Printf("|%d\r\n",angle);        - R1 \0 J. W! r$ s, _& f2 w5 i0 Z9 N6 E
  }
, w( @6 p) ~: B; \5 N- J) l3 B}
$ \9 d+ I7 O7 V* C

该用户从未签到

2#
发表于 2022-7-7 11:21 | 只看该作者
欧姆龙是鼠标里面的东西

该用户从未签到

3#
发表于 2022-7-7 16:35 | 只看该作者
太能折腾了,好好用鼠标,不行吗?) K2 q$ F9 E/ p9 i- ^
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-19 16:56 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表