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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
欧姆龙编码器(型号E6B2-CWZ3E)接的msp430f149的IO  P2.5引脚利用中断测速度
' \. t; p5 |+ h  [  S脚本如下:请教各位大神,中断应该如何修改,最终打印结果如下:
- F+ `* y3 g! Y* J( E+ ~+ C3 C$ o8 G' s2 g; l* n8 U
#include "config.h"
7 Y  @3 y# @  O9 Y4 x
% ^0 J/ V9 {8 U" V#define   keyin (P1IN & 0x0f)
& r$ \/ l$ a# L6 u#define   Num_of_Results   32/ \) F3 ]3 p4 E
#define   cir_radius       30# I+ t( U# ]. X
#define uchar unsigned char
; l  e- z! P5 d, H#define tiMER_CNT_NUM   50' ?" Y  o  l) {4 i" D7 b" s
#define SPEED_CNT_NUM    200
. S) n8 Q6 U3 i#define SPEED_IN    P2IN$ E' w+ g" k  j1 ~9 X
#define SPEED_IO    BIT50 Y- F- A5 O5 H9 _2 s, Y
#define SPEED_DIR   P2DIR1 s+ _9 D" d/ h" s, |
#define SPEED_OUT   P2OUT
" |+ L& ^; D2 `0 c5 y" r* K: Yuint16_t results[Num_of_Results];    //保存ADC转换结果的数组
) b! P+ Y# T& s& E# i6 v) e1 quint32_t average;
9 j8 k% Y% i0 I4 V( {$ [uint8_t tcnt = 0;     //ADC计数
! D- p& X5 Q8 w# Huint8_t tcnt_ta=0;    //TimerA计数
0 U5 y6 N; K+ B$ V% Z3 M- y2 Wuint32_t circle_speed=0;  //后轮转速
& P3 k9 [; B% g! T: huint16_t angle;
8 q7 y2 I- x0 ~' ]) E+ `uint16_t start,end,T,sum;
- I  T& ^1 c0 v' w* {uint8_t oveRFlow;1 P& ^  L6 v& ^7 @8 h
uint8_t ta_cnt=0;         //脉冲计数+ c# ^+ ~8 v' Z* h0 g8 v, e# B0 ?
uint32_t temp_cnt=0;    //临时计数
4 \, ]" n& [' Y5 y- Y. `uint32_t down_temp_cnt=0;    //低电平计数4 g1 }$ B+ {+ x1 ]" K+ n( U
uint32_t up_temp_cnt=0;      //高电平计数
0 ?( ^8 l! O2 x7 @, v, euint8_t down_cnt_flag =1;. Q* ^* `7 b' n( |9 W) \$ l
3 C$ o5 k  w2 p4 ~) ?" Q# H

" [, \0 s  l/ c1 ~1 u  C( t# ?& ?1 K3 |4 T9 E# s0 G5 l$ j6 L
- k, H! x2 w5 x: t# @: ^9 \
void PutStr(uchar *str);% n% Q/ T2 M" g+ o
void PutChar(uchar txdata);  y3 [; b! i* B/ ]& S8 h
void printf( uint8_t *Data,...);. D5 }4 _3 M( D* Z  M5 y- J
int fputc(int ch,FILE *f);
1 Y" W5 a& X% Q" H% t- Ovoid InitUART(void);2 Q1 b2 b6 R/ |9 C$ x/ `6 Q) E- K
void delay2s(void);
, O/ W/ i. G. t; C8 qchar *itoa(int value, char *string, int radix);; {% V: Y# D2 L! H: o9 {  ]6 B
void delay(void);
* w' w, n8 R* B) [" zvoid clock_Init();$ y0 e7 I& j4 D
void TimerA_Init();4 |* q) K0 X( o6 u8 m* e* i

* `- V. q& F$ g7 J* J1 Z, s
, b& [- y1 h! v# l  N& `void TimerA_Init(){; W' U7 @! y# d3 l7 K& D
/ S1 Y% y9 Z4 u2 j1 Y
        
' {- K5 r! S4 }  g        //TACTL = TASSEL0+TACLR; //SMCLK, 计数器清除
8 i! P# Z7 p8 p$ O' O7 u; Z        CCTL0 = CCIE;
' F. z; q+ K' _8 q7 s! ~2 |        CCR0= TIMER_CNT_NUM*1000;                 //配置定时值* |7 ]. @& X8 z( ?$ d
        TACTL = TASSEL_2 + MC_1; 4 M0 S4 p$ s( x* v7 e
}/ q# y$ N" o& @8 m

( q- `& y. z2 ?: U3 Q$ |/ l: I7 xvoid Clock_Init()6 q  \9 B- G* T+ V+ M5 o
{
$ I/ `4 W$ g* Z7 V5 e        uint8_t i;% u, G  g- u0 ?% t# B- c
        BCSCTL1&=~XT2OFF; //打开XT2振荡器0 r. J% W% l, U0 a7 u" q& J
        BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ. S5 l' P# i  ^' E( ~0 s" Y
        do{
1 U2 l) L: a' i$ s/ d5 b9 h                IFG1&=~OFIFG; //清楚振荡器错误标志
5 h6 u6 g. K0 s  c/ [( f( J                for(i=0;i<100;i++)+ k* m: E$ p4 Q
                _NOP();
: K$ c! ~% T2 A! y) r: C        }
$ ]  ~, f' o3 |        while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待8 T. D) L2 l! l
        IFG1&=~OFIFG;
9 O6 v+ p/ \: ^3 O' ]; }}
6 q5 E/ d- h! ?, A
- J3 k- u3 ~' G3 M' ?, f, ~$ X+ I6 G$ Z4 j, J& F
: H( b& N* \4 y; q3 q' n: l- [

- j; }% o* K) z; q5 n* k, D
5 E& n/ h: _2 E- `* l/ _: E! [+ @' ~+ x! P" J
" M. N1 P! N+ a+ a
#pragma vector=TIMERA0_VECTOR
8 n6 A. e2 m1 Q5 Y+ a8 G8 M__interrupt void timer_a0()
7 ?+ @( H; _2 K6 T, V+ I- L4 Q% o- c6 @{
% ]4 {/ k5 W4 F  }( K5 C        CCR0 += TIMER_CNT_NUM*1000;. {' M9 j$ V8 _8 f  r8 i' s8 a# E# ?
        temp_cnt++;; O/ o1 @( A; b; @  V
        if(temp_cnt>SPEED_CNT_NUM){; a1 v( H* I6 k6 \0 T' e
          temp_cnt=0;
2 |2 r+ `9 N9 o1 E          down_temp_cnt=0;
, D0 h1 t3 z4 r9 i        }
+ M6 w! Y' U+ P' E1 i% g9 W        if(!(SPEED_IN & SPEED_IO)){
2 v. y5 p8 c5 ^            down_temp_cnt++;
8 V4 w( A+ B3 l" O
/ _3 r0 z$ v/ I) y" y        }else if(SPEED_IN & SPEED_IO){' T, B4 U" h3 r$ U0 q
& \. Y/ z( S$ Q7 R( l! K( L
        }
, b, }8 S6 K2 d& x  A  p, ?: O4 l
}7 b. G' e/ P/ I2 s, k" v

# u4 @% p3 |- N# l# K1 z* n/*& ^" ^% s2 ~8 @+ _0 m
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
) T; t4 f7 W9 P& q: R! n: p__interrupt void timer_a(void)
! q; ]/ }# v/ {# ]' {! X{
5 Q& Z8 F4 E1 y' Y; w9 G% G) f! e2 P" H. g% ?/ _5 z/ b* _  x
        6 m! u: R4 ]/ L4 A8 i

8 Y8 P! f% W" s6 J* C( d        switch(TAIV) //向量查询
0 E- }+ z9 q8 n) W1 a        { case 2: //捕获中断
) r1 m; h/ T+ o                if(CCTL1&CM0) //上升沿
  k1 z: ~# G( L3 p$ H4 l8 b9 n                {
8 o7 R0 I$ Y6 @                        ta_cnt++;& m3 b8 K9 w& j% s9 E$ W! o
                        P2OUT ^= BIT1;
) a& e. k3 c6 B; k% W" D" G: }( }                        Printf("%dtcnt\r\n",tcnt);) t5 u9 Z- p. V# u! v
                }
7 R- i; B' f, k! V- \. T6 \2 O+ p/ Y                else if (CCTL1&CM1) //下降沿# d) [1 U0 T# g3 y
                { ; z+ i5 N, X% U, H' ~

  C. o- T- g6 ?4 p' g  D5 t; y                }
' X8 _9 V1 {4 ~, o! \) M) n3 }1 ~                break;6 j' z3 }& E0 t, D$ `/ o) [- @
        case 10: //定时器溢出中断
4 G; g0 T/ T; ?4 p, `( ]9 O# @                P2OUT ^= BIT1;
3 y& D7 a) h; h6 L4 s/ n                break; //溢出计数加1
+ g: Z) n3 u1 d2 c        default:break;
# I! {$ @$ `9 ?( T' ^+ h4 @        }% b- n9 N0 k) c- M
        tcnt_ta++;
; _+ x8 _4 C" V        if(tcnt_ta==200)
* |) b4 V5 v0 j- ?" i        {
: @0 ^# ^, z# h% G5 v* z                tcnt_ta=0;9 Y; }/ [6 j! O
                circle_speed=(2*314*cir_radius*ta_cnt*36);
  Q! S* `# [- b, n8 h                ta_cnt=0;- g1 R6 J' U! E  L
        }
" [. n& Z6 o! v9 Y2 w$ D' ?3 n# K8 [) f" D8 J" R/ i9 I
}4 N( Z, d& Q' X+ B( Q
*/
1 ~; D) f* H+ }, m& i9 @7 G( Y& D/ A8 F$ V' r! n0 M

0 k. q' N4 ^5 q* J: l/*******************************************2 z' d) g; D" M; l+ \
函数名称:ADC12ISR
# C) T7 l: V; Q功    能:ADC中断服务函数,在这里用多次平均的( Z" S6 o! p  P  M8 Q
          计算P6.0口的模拟电压数值% I! q3 a3 q; t1 R7 ^8 B0 p
参    数:无       ; |: j- ]& J$ |5 Q/ v1 q# h& E
返回值  :无2 u1 ^, N4 I/ G: N% f: _/ ?
********************************************/$ k1 u: v9 d. [; P. ?( R2 _* F

5 M6 s: h4 z7 W( c+ j#pragma vector=ADC_VECTOR7 X- B* s; J: Z! u( r& Z, \0 q
__interrupt void ADC12ISR (void)
% X. B, o  _6 Y3 z# \: v{% z* U" E- d+ }" \
    static uint8_t index = 0;
: r* N8 F% x' {6 h* w% g    results[index++] = ADC12MEM0;               // Move results
& t4 R! q( r( G    if(index == Num_of_Results)
3 h' X% S6 C. d9 j. c$ t    {8 a0 t* ^  M# @& H7 g8 j3 c! b
      /*
2 Z5 D) X, Z4 q8 G6 a      if(keyin != 0x0f)
; d' n6 j, P- C. f) }! s        {
; r1 J8 \! w# I( M6 F- ]7 |, r2 @; K& }          delay();8 I; ]& @( r- O; q" v" s4 u
          if(keyin != 0x0f), E' t7 i2 z; F% L2 L/ Z
          {, f8 b8 m+ P9 e# x9 q# _2 U+ |
              while(keyin != 0x0f);
% V, {  X  v5 f0 Q& x  {% q: I              P2OUT ^= BIT0;2 ]- F; m4 l) @0 E# m- H  x, H/ \
                                  //uart0发送ON
' C: I; w( k$ O& B3 L              sendString("ON");. E6 j4 a1 R- L6 l' r; M
          }                " s; ~( Y6 n/ e3 |
        }* s2 N* X1 C& r$ X; r- g) v8 j% h
        */
- `, f; K9 O2 Z& z3 M. V3 J: W      delay();
( s& _% r+ }  _! o: Q9 f        uint8_t i;6 H) N% t0 j" g- R: ?$ A
        average = 0;
' G; O8 u2 S8 G4 F        for(i = 0; i < Num_of_Results; i++)0 d7 g: j0 o! U
        {
6 p$ u3 J& M, a& D/ P% ?            average += results;. x1 A- ]& x( p5 a: I& [
        }, j4 q5 s$ T' |- \
        average >>= 5;                            //除以32
7 e( I( L4 l: B" b- |        index = 0;# M( @$ [* r1 d7 W# Y  b+ ]
                tcnt++;; O: E' J3 \7 |/ J# O
        if(tcnt == 200)      //主要是控制串口发送速度2 z. P$ N: ]+ b& J4 S4 k
        {
- f) X' P: P* `) I            LPM1_EXIT;% }3 Z# m7 w  y3 \* p6 u
            tcnt = 0;+ ?* u3 L6 L6 f; w0 L3 ^) B
        }2 D. W5 P' Y" v* r/ M3 V9 x
    }8 s1 P/ H! v" o8 [& v
}, T( q* b% R  Q& ^. v7 |9 }
3 t" S. Q/ A9 L8 T2 w. C2 j
void main()7 g) A5 o# b4 x' ?9 n* R
{9 E8 N4 B8 A  k3 Z4 v
  WDTCTL = WDTPW + WDTHOLD;
( V" Z, j8 \! x4 A+ }  P2DIR |= BIT0;( p$ T- r8 \' T5 q* M8 h7 i
  P2OUT |= BIT0;   //L8输出,熄灭   为1熄灭,为0点亮0 l+ s/ Y: i$ P5 _. |
  P2DIR |= BIT1;# r+ g2 g! Y" i5 t6 ]
  P2OUT |= BIT1;
% \2 a+ @( r( T: w  Clock_Init();* A7 U9 u" q6 U  H: b) A3 r' R
  TimerA_Init();; l* l  ^6 G4 E; h+ U( O! G/ N
  InitUART(); //调用初始化函数5 W: J7 m5 O( k1 b* D
  Init_ADC();
, ]# z7 K/ e3 z2 `5 z  y, E% l  _EINT();$ @3 k7 t: }/ Z* W' C' ^( w
  while(1) % B8 K* e  d9 E% \& ?  u& G- L
  {
" I' D7 n8 W3 b% |8 H9 q        LPM1;
; @' B6 o. b: j1 J        circle_speed=2*3.14*3.6*cir_radius*down_temp_cnt;
7 y; O% y2 E# l) p9 ~        angle=(360*average)/3300;
- K4 {/ ?/ S0 T0 W6 V: q: ]        Printf("%dkm/h",circle_speed);2 z$ U" w- z3 m# i. C
        delay();# s  B* E7 t. r( A+ S8 x# h
        Printf("|%d\r\n",angle);        
5 x* d) b. r9 D8 C  }$ O: i- \% v3 r0 G
}
* U  e! f( }, Q

该用户从未签到

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

该用户从未签到

3#
发表于 2022-7-7 16:35 | 只看该作者
太能折腾了,好好用鼠标,不行吗?
: o$ E% y* Z- A. H/ o" ]5 T
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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