Switching between channels on an ADC

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

Switching between channels on an ADC

Jump to solution
2,733 Views
umlengineer
Contributor I

I am sampling data on channels ADC0_SE4A and ADC0_SE0 and I am able to sample on the channels independently everything works great, but when I sample one channel and then another the second channel always returns incorrect values, usually 65XXX or something like 4.  I thought that I had read somewhere that this is caused by an issue with switching between channels, so the fix was to sample only the same channel type.  I want to make sure this is the case before I do a board respin.  The microcontroller I am using is:     MKL17Z64VDA4

Thanks in advance for your help!

0 Kudos
Reply
1 Solution
2,540 Views
diego_charles
NXP TechSupport
NXP TechSupport

Hello, umlengineer

I´m glad that you found out about the issue.  It's a  pleasure to help. Now I suggest you to marc the question as assumed if you don't have further issues. 

Best regards Diego. 

View solution in original post

0 Kudos
Reply
11 Replies
2,540 Views
diego_charles
NXP TechSupport
NXP TechSupport

Hello, Evan

After taking a look at your code, even though  I don´t know the order of your procedures, I could not find something wrong with your configuration parameters. Thanks for showing me your code and the MUXSEL selection bit also I´ve noticed that you even used the function ADC16_SetChannelMuxMode(). 

I did a test by my side and I was able to sample successfully with both channels ADC_SE0 and ADC_SE4B.

I´ll contact you by email to provide you my main application code for your personal test in order to help you further. 


Have a great day,
Diego

-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!

 

- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------

0 Kudos
Reply
2,540 Views
umlengineer
Contributor I

Hi,

I have received the code, and will read it and run it Monday.

Thanks for the code and the help!

0 Kudos
Reply
2,540 Views
diego_charles
NXP TechSupport
NXP TechSupport

Hello, Evan 

Thank you, after that please let us know your results!


Have a great day,
Diego

-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!

- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------

0 Kudos
Reply
2,540 Views
umlengineer
Contributor I

Hey,

I think I found the issues.  My guess is multiplexing was part of the issue, but the main thing I found, was that I had incorrectly scoped the ADC_config variable.  I made an init function that I called at the top, but the ADC_config was scoped to the function.  In someways its interesting it worked at all.  Once I correctly scoped the variable, put in the muxing code and explicitly set some channel settings to be sure, it looked like everything was working.  I will have to stress it a bit but it looks good.

Thanks to you and Mark for your time, it was super helpful.

0 Kudos
Reply
2,541 Views
diego_charles
NXP TechSupport
NXP TechSupport

Hello, umlengineer

I´m glad that you found out about the issue.  It's a  pleasure to help. Now I suggest you to marc the question as assumed if you don't have further issues. 

Best regards Diego. 

0 Kudos
Reply
2,540 Views
diego_charles
NXP TechSupport
NXP TechSupport

Hello, Evan

I'm working on your question, as soon as I have useful information I'll let you know. 


Have a great day,
Diego

-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!

- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------

0 Kudos
Reply
2,540 Views
umlengineer
Contributor I

Hi,

Thank you for the help.  Is this related to muxing the ADCs at all?  I know you have to select A or B, but I am unsure on an unlabeled one.

Thanks again!

0 Kudos
Reply
2,540 Views
diego_charles
NXP TechSupport
NXP TechSupport

Hello Evan, 

The muxing of ADC channels have to be done by the user,  so maybe you are facing a problem with your channel muxing technique, without taking a look at it to me is difficult to tell where the error is. 

Your statement on channels of set A and B is correct, there is a bit called MUXSEL from  ADCx_CFG2 register. that allows selecting between alternate sets of ADC channels.

About the unlabeled channels, I´ll refer to  Marek Neuzil's answer in the thread 

kl25z ADC muxing problem. You must select unlabeled channels with one set (set A or set B).

For example, select:

  • ADC0_SE0
  • ADC0_SE4a
  • ADC0_SE7a
  • ADC0_SE6a

or 

  • ADC0_SE0
  • ADC0_SE4b
  • ADC0_SE7b
  • ADC0_SE6b

Have a great day,
Diego

-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!

- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------

0 Kudos
Reply
2,540 Views
umlengineer
Contributor I

Hi,

So I think I have the muxing set, and I am still seeing the issue.  I am sure I am missing something, I am jsut not sure what.

Thanks for all the help, and please see below.

The documentation says that setting it to 0 selects A:

pastedImage_2.png

And when I look at the MuxSel register value I see that it is 0. 

pastedImage_1.png

My ADC init code is as follows:

uint8_t InitializeADC(spi_transfer_t *xfer)
{
    adc16_config_t adc16ConfigStruct;
    ADC16_GetDefaultConfig(&adc16ConfigStruct);


#ifdef BOARD_ADC_USE_ALT_VREF
    adc16ConfigStruct.referenceVoltageSource = kADC16_ReferenceVoltageSourceValt;
#endif
    ADC16_Init(ADC16_BASE, &adc16ConfigStruct);
    ADC16_EnableHardwareTrigger(ADC16_BASE, false); // Make sure the software trigger is used.


    #if defined(FSL_FEATURE_ADC16_HAS_CALIBRATION) && FSL_FEATURE_ADC16_HAS_CALIBRATION
        if (kStatus_Success != ADC16_DoAutoCalibration(ADC16_BASE))
        {
            return ADC_AUTO_CAL_FAILURE;
        }
    #endif /* FSL_FEATURE_ADC16_HAS_CALIBRATION */

    ADC16_SetChannelMuxMode(ADC16_BASE, kADC16_ChannelMuxA);

    return 0;
}

And my ADC read code is: 

Helpful Defines:

#define ADC16_BASE ADC0
#define ADC16_CHANNEL_GROUP 0U
#define ADC16_CHANNEL_TOP 4U
#define ADC16_CHANNEL_BOTTOM 0U

Channel 4a:

                adc16ChannelConfigStruct.channelNumber = ADC16_CHANNEL_TOP;
                ADC16_SetChannelConfig(ADC16_BASE, ADC16_CHANNEL_GROUP, &adc16ChannelConfigStruct);
                while (0U == (kADC16_ChannelConversionDoneFlag & ADC16_GetChannelStatusFlags(ADC16_BASE,                         ADC16_CHANNEL_GROUP)))
                {}
                counts = ADC16_GetChannelConversionValue(ADC16_BASE, ADC16_CHANNEL_GROUP);

Channel 0:

            adc16ChannelConfigStruct.channelNumber = ADC16_CHANNEL_BOTTOM;
                ADC16_SetChannelConfig(ADC16_BASE, ADC16_CHANNEL_GROUP, &adc16ChannelConfigStruct);
                while (0U == (kADC16_ChannelConversionDoneFlag & ADC16_GetChannelStatusFlags(ADC16_BASE,                         ADC16_CHANNEL_GROUP)))
                {}
                counts = ADC16_GetChannelConversionValue(ADC16_BASE, ADC16_CHANNEL_GROUP);

0 Kudos
Reply
2,540 Views
mjbcswitzerland
Specialist V

Hi Evan

See appendix D of the following for a discussion of ADC muxing details that sometimes catch people out>
https://www.utasker.com/docs/uTasker/uTaskerADC.pdf

Regards

Mark
[uTasker project developer for Kinetis and i.MX RT]

0 Kudos
Reply
2,540 Views
umlengineer
Contributor I

Thanks for this, I will take a peak tomorrow, 22 pages is not a lot, but it can be at 930pm on a Sunday.

Thanks for the document!

0 Kudos
Reply