This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Capture Qei position and send to usb

Hi
I want to draw graphs of position of 2-phased QEI versus time. so I want to capture QEI position every time period. time gap between to position pulses is at least 7.2 microseconds.
I think I have to choose one of these methods:

1-send position to USB during time overflow interrupt(TIM_INT)

2-send content of the timer when the situation changes. (I don't know if it is possible to sense the changes as an interrupt?)

I think there are some restrictions due to interrupt latancy. so what is the highest resolution for my system. and which method is better? How can I define interrupt for 2nd method?
can i send data to buffer and send batch buffer to USB? Is it help me Reduce interrupt latancy effects? HOW?
Please Help me
Best Regards

Parents
  • thanks:

    Such a noise is filtered by,
    1) R/C (or L/C) filter at the input pins of the QEI unit.
    And
    2) The integrated digital filter of the LPC17xx QEI unit.

    Is it embedded in the IC or Should I do ?
    LPC_QEI->FILTER =???(What should i put??)

    As of QEI unit of LPC17xx, an ENCLK_Int interrupt occurs at the every transition of the encoder....
    I have written below codes to send the data to usb using usbhost lite.
    FILE_Open, FILE_Write & FILE_Close belong to USBHostlite part:

    void qei_main(){
            //Basic Configuration:
            LPC_SC->PCONP |= (1<<18);
            LPC_SC->PCLKSEL1  |= (0x01);
            //configuration for the pins:
            LPC_PINCON->PINSEL3 |=((1<<8)|(1<<14)|(1<<16));//PH A&B & index
            LPC_QEI->QEICONF =(1<<2);//PhA and PhB function as quadrature encoder inputs.(4x)
            LPC_QEI->QEICON = 0x02;//Control register: Reset position counter on index.(RESPI)
            LPC_QEI->INXCMP = 0x00;//QEI Index Compare register                                                                                                           LPC_QEI->QEILOAD = 0x00;//QEI Timer Reload register
            LPC_QEI->QEICLR = 0xFFFFFFFF;
            LPC_QEI->QEIIEC = 0xFFFFFFFF;
            LPC_QEI->QEIIES = 0x00000020;//enable ENCLK_EN
    }
    NVIC_EnableIRQ(QEI_IRQn);               /*enable the interrupt*/
    NVIC_SetPriority (USB_IRQn, 1);         /*2nd priority--is it correct??*/
    
    void QEI_IRQHandler(void){
            USB_INT32S  fdw;
            fdw = FILE_Open(FILENAME_W, RDWR);
            if (fdw>0) {
                    *UserBuffer=LPC_QEI->QEITIME;
                    FILE_Write(fdw,UserBuffer,4);
                    FILE_Close(fdw);
            }else{
                    return;
            }
            LPC_QEI->QEICLR = 0xFFFFFFFF;   // clear all interrupts
    }
    


    Is it correct set priority of USB to 0 and QEI to 1??

    kind regards

Reply
  • thanks:

    Such a noise is filtered by,
    1) R/C (or L/C) filter at the input pins of the QEI unit.
    And
    2) The integrated digital filter of the LPC17xx QEI unit.

    Is it embedded in the IC or Should I do ?
    LPC_QEI->FILTER =???(What should i put??)

    As of QEI unit of LPC17xx, an ENCLK_Int interrupt occurs at the every transition of the encoder....
    I have written below codes to send the data to usb using usbhost lite.
    FILE_Open, FILE_Write & FILE_Close belong to USBHostlite part:

    void qei_main(){
            //Basic Configuration:
            LPC_SC->PCONP |= (1<<18);
            LPC_SC->PCLKSEL1  |= (0x01);
            //configuration for the pins:
            LPC_PINCON->PINSEL3 |=((1<<8)|(1<<14)|(1<<16));//PH A&B & index
            LPC_QEI->QEICONF =(1<<2);//PhA and PhB function as quadrature encoder inputs.(4x)
            LPC_QEI->QEICON = 0x02;//Control register: Reset position counter on index.(RESPI)
            LPC_QEI->INXCMP = 0x00;//QEI Index Compare register                                                                                                           LPC_QEI->QEILOAD = 0x00;//QEI Timer Reload register
            LPC_QEI->QEICLR = 0xFFFFFFFF;
            LPC_QEI->QEIIEC = 0xFFFFFFFF;
            LPC_QEI->QEIIES = 0x00000020;//enable ENCLK_EN
    }
    NVIC_EnableIRQ(QEI_IRQn);               /*enable the interrupt*/
    NVIC_SetPriority (USB_IRQn, 1);         /*2nd priority--is it correct??*/
    
    void QEI_IRQHandler(void){
            USB_INT32S  fdw;
            fdw = FILE_Open(FILENAME_W, RDWR);
            if (fdw>0) {
                    *UserBuffer=LPC_QEI->QEITIME;
                    FILE_Write(fdw,UserBuffer,4);
                    FILE_Close(fdw);
            }else{
                    return;
            }
            LPC_QEI->QEICLR = 0xFFFFFFFF;   // clear all interrupts
    }
    


    Is it correct set priority of USB to 0 and QEI to 1??

    kind regards

Children
  • > LPC_QEI->FILTER =???(What should i put??

    The time constant of the passive input RC (LC) filter is determined by the PCLK frequency of QEI.
    It's much less than (1/8 - 1/16) of PCLK
    QEI FILTER register holds a minimum expected interval of encoder transition, counted in PCLK scale.

    > Is it correct set priority of USB to 0 and QEI to 1??

    QEI should have the highest priority (0), and USB is assigned to lower priority than QEI.

    > I have written below codes to send the data to usb using usbhost lite.

    FILE_Open, FILE_Write and FILE_Close are too slow to run in the QEI ISR.
    Also, it is efficient to write data of sector size at a time.

    In the QEI ISR, the timer value is written to a buffer of 1024 bytes.
    When the buffer holds 512 bytes (sector size) or more, one sector of data is written to the USB drive.

    Tsuneo

  • >The time constant of the passive input RC (LC) filter is determined by the PCLK frequency of QEI.
    It's much less than (1/8 - 1/16) of PCLK

    So, if i want to filter pulses less than 2us, what should i write?(clk=100mhz)
    LPC_QEI->FILTER =0xc8; /*200*/
    Is it correct?

    >When the buffer holds 512 bytes (sector size) or more, one sector of data is written to the USB drive.

    Oh, I am a beginner!
    I don't know how to access to the buffer. How can i get access to this Buffer?
    what should i write instead of *UserBuffer=LPC_QEI->QEITIME; ??
    can you help me with the codes?
    thanks

  • >When the buffer holds 512 bytes (sector size) or more, one sector of data is written to the USB drive.

    Thanks Dr Tsuneo Chinzei

    But how can i detect that number of bytes written in QEITIME is 512?
    And how to Empty the buffer after writing data?

    An other Question: Is it correct to write LPC_QEI->FILTER =0xc8; /*200*/ to filter less than 2us when clock is 100mhz?

    Best Regards?

  • I still haven't got answered my previous questions!
    I don't know how to get access to the buffer that included timer(QEITIME) values?

    another question:
    what is the practical difference between set register & enable register(QEISET & QEIIES)? Can you give me an example please?

    Amir
    hejazi1365[at]gmail[dot]com
    Best regards