Lab13. การใช้งาน QEI เพื่ออ่านค่า Encoder


#include <p30f2010.h>    // เปิดใช้งานไลบรารี dsPIC30F2010
#include <qei.h>                                // เปิดใช้งานไลบรารี  QEI
#include<uart.h>                                //เปิดใช้งานไลบรารี uart เพื่อส่งข้อมูลแบบ RS-232
#include<stdio.h>              //เปิดใช้งานไลบรารีการแปลงข้อมูล

_FOSC(CSW_FSCM_OFF & XT_PLL4);      // โหมดการทำงาน แบบ XT คริสตอล 4 - 10 MHz มี PLLx4 คือ ทวีคูณความถี่ของ clock 4 เท่า
_FWDT(WDT_OFF);                                            //ปิดการทำงาน  watchdog Timer

#define Fcy                                                           7372800.0
#define BAUD_RATE                                          9600.0
#define BAUD_RATE_GEN                               (Fcy/(16*BAUD_RATE))-1;

 int pos_value=0;                                 // ประกาศตัวแปรชื่อ pos_value แบบจำนวนเต็มบวก เป็น 0

void _ISR _U1TXInterrupt(void)        //ฟังก์ชันuart1 TX interrupt
{
                _U1TXIF = 0;                        //Clear register uart1 TX เป็น 0
                }
void _ISR _U1RXInterrupt(void)        //ฟังก์ชัน uart1 RX interrupt
{
                _U1RXIF = 0;                        //ฟังก์ชัน uart1 RX interrupt
                }
void _ISR _QEIInterrupt(void)           //ฟังก์ชัน QEI interrupt
{              
                POSCNT = 0;                                       // Clear ค่า Position Count
                IFS2bits.QEIIF = 0;                              // Clear Register QEI interrupt เป็น 0
}
void uart1_init()                    //ฟังก์ชันการทำงาน uart1
{              
                unsigned int ConfigU1MODE,ConfigU1STA,BaudRate;                           
                CloseUART1();                     //ปิดการทำงาน uart1
                ConfigU1MODE =               UART_EN &                                          // Enable UART1
                                                                UART_IDLE_CON &                            // UART1 working in idle mode
                                                                UART_RX_TX&     // UART1 normal pin(TX==>RF3 pin,RX==>RF2 pin)
                                                                UART_DIS_WAKE &                            // Disable wake-up on start UART
                                                                UART_DIS_LOOPBACK & // Disable loop back mode                              
                                                                UART_DIS_ABAUD &                          // Disable autobaud mode
                                                                UART_NO_PAR_8BIT &                      // Set data 8 bit ,no parity bit
                                                                UART_1STOPBIT;                                               // Set 1 stop bit
                ConfigU1STA       =             UART_INT_TX_BUF_EMPTY &         // Interrupt on buffer empty mode
                                                                UART_TX_PIN_NORMAL &                                // TX Break bit normal
                                                                UART_INT_RX_CHAR&                      // UART interrupt receive mode
                                                                UART_ADR_DETECT_DIS &             // Disable detect address mode
                                                                UART_RX_OVERRUN_CLEAR;         // Reset buffer over run

                BaudRate = BAUD_RATE_GEN;
                OpenUART1(ConfigU1MODE, ConfigU1STA, BaudRate);        //เปิดการทำงานของ uart1 ตามค่าที่กำหนดไว้
}
void qei_init(void)
{
                unsigned int config1;
                ADPCFG = 0xFFFF;                            // ปิดการทำงานของ ADC
                ConfigIntQEI(QEI_INT_PRI_1 &       // QEI interrupt priority level 1
                                       QEI_INT_ENABLE);      // Enable QEI interrupt
               
                POSCNT = 0;                                                       // Clear ค่า Position Count
                MAXCNT = 4000;                                                 // กำหนดค่าสูงสุดในการนับเป็น 4000
                config1  =(QEI_DIR_SEL_QEB&                     // QEB Pin State Defines Position Counter Direction
                                QEI_INT_CLK&                                    // Internal clock (FOSC/4)
                                QEI_INDEX_RESET_DISABLE&      // Index Pulse does not reset Position Counter
                                QEI_CLK_PRESCALE_1 &                                // QEI Timer Input Clock Prescale Select Bits             
                                QEI_GATED_ACC_DISABLE&           // Timer gated time accumulation disabled
                                QEI_NORMAL_IO&             // QEI Position Counter Direction Status Output Disabled
                                QEI_INPUTS_NOSWAP&                  // QEI Phase A and Phase B inputs not swapped       
                                QEI_MODE_x4_MATCH& // QEI Quadrature Encoder Interface enabled (x4 mode)                                                                                         // with position counter reset by match (MAXCNT)
                                QEI_UP_COUNT&                              // QEI Position Counter Direction +VE
                                QEI_IDLE_CON);                                                // QEI Continue module operation in idle mode         
                OpenQEI(config1,0);                                         // เปิดการทำงานของ QEI    
}
void Uart1_PrintStr(unsigned char *str_uart){               //ฟังก์ชันการส่งข้อมูล RS-232
                putsUART1((unsigned int *)str_uart);
                while(BusyUART1());
}
int main(void)
{
                unsigned char buffer[20];                 //ประกาศตัวแปรชื่อ buffer แบบตัวอักษรขนาด 20 ตัวอักษร
                qei_init();                                               // เปิดการใช้งานฟังก์ชัน qei
                while(1)                                                 // Infinite loop
                {
                                pos_value = ReadQEI();                    // เก็บค่าการนับไวที่ตัวแปร pos_value
sprintf(buffer,”%u\r\n”,pos_value);   //แปลงค่า pos_value เป็นสตริงเก็บไวที่ตัวแปร buffer
                                Uart1_PrintStr(buffer);                        //ส่งค่าตัวแปร buffer ออก RS – 232
                }              
}