亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? encoder.c

?? Texas-Instrument C2000 Series DSP example programs
?? C
字號(hào):
/*=====================================================================
  Name:           ENCODER.C
  Project:        ENCODER
  Originator:     Martin Staebler
  Description:    Provides functions for handling incremental
                  encoder with analog sin/cos output signal
                  to achieve higher position resolution
 =======================================================================
 
       Function List:   void   Encoder_Init(unsigned rollover)
                        void   Encoder_ZeroPosition(void)
                        void   Encoder_MatchIncrPhase(void)
                        void   Encoder_CalcPhase(int sin,int ncos) 
                        unsigned Encoder_SamplePosition(void)
                        void   Encoder_CalcPosition(unsigned qep_incr_sample)

        Status:         OK

        Target:         TMS320C240

        History:        (Date, Revision, Who, What)
        ------------------------------------------------------------
        02/11/97        1.0     STAE    Preliminary
 ======================================================================*/
				 

/*--------------*/
/* Header Files */
/*--------------*/
#include <stdlib.h>             
#include <math.h>       
#include <q15_div.h>            /* q15.lib */
#include <q15_atan.h>           /* q15.lib */
#include "c240.h"               /* TMS320C240 memory mapped registers */
#include "adc.h"                /* ADC macros */
#include "evm_qep.h"            /* QEP unit */
#include "monitor.h"            /* test program & monitor */
#include "encoder.h"            /* encoder definition */



/*----------------------*/
/* Variable Declaration */
/*----------------------*/
volatile unsigned  encoder_position[2];    



/*======================================================================*/
/* void Encoder_Init(unsigned rollover)                                 */
/*======================================================================*/
/* Function:      Incremental encoder initialization			*/
/* 									*/
/* Arguments:     Incremental counts/revolution = 4-times line count    */
/* 									*/
/* Return value:  None							*/	
/*======================================================================*/
void Encoder_Init(unsigned rollover)
{
    /*---------------------*/
    /* Initialize F240 ADC */
    /*---------------------*/
    ADCTRL1  = 0x1800;           /* enable both ADC's */
    ADCTRL1 |= 0x0100;           /* clear interrupt flag */       
    ADCTRL2  = 0x0003;           /* ADC_CLOCK = SYSCLK/10 = 1MHz */

    /*------------------------------*/
    /* Initialize F240 QEP Circuit  */
    /*------------------------------*/
    QEP_Init(0x0,rollover);      /* QEP counts Timer 2 */

    /*------------------------------------------------*/
    /* Get zero incremental position (via index) and  */
    /* synchronize incremental count and phase        */
    /*------------------------------------------------*/
    Encoder_MSG();              /* turn encoder into zero position */
    Encoder_ZeroPosition();     /* detect zero position adjust counter */
    Encoder_MatchIncrPhase();   /* match counter (quadrant) and phase */

} /* end Encoder_Init */



/*======================================================================*/
/* void Encoder_ZeroPosition(void)                                     */
/*======================================================================*/
/* Function:  Modify/adjust qep_diff, so that the incremental count of  */
/*            the encoder (using function QEP_GetIncr() matches with    */
/*            phase derived from the analog sin/-cos signal, as shown   */
/*            below.                                                    */
/*======================================================================*/
void Encoder_ZeroPosition(void)
{
   /* Configure IOPC6/CAP3 to detect level */
   OCRB &= 0xFFBF;                      /* clear bit 6 */
   PCDATDIR &= 0xBFFF;                  /* clear bit 14 */
   while ( !(PCDATDIR & 0x0040));       /* poll bit 6 */
   T2CNT = 0x0;
}

/*======================================================================*/
/* void Encoder_MatchIncrPhase(void)                                    */
/*======================================================================*/
/* Function:  Modify/adjust qep_diff, so that the incremental count of  */
/*            the encoder (using function QEP_GetIncr() matches with    */
/*            phase derived from the analog sin/-cos signal, as shown   */
/*            below.                                                    */
/*======================================================================*/
void Encoder_MatchIncrPhase(void)
{
    /*-----------------*/
    /* local variables */
    /*-----------------*/
    char  c;
    volatile int   	buffer[2];
    volatile unsigned 	ubuffer[2];

    /*----------------------------------------------------------*/
    /* Synchronize incremental count and encoder phase  	*/
    /*----------------------------------------------------------*/
    /* Assumption: ADCIN5  <--> QEP1/sin(x)                  	*/
    /* 		   ADCIN13 <--> QEP2/negcos(x)                 	*/
    /* 								*/
    /* (T2CNT % QEP_ENCODER) % 4 + qep_diff =  Quadrant 0,1,2,3 */
    /*----------------------------------------------------------*/
    do
    {
       /*------------------------*/
       /* aquire encoder signals */
       /*------------------------*/
       ubuffer[1] = Encoder_SamplePosition();

       ADC_READ2(buffer[0],buffer[1]);

       /* Correct U0 and U90 input signals offset */
       buffer[0] = buffer[0] - ENC_U0_OFFSET;  
       buffer[1] = buffer[1] - ENC_U90_OFFSET;

       /*----------------------------------------------*/
       /* check, if nearly in the middle of a quadrant */ 
       /*----------------------------------------------*/
    }  while ( abs(abs(buffer[0])-abs(buffer[1])) > 0x4000);

    /*----------------------------------------*/
    /* init qep_diff for phase/count matching */
    /*----------------------------------------*/
    ubuffer[0] = Encoder_CalcPhase(buffer[0],buffer[1]);   
    ubuffer[0] = (ubuffer[0] >> 14) & 0x0003;   /* extract quadrant */
    ubuffer[1] = ubuffer[1] & 0x0003;
    
    qep_diff = qep_diff + ((int) ubuffer[1] - (int) ubuffer[0]); 
}    


/*======================================================================*/
/* unsigned Encoder_SamplePosition(void);                               */
/*======================================================================*/
/* Function:      Sample encoder signals SIMULTANEOUSLY                 */
/*                SIN, -COS  --> Channel 5, 13 (hardcoded)              */
/*                INCREMENTS --> Timer 2 counter (T2CNT)                */
/* 									*/
/* Arguments:     Buffer for increments sample                          */ 
/* 									*/
/* Return value:  Incremental count                                     */ 
/*======================================================================*/
asm("ADCTRL1    .set    7032h                                   ");
asm("T2CNT      .set    7405h                                   ");
asm("           .ref    _qep_diff                               ");
asm("           .ref    _QEP_GetIncr                            ");
asm("           .def    _Encoder_SamplePosition                 ");
asm("_Encoder_SamplePosition:                                   ");
asm("           ldp     #ADCTRL1/128                            ");
asm("           lacl    ADCTRL1                                 ");
asm("           and     #0FF81h         ;clear channels         ");
asm("           or      #005Bh          ;select channel 5 and 13");
asm("           sacl    ADCTRL1         ;(1) start ADC's        ");

#ifdef QEP_POWER2
asm("           ldp     #_qep_diff                              ");
asm("           lacl    #0                                      ");
asm("           sub     _qep_diff                               ");
asm("           ldp     #(T2CNT/128)                            ");
asm("           nop                                             ");
asm("     ;capture Timer 2 300ns after ADC start (1)            ");
asm("     ;-----------------------------------------            ");
asm("           add     T2CNT                                   ");
asm("           and     #(QEP_ROLLOVER-1)                       ");
asm("           ret                                             ");

#else
asm("     ;capture Timer 2 300ns after ADC start (1)                  ");
asm("     ;-----------------------------------------                  ");
asm("           call    _QEP_GetIncr   ;200ns (call) + 100ns in subroutine ");
asm("           ret                                                   ");

#endif



/*======================================================================*/
/* void Encoder_CalcPosition(unsigned qep_incr_sample);                 */
/*======================================================================*/
/* Function:      Calc encoder position                                 */
/*                               increments (Timer 2)                   */
/*                                                                      */
/* Arguments:     increments sample                                     */                                                  
/* 									*/
/* Global var's:  unsigned qep_position[2]                              */                                                  
/* 									*/
/* Return value:  None							*/	
/*======================================================================*/
void Encoder_CalcPosition(unsigned qep_incr_sample)
{
    /*--------------*/
    /* locals var's */
    /*--------------*/
    volatile int sin_sample;
    volatile int ncos_sample;
    volatile unsigned incr;
    volatile unsigned buffer;

    incr = qep_incr_sample;

    /*---------------------------------------------*/
    /* read converted sin and -cos encoder signals */
    /*---------------------------------------------*/
    ADC_READ2(sin_sample,ncos_sample);

    /* Correct U0 (sin_sample and U90 (ncos_sample) offset */
    sin_sample  = sin_sample - ENC_U0_OFFSET; 
    ncos_sample = ncos_sample - ENC_U90_OFFSET;

    /*-------------------*/
    /* phase calculation */
    /*-------------------*/
    encoder_position[0] = Encoder_CalcPhase(sin_sample, ncos_sample);   
   
    /*----------------------------------------------------------*/
    /* correct incremental steps according to phase information */
    /*----------------------------------------------------------*/
    buffer = ((encoder_position[0] >> 14) & 0x0003);
    switch (buffer)
    {
       case 0:  if ((incr & 0x0003) == 3)
                   incr = (incr + 1) & (qep_rollover-1);
                break;  

       case 3:  if ((incr & 0x0003) == 0)
                   incr = (incr - 1) & (qep_rollover-1);
                break;  
    } /* switch */

    /* remove (redundant) quadrant information (last two bits) */   
    encoder_position[1] = (incr >> 2);
}



/*======================================================================*/
/* int Encoder_CalcPhase(int qep_sin,int qep_negcos);                   */ 
/*======================================================================*/
/* Function:      Incremental encoder initialization			*/
/* 									*/
/* Arguments:     None							*/
/* 									*/
/* Return value:  None							*/	
/*======================================================================*/
int  Encoder_CalcPhase(int qep_sin, int qep_negcos)  
{

    int  phase;
    int  buffer;
   /*------------------------------------------*/
   /* general calculation, within 1st quadrant */
   /*------------------------------------------*/
   if (abs(qep_sin) == abs(qep_negcos))
      phase = (PI/4);               
   else if (abs(qep_sin) < abs(qep_negcos))
   {
      buffer = q15_div(abs(qep_sin),abs(qep_negcos)); 
      /* phase  = q15_atan(buffer);  */ 
      phase  = q15p_atan(buffer);   
   } 
   else
   {
      buffer = q15_div(abs(qep_negcos),abs(qep_sin)); 
      /* phase  = (PI/2) - q15_atan(buffer); */  
      phase  = (PI/2) - q15p_atan(buffer);   
   }
   
   /*------------------------------*/
   /* get 2nd, 3rd to 4th quadrant */
   /*------------------------------*/
   if (qep_sin >= 0)   
   {   
      if (qep_negcos > 0)
         phase = PI - phase;    /* 2nd quadrant */ 
   } /* end if */
   
   else 
   {  
      if ( qep_negcos > 0 )
         phase = PI + phase;    /* 3rd quadrant */ 
      else
         phase = -phase;        /* 4th quadrant */ 
   } /* end else */
   
   return  phase; 
}



?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99视频有精品| 欧美性做爰猛烈叫床潮| 亚洲激情自拍偷拍| 国产亚洲综合色| 精品久久人人做人人爱| 欧美群妇大交群的观看方式| 91国偷自产一区二区三区成为亚洲经典| 国产精品综合av一区二区国产馆| 日韩黄色免费网站| 久久99精品国产麻豆不卡| 美腿丝袜在线亚洲一区| 国产综合久久久久久鬼色| 高清av一区二区| 色欧美88888久久久久久影院| 在线观看亚洲a| 91精品国产丝袜白色高跟鞋| 精品国产乱子伦一区| 国产欧美日韩在线| 亚洲另类在线一区| 石原莉奈在线亚洲二区| 久久99国产精品麻豆| 国产成人午夜精品5599| 欧洲av一区二区嗯嗯嗯啊| 欧美日韩日日夜夜| 久久综合九色综合97婷婷| 国产精品久久久久久久久搜平片 | 色综合久久88色综合天天6| 日本精品免费观看高清观看| 制服丝袜在线91| 国产香蕉久久精品综合网| 亚洲国产高清aⅴ视频| 亚洲欧洲另类国产综合| 日韩精品午夜视频| 日本三级韩国三级欧美三级| 国产精品888| 色老汉一区二区三区| 日韩精品资源二区在线| 欧美国产丝袜视频| 天天色综合天天| 日韩精品午夜视频| www.欧美.com| 91精品国产一区二区三区蜜臀| 久久久噜噜噜久久中文字幕色伊伊| 国产午夜精品一区二区| 一区二区三区丝袜| 国产在线精品一区二区| 色悠悠久久综合| 国产色爱av资源综合区| 亚洲欧美日韩成人高清在线一区| 久久激情五月激情| 欧美日本国产视频| 午夜精品久久久久久久久久久| 国精产品一区一区三区mba桃花| 色吊一区二区三区| 欧美国产精品一区| 麻豆91在线播放免费| 欧美日韩一区久久| 亚洲欧美中日韩| 国产.欧美.日韩| 欧美一区二区精品在线| 亚洲电影一区二区三区| 99久久综合狠狠综合久久| 久久精品视频在线看| 六月丁香婷婷色狠狠久久| 欧美日韩一区二区三区在线看| 亚洲视频在线一区| 不卡av免费在线观看| 国产三级精品三级在线专区| 国内精品国产三级国产a久久| 欧美精品高清视频| 亚洲v日本v欧美v久久精品| 日本高清不卡一区| 中文字幕一区二区日韩精品绯色| 国产白丝精品91爽爽久久| 亚洲国产高清不卡| 99视频精品免费视频| 国产精品高清亚洲| 91麻豆精东视频| 中文字幕在线视频一区| 成人av网站免费| 欧美国产精品劲爆| www.久久精品| 一级精品视频在线观看宜春院| 色爱区综合激月婷婷| 亚洲一区二区偷拍精品| 69堂亚洲精品首页| 久久精品国产精品亚洲红杏| 精品国产精品网麻豆系列| 国产一区二区三区综合| 国产日韩欧美在线一区| 91在线观看地址| 亚洲va韩国va欧美va| 欧美一级精品在线| 国产成人日日夜夜| 亚洲狠狠丁香婷婷综合久久久| 欧美日韩国产在线观看| 热久久久久久久| 国产亚洲欧美激情| 91视频国产观看| 香蕉久久一区二区不卡无毒影院 | 成人午夜激情影院| 亚洲激情六月丁香| 日韩欧美国产一区二区三区| 国产99久久精品| 亚洲成a人v欧美综合天堂下载| 日韩欧美亚洲国产另类| 不卡高清视频专区| 天天操天天色综合| 国产精品丝袜在线| 欧美精品v国产精品v日韩精品| 国产剧情在线观看一区二区| 亚洲色欲色欲www在线观看| 欧美日韩免费在线视频| 国产大陆精品国产| 亚洲18色成人| 国产精品久久久一区麻豆最新章节| 欧美日韩三级在线| 欧美性做爰猛烈叫床潮| 国产成人综合自拍| 污片在线观看一区二区| 国产精品久久久久久久久搜平片 | 国产精品入口麻豆原神| 91精品一区二区三区久久久久久| 国v精品久久久网| 天天免费综合色| 亚洲欧美激情小说另类| 久久理论电影网| 欧美高清性hdvideosex| 99re在线精品| 国产精品18久久久久| 日日摸夜夜添夜夜添国产精品 | 日韩你懂的在线观看| 色综合天天性综合| 成人午夜激情在线| 国产米奇在线777精品观看| 五月婷婷激情综合| 亚洲一区二区四区蜜桃| 国产精品国产三级国产aⅴ入口| 欧美精品一区二区三| 欧美一区二区三区在线观看视频| 色美美综合视频| 99r精品视频| 国产91精品久久久久久久网曝门| 精一区二区三区| 久久精品国产色蜜蜜麻豆| 日韩二区三区在线观看| 国产高清精品网站| 精品一二线国产| 精品一区二区三区不卡| 精品影视av免费| 国内精品自线一区二区三区视频| 麻豆成人av在线| 免费xxxx性欧美18vr| 男女视频一区二区| 精品一区二区三区蜜桃| 激情综合网激情| 国产成人在线视频网站| 国产999精品久久| 国产a视频精品免费观看| 国产91丝袜在线播放九色| 丰满白嫩尤物一区二区| 不卡电影一区二区三区| 日本高清视频一区二区| 欧美日韩综合色| 91精品啪在线观看国产60岁| 日韩一区二区免费在线电影| 久久免费看少妇高潮| 中文一区二区完整视频在线观看 | 亚洲一区二区三区小说| 亚洲一二三四在线观看| 日本欧美一区二区| 国产一区二区三区精品欧美日韩一区二区三区| 久久精品噜噜噜成人av农村| 国产经典欧美精品| 一本大道综合伊人精品热热| 欧美日韩在线一区二区| 欧美精品一区二区三区一线天视频 | 欧美综合久久久| 欧美久久一二三四区| 欧美精品一区二区三区在线 | 亚洲欧美日韩一区| 天堂av在线一区| 国产很黄免费观看久久| 色屁屁一区二区| 精品国产免费一区二区三区香蕉| 欧美激情综合网| 午夜精品久久久久影视| 国产精品综合网| 欧美日韩一区二区欧美激情| 国产精品久久久久一区| 日韩电影免费一区| 91在线码无精品| 精品福利一二区| 亚洲精品日韩综合观看成人91| 免费在线观看不卡| 91福利精品视频| 久久精品欧美日韩精品| 五月天亚洲精品| 99re热这里只有精品免费视频| 日韩女同互慰一区二区|