This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

nRF52 Pulse Duration Counter - going from 1 micro-second resolution to nano-seconds

I used the Adafruit Bluefruit NRF52840 LE and added some simple code to this existing timer/counter for pulses: https://devzone.nordicsemi.com/f/nordic-q-a/62633/nrf52-timer-as-counter-adafruit-feather   It counts the number of LOW pulses within a certain time period. I changed it to count HIGH pulses. it works in Arduino.

But I would like to measure the time between two pulses (the period between the RISING or HIGH peaks of two consecutive pulses).  There are only two pulses coming about every 2-3 seconds.  The expected duration of the two pulses is between 100-2000 us (micro-seconds).

I suspect that I need to read the  respective "time-stamp" of the Timer at the HIGH (RISING) of each of the two pulses and subtract the 1st reading from the 2nd reading.  Right now I am  using the "micros()" but that only gives me 1us resolution and defeats the purpose of the Timer' nano-second resolution.  

Is there a sample code someone can point me to add that "time-stamp" feature in there? 

#define FREQ_MEASURE_PIN 6u  // was 7u   PIN 11 on express 52840
#define PPI_CHANNEL 1u

void setup() {
  Serial.begin(115200);
  pinMode(LED_RED, OUTPUT);
  initCounter();
}

void loop() 
{  
  readCounter();
 // digitalToggle(LED_RED);
 // delay(1);
}

void readCounter()
{
  static int counts;
  NRF_TIMER2->TASKS_CAPTURE[0] = 1;
  counts = NRF_TIMER2->CC[0];
unsigned long counts1 = micros();
unsigned long counts2 = (counts - counts1);

  
  if (counts >0)  {
  //Serial.print("pulses: "); 
  //Serial.println(counts);
    Serial.println(counts1);
      Serial.println(counts2);
  counts1 =0;
  counts2 = 0;
  counts = 0;
 
  }
  
  
 NRF_TIMER2->TASKS_CLEAR = 1;                  
  NRF_TIMER2->TASKS_START = 1;
}

void initCounter()
{    
  NRF_P0->PIN_CNF[FREQ_MEASURE_PIN] = GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos |
                                      GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos |
                                      GPIO_PIN_CNF_PULL_Pulldown << GPIO_PIN_CNF_PULL_Pos |
                                      GPIO_PIN_CNF_SENSE_High << GPIO_PIN_CNF_SENSE_Pos;

  NRF_PPI->CHEN |= 1 << PPI_CHANNEL;
  NRF_PPI->CH[PPI_CHANNEL].EEP = (uint32_t)&NRF_GPIOTE->EVENTS_IN[PPI_CHANNEL];
  NRF_PPI->CH[PPI_CHANNEL].TEP = (uint32_t)&NRF_TIMER2->TASKS_COUNT;

  NRF_GPIOTE->CONFIG[PPI_CHANNEL] = GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos |
                                    FREQ_MEASURE_PIN << GPIOTE_CONFIG_PSEL_Pos |
                                    GPIOTE_CONFIG_POLARITY_LoToHi << GPIOTE_CONFIG_POLARITY_Pos; 

  NRF_TIMER2->TASKS_STOP = 1;   
  NRF_TIMER2->TASKS_CLEAR = 1;
  NRF_TIMER2->MODE = TIMER_MODE_MODE_LowPowerCounter << TIMER_MODE_MODE_Pos;
  NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_32Bit << TIMER_BITMODE_BITMODE_Pos;
  NRF_TIMER2->TASKS_START = 1;
}

Related