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

2019-07-15 15:39发布

欧姆龙编码器(型号E6B2-CWZ3E)接的msp430f149的IO  P2.5引脚利用中断测速度
脚本如下:请教各位大神,中断应该如何修改,最终打印结果如下:

#include "config.h"

#define   keyin (P1IN & 0x0f)
#define   Num_of_Results   32
#define   cir_radius       30
#define uchar unsigned char
#define tiMER_CNT_NUM   50
#define SPEED_CNT_NUM    200
#define SPEED_IN    P2IN
#define SPEED_IO    BIT5
#define SPEED_DIR   P2DIR
#define SPEED_OUT   P2OUT
uint16_t results[Num_of_Results];    //保存ADC转换结果的数组
uint32_t average;
uint8_t tcnt = 0;     //ADC计数
uint8_t tcnt_ta=0;    //TimerA计数
uint32_t circle_speed=0;  //后轮转速
uint16_t angle;
uint16_t start,end,T,sum;
uint8_t overflow;
uint8_t ta_cnt=0;         //脉冲计数
uint32_t temp_cnt=0;    //临时计数
uint32_t down_temp_cnt=0;    //低电平计数
uint32_t up_temp_cnt=0;      //高电平计数
uint8_t down_cnt_flag =1;




void PutStr(uchar *str);
void PutChar(uchar txdata);
void Printf( uint8_t *Data,...);
int fputc(int ch,FILE *f);
void InitUART(void);
void delay2s(void);
char *itoa(int value, char *string, int radix);
void delay(void);
void Clock_Init();
void TimerA_Init();


void TimerA_Init(){

       
        //TACTL = TASSEL0+TACLR; //SMCLK, 计数器清除
        CCTL0 = CCIE;
        CCR0= TIMER_CNT_NUM*1000;                 //配置定时值
        TACTL = TASSEL_2 + MC_1;
}

void Clock_Init()
{
        uint8_t i;
        BCSCTL1&=~XT2OFF; //打开XT2振荡器
        BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
        do{
                IFG1&=~OFIFG; //清楚振荡器错误标志
                for(i=0;i<100;i++)
                _NOP();
        }
        while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待
        IFG1&=~OFIFG;
}







#pragma vector=TIMERA0_VECTOR
__interrupt void timer_a0()
{
        CCR0 += TIMER_CNT_NUM*1000;
        temp_cnt++;
        if(temp_cnt>SPEED_CNT_NUM){
          temp_cnt=0;
          down_temp_cnt=0;
        }
        if(!(SPEED_IN & SPEED_IO)){
            down_temp_cnt++;

        }else if(SPEED_IN & SPEED_IO){

        }

}

/*
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
__interrupt void timer_a(void)
{

       

        switch(TAIV) //向量查询
        { case 2: //捕获中断
                if(CCTL1&CM0) //上升沿
                {
                        ta_cnt++;
                        P2OUT ^= BIT1;
                        Printf("%dtcnt ",tcnt);
                }
                else if (CCTL1&CM1) //下降沿
                {

                }
                break;
        case 10: //定时器溢出中断
                P2OUT ^= BIT1;
                break; //溢出计数加1
        default:break;
        }
        tcnt_ta++;
        if(tcnt_ta==200)
        {
                tcnt_ta=0;
                circle_speed=(2*314*cir_radius*ta_cnt*36);
                ta_cnt=0;
        }

}
*/


/*******************************************
函数名称:ADC12ISR
功    能:ADC中断服务函数,在这里用多次平均的
          计算P6.0口的模拟电压数值
参    数:无      
返回值  :无
********************************************/

#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
    static uint8_t index = 0;
    results[index++] = ADC12MEM0;               // Move results
    if(index == Num_of_Results)
    {
      /*
      if(keyin != 0x0f)
        {
          delay();
          if(keyin != 0x0f)
          {
              while(keyin != 0x0f);
              P2OUT ^= BIT0;
                                  //uart0发送ON
              sendString("ON");
          }               
        }
        */
      delay();
        uint8_t i;
        average = 0;
        for(i = 0; i < Num_of_Results; i++)
        {
            average += results;
        }
        average >>= 5;                            //除以32
        index = 0;
                tcnt++;
        if(tcnt == 200)      //主要是控制串口发送速度
        {
            LPM1_EXIT;
            tcnt = 0;
        }
    }
}

void main()
{
  WDTCTL = WDTPW + WDTHOLD;
  P2DIR |= BIT0;
  P2OUT |= BIT0;   //L8输出,熄灭   为1熄灭,为0点亮
  P2DIR |= BIT1;
  P2OUT |= BIT1;
  Clock_Init();
  TimerA_Init();
  InitUART(); //调用初始化函数
  Init_ADC();
  _EINT();
  while(1)
  {
        LPM1;
        circle_speed=2*3.14*3.6*cir_radius*down_temp_cnt;
        angle=(360*average)/3300;
        Printf("%dkm/h",circle_speed);
        delay();
        Printf("|%d ",angle);        
  }
}



打印结果为什么不连续 打印结果为什么不连续
BicycleDemo2.rar 449.74 KB, 下载次数: 0
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
CHNlyt
1楼-- · 2019-07-15 16:53
学习学习。。。。
951141617
2楼-- · 2019-07-15 22:16
我记得当时用欧姆龙编码器的时候,波形不稳定,加了上拉电阻之后就是预想的效果

一周热门 更多>