Hi there,
I can init a adc channel as following
ADC16_GetDefaultConfig(&adc16ConfigStruct);
ADC16_Init(DEMO_ADC16_BASE, &adc16ConfigStruct);
ADC16_EnableHardwareTrigger(DEMO_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(DEMO_ADC16_BASE))
{
PRINTF("ADC16_DoAutoCalibration() Done.\r\n");
}
else
{
PRINTF("ADC16_DoAutoCalibration() Failed.\r\n");
}
#endif /* FSL_FEATURE_ADC16_HAS_CALIBRATION */
adc16ChannelConfigStruct.channelNumber = DEMO_ADC16_USER_CHANNEL;
adc16ChannelConfigStruct.enableInterruptOnConversionCompleted = false;
#if defined(FSL_FEATURE_ADC16_HAS_DIFF_MODE) && FSL_FEATURE_ADC16_HAS_DIFF_MODE
adc16ChannelConfigStruct.enableDifferentialConversion = false;
#endif /* FSL_FEATURE_ADC16_HAS_DIFF_MODE */
#define DEMO_ADC16_USER_CHANNEL 8U
typedef struct _adc16_channel_config
{
uint32_t channelNumber;
bool enableInterruptOnConversionCompleted;
#if defined(FSL_FEATURE_ADC16_HAS_DIFF_MODE) && FSL_FEATURE_ADC16_HAS_DIFF_MODE
bool enableDifferentialConversion; /
#endif /* FSL_FEATURE_ADC16_HAS_DIFF_MODE */
} adc16_channel_config_t;
void ADC16_SetChannelConfig(ADC_Type *base, uint32_t channelGroup, const adc16_channel_config_t *config)
{
assert(channelGroup < ADC_SC1_COUNT);
assert(NULL != config);
uint32_t sc1 = ADC_SC1_ADCH(config->channelNumber); /* Set the channel number. */
#if defined(FSL_FEATURE_ADC16_HAS_DIFF_MODE) && FSL_FEATURE_ADC16_HAS_DIFF_MODE
if (config->enableDifferentialConversion)
{
sc1 |= ADC_SC1_DIFF_MASK;
}
#endif /* FSL_FEATURE_ADC16_HAS_DIFF_MODE */
if (config->enableInterruptOnConversionCompleted)
{
sc1 |= ADC_SC1_AIEN_MASK;
}
base->SC1[channelGroup] = sc1;
}
But how to Init and using the temp sensor, also how to init and using the DADP & DADM as normal ADC pin
Thanks in advance!
-Jack
Hi, Jack,
This is my opinion. You can use both single-ended mode(DIFF bit is cleared) and differential mode(DIFF bit is set) to measure the temperature sensor, but the formula is slight different.
You do not list the part number, I assume that you use K64, Pls refer to Table 30. 16-bit ADC characteristics (VREFH = VDDA, VREFL = VSSA) (continued) in data sheet of K64.
The temperature slope m is 1.62/C typically, the temperature voltage in 25 degree Vtemp25 is 716mV typically.
The temperature Temp=Vtemp-Vtemp25/m.
If you use single-ended mode with DIFF bit cleared, you can use the formula to compute the voltage from digital sample in 16 bits mode.
Vtemp=sample*3.3V/65535.
If you use differential mode with DIFF bit set, you can use the formula to compute the voltage
Vtemp=sample*3.3V/32768.
per data sheet requirement, the ADC conversion clock should be less than 3 MHz.
Furthermore, the an3031 is helpful.
http://cache.nxp.com/files/microcontrollers/doc/app_note/AN3031.pdf?fsrch=1&sr=1&pageNum=1
Hope it can help you.
BR
XiangJun Rong
Hi XiangJun.Rong
Thanks for your quick answer and advice.
I have read the an3031, and refers to many details about the temp sensor, but i can not figure out how to connect the temper sensor with the single-ended or differential mode ADC channel. if temper sensor using differential mode channel, then how to differ DADP and DADM, also how to figure out the channel, just like following
adc16ChannelConfigStruct.channelNumber = DEMO_ADC16_USER_CHANNEL;
#define DEMO_ADC16_USER_CHANNEL 8U
Thanks in advance!
-Jack
Hi, Jack,
The temperature sensor is "a P-N transistor junction with temperature dependent properties acting as an
embedded temperature sensor", the temperature sensor is embeded in the processor internally, you do not need select pin assignment, you just need select channel 26, the DIFF bit can be either set or cleared, it is okay.
Hope it can help you.
BR
Xiangjun Rong
Hi xiangjun.rong,
Got it, channel 26! temp sensor! and i'll take a try tomorrow, ^_^, Thanks!
-Jack