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!
Solved! Go to Solution.
 diego_charles
		
			diego_charles
		
		
		
		
		
		
		
		
	
			
		
		
			
					
		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.
 diego_charles
		
			diego_charles
		
		
		
		
		
		
		
		
	
			
		
		
			
					
		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.
-------------------------------------------------------------------------------
Hi,
I have received the code, and will read it and run it Monday.
Thanks for the code and the help!
 diego_charles
		
			diego_charles
		
		
		
		
		
		
		
		
	
			
		
		
			
					
		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.
-------------------------------------------------------------------------------
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.
 diego_charles
		
			diego_charles
		
		
		
		
		
		
		
		
	
			
		
		
			
					
		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.
 diego_charles
		
			diego_charles
		
		
		
		
		
		
		
		
	
			
		
		
			
					
		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.
-------------------------------------------------------------------------------
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!
 diego_charles
		
			diego_charles
		
		
		
		
		
		
		
		
	
			
		
		
			
					
		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.
-------------------------------------------------------------------------------
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:
And when I look at the MuxSel register value I see that it is 0.
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);
 
					
				
		
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]
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!
