Jump to content
43oh

CC3200 Energia ADC timer/timestamp


Recommended Posts

Hi,

 

I am trying to get the ADC sample timestamp on Energia, but I can not figure it out how it works. 

 

From the TI API I know that the ADC data saved on the register is made by two parts.

  • bits [13:0] : ADC sample

  • bits [31:14]: time stamp per ADC sample


 

So I took the Energia library. From <driverlib/adc.h> and I found a method that returns only the time stamp.

//*****************************************************************************
//
//! Gets the current value of ADC internal timer
//!
//! \param ulBase is the base address of the ADC
//!
//! This function the current value of 17-bit ADC internal timer
//!
//! \returns Return the current value of ADC internal timer.
//
//*****************************************************************************
unsigned long ADCTimerValueGet(unsigned long ulBase)
{
  return(HWREG(ulBase + ADC_O_adc_timer_current_count));
}

So I have modified the wiring_analog.c library:

uint16_t analogRead(uint8_t pin)
{
    uint16_t channel, val;
    uint16_t pinNum = digitalPinToPinNum(pin);

    switch(pinNum) {
        case PIN_57: {channel = ADC_CH_0;}break;
        case PIN_58: {channel = ADC_CH_1;}break;
        case PIN_59: {channel = ADC_CH_2;}break;
        case PIN_60: {channel = ADC_CH_3;}break;
        default: return 0;
    }

    while(ADCFIFOLvlGet(ADC_BASE, channel)) { // flush the channel's FIFO if not empty
        ADCFIFORead(ADC_BASE, channel);
    }

    PinTypeADC(pinNum,0xFF);
    ADCChannelEnable(ADC_BASE, channel);
    ADCTimerConfig(ADC_BASE,2^17);
    ADCTimerEnable(ADC_BASE);
    ADCEnable(ADC_BASE);
    


    while(!ADCFIFOLvlGet(ADC_BASE, channel));
    val = ADCFIFORead(ADC_BASE, channel) & 0x3FFF;

    // ***** TIME STAMP FIELD ****

    timestamp = ADCTimerValueGet(ADC_BASE);

    // ***** TIME STAMP FIELD ****

    ADCDisable(ADC_BASE);
    ADCChannelDisable(ADC_BASE, channel);
    ADCTimerDisable(ADC_BASE);

    val = val >> 2;
    return val;
}

// Return the ADC sample time stamp
unsigned long ADCGetTime()
{
	return timestamp;
}

And this is my test sketch 

#include <wiring_analog.c>
 

int sensorPin = 2;    // select the input pin for the potentiometer
uint16_t long sensorValue[5] = {0};  // variable to store the value coming from the sensor
unsigned long time[5] = {0};

unsigned long m = 0;
unsigned int seconds = 0;
unsigned int minutes = 0;
unsigned int hours = 0;

void setup() 
{
  Serial.begin(115200);
}

void loop() {
  // read the value from the sensor:
  
  for (int i = 0; i< 5; i++)
  {
    sensorValue [i] = analogRead(sensorPin);
    time[i] = ADCGetTime();
    
    delay(1);
  }
  
  for(int i = 0; i < 5; i++)
  {
    
    minutes = ( time[i] / 1000 / 60);
    seconds = ( time[i] / 1000) % 60;
    m = ( time[i] % 100);
    
    Serial.println("ADC VALUE: ");
    Serial.print(sensorValue[i]);
    
    Serial.print(" --- TIME STAMP: ");
    Serial.print(minutes);
    Serial.print(":");
    Serial.print(seconds);
    Serial.print(":");
    Serial.println(m);
    
    Serial.print("\n");
  }
  
  delay(5000); 
}

The problem is that the value of the variable time do not change. It's always the same.

 

What is wrong with my test sketch? How can I access to the time stamp of my samples?

 

Thank you in advance.

 

 

Link to post
Share on other sites

We discovered a bug in the analogRead() code just after you posted this. 2^17 in ADCTimerConfig(ADC_BASE, 2^17) is wrong. This value is the roll over value and can be max 2^17. In C however 2^17 is the bit-wise XOR and not power. So this should have been ADCTimerConfig(ADC_BASE, 131072) to set it at the max rollover value. Not sure if this fixes your issue but it's worth a try.

 

Robert

Link to post
Share on other sites

We discovered a bug in the analogRead() code just after you posted this. 2^17 in ADCTimerConfig(ADC_BASE, 2^17) is wrong. This value is the roll over value and can be max 2^17. In C however 2^17 is the bit-wise XOR and not power. So this should have been ADCTimerConfig(ADC_BASE, 131072) to set it at the max rollover value. Not sure if this fixes your issue but it's worth a try.

 

Robert

 

Hi,

I have tried as suggested, but the problem persist.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...