etimer sync

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

etimer sync

700 Views
seize
Contributor III

Hi, I have a question about synchronization of Etimer count. (MPC5744P)

With Capture function of Etimer, I detect rising and falling edges of  3 hole sensor signals to calculate Motor RPM.

Following is my Etimer setting,

static void ETimer_Init(void)
{

   ETIMER_2.ENBL.R = 0x0; // disable Timer1 channels

   ETIMER_2.CH[2].CNTR.R = 0x0000;
   ETIMER_2.CH[3].CNTR.R = 0x0000;
   ETIMER_2.CH[4].CNTR.R = 0x0000;

   ETIMER_2.CH[2].CTRL1.R = 0x3942; // Counts only rising edge of the MC_CLK (10MHz in RUN0), divide by 2,    (10Mhz/2 = 5000000hz)
   ETIMER_2.CH[2].COMP1.R = 65500; // Compare value for 1u second delay ((1/5000000Hz)*65500 = 0.0131 sec)
   ETIMER_2.CH[2].CCCTRL.R = 0x0264; // compare on COMP1 when counting up, CAPT1 on rising edge,

   E TIMER_2.CH[3].CTRL1.R = 0x3943; // Counts only rising edge of the MC_CLK (10MHz in RUN0), divide by 2,    (10Mhz/2 = 5000000hz)
   ETIMER_2.CH[3].COMP1.R = 65500; // Compare value for 1u second delay ((1/5000000Hz)*65500 = 0.0131 sec)
   ETIMER_2.CH[3].CCCTRL.R = 0x0264; // compare on COMP1 when counting up, CAPT1 on rising edge,

   ETIMER_2.CH[4].CTRL1.R = 0x3944; // Counts only rising edge of the MC_CLK (10MHz in RUN0), divide by 2,    (10Mhz/2 = 5000000hz)
   ETIMER_2.CH[4].COMP1.R = 65500; // Compare value for 1u second delay ((1/5000000Hz)*65500 = 0.0131 sec)
   ETIMER_2.CH[4].CCCTRL.R = 0x0264; // compare on COMP1 when counting up, CAPT1 on rising edge,

   ETIMER_2.ENBL.R = 0xffff; // Enable Timer1 channel

   ETIMER_2.CH[2].CCCTRL.B.ARM = 1;
   ETIMER_2.CH[3].CCCTRL.B.ARM = 1;
   ETIMER_2.CH[4].CCCTRL.B.ARM = 1;
}

RPM is calculated using captured values below.

{

U_R = ETIMER_2.CH[2].CAPT1.R; 
U_F = ETIMER_2.CH[2].CAPT2.R; 
V_R = ETIMER_2.CH[3].CAPT1.R;
V_F = ETIMER_2.CH[3].CAPT2.R;
W_R = ETIMER_2.CH[4].CAPT1.R;
W_F = ETIMER_2.CH[4].CAPT2.R;

}

RPM didn't calculated well. So I checked CNTR values for each channel.

And I found that CNTR vaule of three Etimer channel were different at certain point.

ETIMER_2.CH[2].CNTR  = FEE3

ETIMER_2.CH[3].CNTR  =  2D53

ETIMER_2.CH[4].CNTR  = 5C22

How can I synchronize three Etimer channel?

0 Kudos
3 Replies

586 Views
PetrS
NXP TechSupport
NXP TechSupport

Hi,

if you start eTimer channels in the way you have, using ENBL bits, then channel counters should be synchronized. Unless you have different LOAD values in each eTimer channel. But LOAD should be cleared upon reset.

How do you read CNTR registers? Did you disable prescaler before by clearing ENBL?

BR, Petr  

0 Kudos

586 Views
seize
Contributor III

Hi Petr,

First of all, thanks for your kind reply.

I haven't set LOAD values, as the eTimer channels are using for capture.

I read CNTR register using Trace32.

Regarding "disable prescaler before by clearing ENBL", I have no idea how to disable prescaler?

Best regards,

Hyuntae Choi

0 Kudos

586 Views
PetrS
NXP TechSupport
NXP TechSupport

Hi,

LOAD value is used to init CNTR on compare event. So to have CNTR synchronized LOAD registers must be same.

Clear ENBL to stop counter on used channels , then read CNTR using debugger.

BR, Petr

0 Kudos