Quadrature decoder initialization with KSDK1.2 & KDS3.0

cancel
Showing results for 
Search instead for 
Did you mean: 

Quadrature decoder initialization with KSDK1.2 & KDS3.0

Jump to solution
567 Views
petershih
Contributor III

Hi :

 

I am working on quadrature decoder on FTM with TWR-K64F120M by using KDS3.0 and KSDK1.2. I have encoder connected to PTB0 and PTB1 and declare as

FTM1_QD_PHA and FTM1_QD_PHB, and able to see the signal on the scope. However, I am not able to initialize the FTM1 properly. The initialization always get stuck at FTM_HAL_SetSyncMode() in FTM_DRV_Init(). Please let me know if you have any idea or recommendation for me to clear the problem. Thanks!

86568_86568.pngpastedImage_0.png

main.c

//----------------------------------------------------------------------- // Standard C/C++ Includes //----------------------------------------------------------------------- #include <stdio.h>  //----------------------------------------------------------------------- // KSDK Includes //----------------------------------------------------------------------- #include "main.h"  //----------------------------------------------------------------------- // Application Includes //-----------------------------------------------------------------------  //----------------------------------------------------------------------- // Constants //----------------------------------------------------------------------- #define    ENCX_OVERFLOW        4000    //1000 CPR(cycle/rev) #define    ENCY_OVERFLOW        4000    //1000 CPR(cycle/rev)  const gpio_input_pin_user_config_t encoderPins[] = {   {     .pinName = kFTM1B0,     .config.isPullEnable = false,     .config.pullSelect = kPortPullUp,     .config.isPassiveFilterEnabled = false,     .config.isDigitalFilterEnabled = false,     .config.interrupt = kPortIntDisabled   },   {     .pinName = kFTM1B1,     .config.isPullEnable = false,     .config.pullSelect = kPortPullUp,     .config.isPassiveFilterEnabled = false,     .config.isDigitalFilterEnabled = false,     .config.interrupt = kPortIntDisabled   },   {     .pinName = kFTM2B18,     .config.isPullEnable = false,     .config.pullSelect = kPortPullUp,     .config.isPassiveFilterEnabled = false,     .config.isDigitalFilterEnabled = false,     .config.interrupt = kPortIntDisabled   },   {     .pinName = kFTM2B19,     .config.isPullEnable = false,     .config.pullSelect = kPortPullUp,     .config.isPassiveFilterEnabled = false,     .config.isDigitalFilterEnabled = false,     .config.interrupt = kPortIntDisabled   },   {     .pinName = GPIO_PINS_OUT_OF_RANGE,   } };  //----------------------------------------------------------------------- // Typedefs //-----------------------------------------------------------------------  //----------------------------------------------------------------------- // Global Variables //-----------------------------------------------------------------------  //----------------------------------------------------------------------- // Macros //-----------------------------------------------------------------------  //----------------------------------------------------------------------- // Function Prototypes //----------------------------------------------------------------------- void encoderX_Init(void); void configure_ftm1_pins(void);  //----------------------------------------------------------------------- // Main Function //----------------------------------------------------------------------- int main(void) {      // Configure board specific pin muxing     hardware_init();      // Initialize UART terminal     dbg_uart_init();      encoderX_Init();      PRINTF("\r\nRunning the TwoLED_ProjGen project.\n");      for (;;)                                         // Forever loop     {         __asm("NOP");     } }  void encoderX_Init(void) {     FTM_Type *ftmBase;      // Configure FTM1,2 encoder pins     ftmBase = g_ftmBase[FTM2_IDX];     configure_ftm1_pins();     GPIO_DRV_Init(encoderPins, NULL);      //FTM_DRV_QuadDecodeStop(FTM2_IDX);     //OSA_InstallIntHandler(FTM1_IRQn, FlexTimer1_IRQHandler);     ftm_user_config_t flexTimer1_InitConfig0 = {       .tofFrequency      = 0U,       .isWriteProtection = false,                // Disable write protection       .BDMMode           = kFtmBdmMode_11,       .syncMethod        = 0U     };     FTM_DRV_Init(FTM2_IDX,&flexTimer1_InitConfig0);      FTM_HAL_SetMod(ftmBase, ENCX_OVERFLOW);     FTM_HAL_SetCounterInitVal(ftmBase, 0);      FTM_DRV_SetClock(FTM2_IDX, kClock_source_FTM_ExternalClk, kFtmDividedBy1);    //start the timer clock, source is the the phase A and B input signals     ftm_phase_params_t flexTimer1_QdConfig0 = {       .kFtmPhaseInputFilter = false,       .kFtmPhaseFilterVal = 0U,       .kFtmPhasePolarity = kFtmQuadPhaseNormal,     };     FTM_DRV_QuadDecodeStart(FTM2_IDX, &flexTimer1_QdConfig0, &flexTimer1_QdConfig0, kFtmQuadPhaseEncode);     FTM_HAL_ClearTimerOverflow(ftmBase);     FTM_DRV_SetTimeOverflowIntCmd(FTM2_IDX,true); }  void configure_ftm1_pins(void) {     PORT_HAL_SetMuxMode(PORTB,0UL,kPortMuxAlt6);     PORT_HAL_SetPullMode(PORTB,0UL,kPortPullUp);     PORT_HAL_SetPullCmd(PORTB,0UL,false);     PORT_HAL_SetMuxMode(PORTB,1UL,kPortMuxAlt6);     PORT_HAL_SetPullMode(PORTB,1UL,kPortPullUp);     PORT_HAL_SetPullCmd(PORTB,1UL,false); }

 

gpio_pin.h

enum _gpio_pins_pinNames{   kGpioSW1                    = GPIO_MAKE_PIN(GPIOC_IDX, 6U),   kGpioSW3                    = GPIO_MAKE_PIN(GPIOA_IDX, 4U),   kGpioSdhc0Cd                = GPIO_MAKE_PIN(GPIOB_IDX, 20U),   kGpioLED1                   = GPIO_MAKE_PIN(GPIOE_IDX, 6U),   kGpioLED2                   = GPIO_MAKE_PIN(GPIOE_IDX, 7U),   kGpioLED3                   = GPIO_MAKE_PIN(GPIOE_IDX, 8U),   kGpioLED4                   = GPIO_MAKE_PIN(GPIOE_IDX, 9U),   kGpioSdcardCardDetection    = GPIO_MAKE_PIN(PORTD_IDX, 15U),  /* Connects the TWR_MEM, this's SPI Card detector pin */        kFTM1B0                        = GPIO_MAKE_PIN(GPIOB_IDX, 0U),            //FTM1_QD_PHA     kFTM1B1                        = GPIO_MAKE_PIN(GPIOB_IDX, 1U),            //FTM1_QD_PHB     kFTM2B18                    = GPIO_MAKE_PIN(GPIOB_IDX, 18U),        //FTM2_QD_PHA     kFTM2B19                    = GPIO_MAKE_PIN(GPIOB_IDX, 19U),        //FTM2_QD_PHA };

 

Peter Shih

Labels (1)
1 Solution
225 Views
petershih
Contributor III

Hi XiangJun:

As you mentioned, I don't need to call FTM_HAL_SetSyncMode() function. However, it is called from FTM_DRV_Init(). Since I am using KSDK, I have no choice to avoid it except modifing source code. Actually, I set .syncMethod to "kFtmUseSoftwareTrig" instead of "0", and It works OK. I think this is what I am going to use for now. Thanks your help!

Peter Shih

View solution in original post

2 Replies
225 Views
xiangjun_rong
NXP TechSupport
NXP TechSupport

Hi, Peter,

I hope you can attach your project to the community so that we can test your project on my K64 board. If you use FTM to count the phaseA and phaseB signals from encoder, I do not think it is necessary to call the  FTM_HAL_SetSyncMode() function.

BR

XiangJun Rong

0 Kudos
226 Views
petershih
Contributor III

Hi XiangJun:

As you mentioned, I don't need to call FTM_HAL_SetSyncMode() function. However, it is called from FTM_DRV_Init(). Since I am using KSDK, I have no choice to avoid it except modifing source code. Actually, I set .syncMethod to "kFtmUseSoftwareTrig" instead of "0", and It works OK. I think this is what I am going to use for now. Thanks your help!

Peter Shih