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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
欧姆龙编码器(型号E6B2-CWZ3E)接的msp430f149的IO  P2.5引脚利用中断测速度
, K. C9 T$ A; M2 Z脚本如下:请教各位大神,中断应该如何修改,最终打印结果如下:
& \2 D6 e; \1 Z) n7 o& J; n9 Z  b  G0 w; k
#include "config.h"% t% m# G" Q' x& Z
2 q9 F9 p& A1 J$ u& Z( a6 F
#define   keyin (P1IN & 0x0f)3 u1 [# W1 K# ]
#define   Num_of_Results   32( }& s: d* L* _. J
#define   cir_radius       300 f+ ^, V" L$ e. \* F, G
#define uchar unsigned char . u+ G  Y+ L* }3 l9 m  r
#define tiMER_CNT_NUM   50
3 j/ G7 S7 W! q#define SPEED_CNT_NUM    200; }7 v0 t( A  u8 C- x2 }, U3 \) w
#define SPEED_IN    P2IN
9 \% c8 b% C5 V; C; ^' o#define SPEED_IO    BIT5+ w3 S. T' {) w# u
#define SPEED_DIR   P2DIR5 K4 ~6 @( J: t8 s% P+ k5 F
#define SPEED_OUT   P2OUT/ a5 Z0 ^7 N% y& Y0 S8 @, a
uint16_t results[Num_of_Results];    //保存ADC转换结果的数组; z( I8 }1 n# q9 w7 O
uint32_t average;
: `8 v0 [9 c& I9 @( R* [! buint8_t tcnt = 0;     //ADC计数
; j) b% C( k+ ?& R9 juint8_t tcnt_ta=0;    //TimerA计数' H0 ?  c: |5 R; l0 ?+ K8 f
uint32_t circle_speed=0;  //后轮转速
) }( {' y, a9 Y; Y3 X! xuint16_t angle;' V/ W6 q6 c4 B& u
uint16_t start,end,T,sum;  Q7 b. s& F* Z; g. K$ {4 j: ?
uint8_t oveRFlow;
5 k9 D6 M0 I: y+ Ouint8_t ta_cnt=0;         //脉冲计数: u, W0 I' q8 l9 n
uint32_t temp_cnt=0;    //临时计数8 ^' b' ^4 y6 _, @# z. s* m
uint32_t down_temp_cnt=0;    //低电平计数
* j$ ~8 j3 A8 {uint32_t up_temp_cnt=0;      //高电平计数1 L: O) ^+ q; d
uint8_t down_cnt_flag =1;
8 p. J4 O* S* @& o: q, Z. Z' e# K- e, ~* c0 M& H' e2 N# c$ X5 j9 i" _

# S3 k' P+ ?. D5 `) e. b! d
1 z5 Z# k, r8 M* X8 a  {/ @3 y. L4 i' [6 K# j! A! h
void PutStr(uchar *str);
3 @( q6 {  _' z4 H' Q( Uvoid PutChar(uchar txdata);) n4 i$ X* O, |1 Q) X. b3 {
void printf( uint8_t *Data,...);* p0 J2 ?, F- y7 p
int fputc(int ch,FILE *f);
. q5 }' ]5 A( V, z7 |/ evoid InitUART(void);0 ^: Q+ K4 ]- [$ U4 ]3 Z
void delay2s(void);- x: [) W6 A( }$ V2 g3 P) K, T# k8 |
char *itoa(int value, char *string, int radix);
1 a* k5 p# S# `# p7 M' [void delay(void);
; K4 j( u6 a: f' {# m& qvoid clock_Init();
1 e; d- P3 S9 W! ]5 J: Vvoid TimerA_Init();
! P' x; z+ V4 ]% c" E9 C) {% M' f
% T. s0 r8 o$ l! y& P3 K3 k, T+ ~- n* h
void TimerA_Init(){
3 `/ D( U& T$ J" T; V+ n3 L8 B. _- ]% V( O3 u8 d. \
        % o5 A/ t7 }7 V" n
        //TACTL = TASSEL0+TACLR; //SMCLK, 计数器清除7 k: g# c: @! Z5 I- ]0 p1 Q1 v
        CCTL0 = CCIE;
$ j9 q0 K2 I+ `        CCR0= TIMER_CNT_NUM*1000;                 //配置定时值5 K/ F+ g6 k, ^: B
        TACTL = TASSEL_2 + MC_1; 7 q1 c! j" g. N2 T' B( H8 S
}) ^6 J0 q- i6 N* M6 c3 o; @& @
- o2 E1 I( I; V" m5 T: _
void Clock_Init()
+ q$ I/ `. Z" {{
% ]+ W. V6 J9 ^- D  K9 b+ {        uint8_t i;
3 i. ^$ @/ B5 ^5 g3 ^" I% f        BCSCTL1&=~XT2OFF; //打开XT2振荡器
5 h' a4 I- C/ r5 P8 }) M        BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
1 W+ F) O7 h) q        do{
  s3 i4 t: ]! ]( C+ y  L                IFG1&=~OFIFG; //清楚振荡器错误标志
9 i) {+ G- c4 g* Y- O* L                for(i=0;i<100;i++)" x" E3 n# }) R' K& H) ~- ?
                _NOP();1 v  m7 h+ M$ s0 N1 c& i" T/ y
        }
9 Y# R% D$ y9 n/ c! V        while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待
+ t( `) Z. o7 [        IFG1&=~OFIFG; 0 b' V' g; \6 {: z7 z0 s( x" _
}
0 F+ n, ?8 a# l0 n9 A
# ]* p; D/ p2 i" J( r, v* ^
) T+ \0 }9 c# V3 F( z+ M" u8 j) Y
( _" T+ S, i. D- g# z
9 y0 z  B+ S( z  V4 |2 ?! q5 S5 x) d; g! U' G
; q9 x; E& F  i; |* l

/ x& G1 @3 z8 P) b8 I2 ^#pragma vector=TIMERA0_VECTOR- k$ v- G+ r# o
__interrupt void timer_a0()
$ B2 q$ B  b, K( c. {  n{9 z7 T7 R9 Q+ p
        CCR0 += TIMER_CNT_NUM*1000;9 N2 e0 D1 M- h) ]$ s, R$ [
        temp_cnt++;
6 |, E' o' u& {1 v4 {: x7 D3 U2 r        if(temp_cnt>SPEED_CNT_NUM){
# }" W8 {. J+ |" K5 \" l          temp_cnt=0;/ y% W+ [, \* E+ A8 q, @! p
          down_temp_cnt=0;
* H# a7 m' i' o+ k        }% ]; v, y, n9 {; V4 P
        if(!(SPEED_IN & SPEED_IO)){
- W  Q* F8 e* S, h; g6 x4 a! r2 I/ ?            down_temp_cnt++;% I+ C' h" o# ?: J& W+ U0 u9 g
. Q) f. \) F3 c. ?
        }else if(SPEED_IN & SPEED_IO){
7 p7 x, g) E8 p* @. D
, F' e: o0 e! g' \5 {        }6 X! \+ X; Q% k  t" w. A! T

8 i$ a) g9 y8 r}5 D2 P# D3 Z* ]

0 ]$ a# w6 c5 H. j3 s/*  N, S  |: L% F7 t9 L9 {. P
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
  T% ~! I0 Y. e% c__interrupt void timer_a(void)
, ?) C7 X5 |- V' Y- ~9 X- {; k{
( |, J, M' j. c5 M0 C4 y8 j2 d, o# q7 K* _' O' D
        
; p3 {4 F( G7 D$ h8 W* H1 m( V- \; b  p/ G
        switch(TAIV) //向量查询
# \7 O1 O& {1 r3 v/ o5 ~  j        { case 2: //捕获中断! v4 E/ U% G1 @$ D
                if(CCTL1&CM0) //上升沿  H3 {6 j8 v( l8 x. g1 \5 }1 Y
                {7 b0 m% d; Y; M" j) c
                        ta_cnt++;
# q$ J! ~0 W. {0 K7 }% u                        P2OUT ^= BIT1;
/ T9 I+ ~% u8 X5 z                        Printf("%dtcnt\r\n",tcnt);+ c* \( m$ o- y* f7 I' k  [
                }* T- ^8 B2 U8 E2 b2 I3 Y9 B. g
                else if (CCTL1&CM1) //下降沿* L( z4 }; y4 }* x5 ~( B. s
                { . g  w- x" D4 R$ t+ _2 ?) [/ l# z
# N5 H/ B9 A& N! d% N' Y% w
                }
$ g- d. V3 c2 _9 Q0 L                break;% \+ ?$ x) @) p7 M
        case 10: //定时器溢出中断
+ X, }" }, _# M3 ^                P2OUT ^= BIT1;
; i' k3 \* l1 }6 {                break; //溢出计数加1
) \, ^) M- P: V! Q& p# @        default:break;& L( j0 `/ C5 k: |* S5 }) ^& A) C3 L
        }/ X2 \" \* R8 _$ u# U
        tcnt_ta++;
6 F- `. \: O- [3 I8 ~0 u        if(tcnt_ta==200)4 `, z; A1 y/ F- E+ k
        {
6 Y7 c8 j. ~# G0 O2 ]4 d, n6 r% }' H                tcnt_ta=0;
9 |2 G( q4 O' D3 W; s3 j                circle_speed=(2*314*cir_radius*ta_cnt*36);
; Q2 o" H& S+ |                ta_cnt=0;
; r, Q. F! n4 y) j5 c        }# Q! O( w7 o) E! c+ T; v+ _7 X5 m4 z
% w- Q; n4 y, ?# T7 {. p
}
% e1 V& b2 h5 M+ e' @: g" n% I+ X*/
  F! U0 k' I* S" A: T! @+ b& `% `% G7 @1 ^3 @6 G% f7 Y
) m0 C+ X; I3 O5 D! M
/*******************************************
) o4 p& U) X6 D# p# Y! e8 `函数名称:ADC12ISR
& d: T+ c/ B- F4 Y- Z0 N功    能:ADC中断服务函数,在这里用多次平均的
' |( @: T8 p% h: j' D7 e          计算P6.0口的模拟电压数值
  q! f' L+ J1 C0 u/ |7 l5 U" p' O参    数:无       $ t, B- _7 n/ L+ w# ^8 P
返回值  :无
" R8 {* k+ O; r********************************************/
6 n0 p; F- ?& L4 N" M
% ?) ]) W1 `* e6 X% s7 J#pragma vector=ADC_VECTOR  p2 \. f! C! K8 R1 r' D
__interrupt void ADC12ISR (void)
+ i; w1 u3 y# m/ c/ k/ p+ [{3 m' \& `' F! x& S
    static uint8_t index = 0;
0 P! G, `9 N+ M5 D- ]3 T; x6 j# v    results[index++] = ADC12MEM0;               // Move results; v4 J2 L1 f( |4 i7 P7 ]
    if(index == Num_of_Results)
$ M1 j* o* C5 V; u$ N; n    {
0 j2 K. l+ I) f# _) g7 |+ [; p; a# O      /*
6 L, E9 A! T8 `$ \      if(keyin != 0x0f)7 H( M# `; h& W# Q" m" V; k
        {8 u# v8 V9 e# J  C  T$ W
          delay();% m) ?1 C5 v5 a2 H  U4 S1 O
          if(keyin != 0x0f)! V+ u4 x# w; W
          {+ v( {, C! t$ s% c3 y# A8 E% D% M7 N
              while(keyin != 0x0f);
+ p1 \% }2 H- ^' x% v              P2OUT ^= BIT0;
6 c1 q$ R' y/ @0 J+ e                                  //uart0发送ON( u% V. k  @4 t0 _- O
              sendString("ON");6 j. p! G6 _2 ]: J& }
          }               
) G# _) E' i, q% s+ @9 f        }- v. @9 }. ?% Y1 P, r
        */
2 U% ?7 ^+ X0 M# Q: J      delay();. n# B, E3 a, i: R: U% J: T
        uint8_t i;
, M8 S2 f7 i! [1 C3 T0 v        average = 0;
+ ~) a( _* t( z4 \1 w        for(i = 0; i < Num_of_Results; i++)+ G) ~; \. E3 j* W% `
        {* D& s# L8 y( z4 i. H7 z
            average += results;
2 Z: y0 P5 d0 u8 L( G5 S        }2 ~3 h$ |% r- z* T5 X8 r+ d
        average >>= 5;                            //除以32
/ c( [5 G+ ]2 K        index = 0;/ b- `! i, f, M. y! O, N2 \" N
                tcnt++;
: Z# d3 Z4 P% t  M9 u0 c        if(tcnt == 200)      //主要是控制串口发送速度2 g; S5 a. P) t5 K* n% v4 e! F. z2 K
        {% z$ i' `) D4 W# `* F: u5 g' Z8 v
            LPM1_EXIT;
- I& r4 l4 S& m2 K0 m% q4 S* `3 x            tcnt = 0;
  p  }. [& ^# }# K( q/ d2 W' h        }; m1 g1 b8 u: F7 T. T, S( K
    }* `+ U7 H( B6 H; r5 ]7 I3 ~$ P
}
5 D, N9 M+ p- c- \/ K: a+ l8 C8 e( O: C; }  p+ P: J
void main()6 J; i1 P- n, ^& `, C  b& P
{
1 m9 l  a) n! ?$ h' |$ L' Q2 A  WDTCTL = WDTPW + WDTHOLD;
+ T6 s( p" R3 P  j- {9 L% L  P2DIR |= BIT0;
0 ?. `$ _0 P& q  P2OUT |= BIT0;   //L8输出,熄灭   为1熄灭,为0点亮8 B3 J, ]: K& g& k" U0 b/ U
  P2DIR |= BIT1;. U- e, C: `" q. K
  P2OUT |= BIT1;
; V1 ~  |5 _* l; q; z1 ~: O  Clock_Init();0 @+ y7 c) _" @3 P7 ]* c
  TimerA_Init();
: a/ q* E' s" ~  InitUART(); //调用初始化函数% z$ Q, b! @: c
  Init_ADC();( E+ \- C. A* m* m* j6 e
  _EINT();
6 a/ d) V4 q5 O4 I! }8 a5 F  while(1)
) d0 `) e% T$ p% X$ F; ~8 f  {
' Z: b5 S) G6 d/ H. N/ x        LPM1;$ n, C$ h3 n4 R: n$ D
        circle_speed=2*3.14*3.6*cir_radius*down_temp_cnt;$ b3 t3 O* e6 C4 a/ a+ D5 \, ^
        angle=(360*average)/3300;  ~7 e: v# [1 G
        Printf("%dkm/h",circle_speed);0 S4 Z2 Q5 S2 E9 N) g, B+ Q
        delay();/ g7 O$ {& z- V, {) c1 c' b. B
        Printf("|%d\r\n",angle);        
8 h. f8 f; ]& o  }
/ `& H9 g9 `: z* k! d: L}
) j9 g/ e) E% X

该用户从未签到

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

该用户从未签到

3#
发表于 2022-7-7 16:35 | 只看该作者
太能折腾了,好好用鼠标,不行吗?
$ X  N8 u1 @/ I" ~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-16 20:03 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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