Hi,
We enabled internal temperature by seeing an example, but we are not getting expected readings.
To enable this TS, we have used TLV calibration points of 2.5V ref. ADC init section is attached for reference.
void AdcInit(void){
ADC12_B_initParam FsiAdc;
ADC12_B_configureMemoryParam CMOLG;
ADC12_B_configureMemoryParam VDO;
ADC12_B_configureMemoryParam TempSensor;
DMA_initParam AdcDMA;
FsiAdc.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;
FsiAdc.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;
FsiAdc.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC;
FsiAdc.internalChannelMap = ADC12_B_TEMPSENSEMAP;//ADC12_B_NOINTCH;
FsiAdc.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;
ADC12_B_init(ADC12_B_BASE,&FsiAdc);
ADC12_B_enable(ADC12_B_BASE);
ADC12_B_setupSamplingTimer(ADC12_B_BASE,
ADC12_B_CYCLEHOLD_64_CYCLES,
ADC12_B_CYCLEHOLD_4_CYCLES,
ADC12_B_MULTIPLESAMPLESENABLE);
ADC12_B_setResolution(ADC12_B_BASE,
ADC12_B_RESOLUTION_12BIT);
CMOLG.differentialModeSelect = ADC12_B_DIFFERENTIAL_MODE_DISABLE;
CMOLG.endOfSequence = ADC12_B_NOTENDOFSEQUENCE;
CMOLG.inputSourceSelect = ADC12_B_INPUT_A13;
CMOLG.memoryBufferControlIndex = ADC12_B_MEMORY_0;
CMOLG.refVoltageSourceSelect = ADC12_B_VREFPOS_EXTPOS_VREFNEG_EXTNEG;
CMOLG.windowComparatorSelect = ADC12_B_WINDOW_COMPARATOR_DISABLE;
ADC12_B_configureMemory(ADC12_B_BASE,
&CMOLG);
VDO.differentialModeSelect = ADC12_B_DIFFERENTIAL_MODE_DISABLE;
VDO.endOfSequence = ADC12_B_NOTENDOFSEQUENCE;//ADC12_B_ENDOFSEQUENCE;
VDO.inputSourceSelect = ADC12_B_INPUT_A14;
VDO.memoryBufferControlIndex = ADC12_B_MEMORY_1;
VDO.refVoltageSourceSelect = ADC12_B_VREFPOS_EXTPOS_VREFNEG_EXTNEG;
VDO.windowComparatorSelect = ADC12_B_WINDOW_COMPARATOR_DISABLE;
ADC12_B_configureMemory(ADC12_B_BASE,
&VDO);
TempSensor.differentialModeSelect = ADC12_B_DIFFERENTIAL_MODE_DISABLE;
TempSensor.endOfSequence = ADC12_B_ENDOFSEQUENCE;
TempSensor.inputSourceSelect = ADC12_B_INPUT_TCMAP;
TempSensor.memoryBufferControlIndex = ADC12_B_MEMORY_2;
TempSensor.refVoltageSourceSelect = ADC12_B_VREFPOS_EXTPOS_VREFNEG_EXTNEG;
TempSensor.windowComparatorSelect = ADC12_B_WINDOW_COMPARATOR_DISABLE;
ADC12_B_configureMemory(ADC12_B_BASE,
&TempSensor);
// while(REFCTL0 & REFGENBUSY); // If ref generator busy, WAIT
// REFCTL0 |= REFVSEL_2 + REFON; // Enable i nternal 1.2V reference
// while(!(REFCTL0 & REFGENRDY));
// while(Ref_A_isRefGenBusy (REF_A_BASE));
Ref_A_enableReferenceVoltage (REF_A_BASE);
// Ref_A_setReferenceVoltage (REF_A_BASE,REFVSEL_2);
Ref_A_enableTempSensor(REF_A_BASE);
// Ref_A_disableTempSensor(REF_A_BASE);
// Ref_A_disableReferenceVoltage(REF_A_BASE);
AdcDMA.channelSelect = DMA_CHANNEL_2;
AdcDMA.transferModeSelect = DMA_TRANSFER_REPEATED_BLOCK;
AdcDMA.transferSize = 3;
AdcDMA.transferUnitSelect = DMA_SIZE_SRCWORD_DSTWORD;
AdcDMA.triggerSourceSelect = DMA_TRIGGERSOURCE_26;
AdcDMA.triggerTypeSelect = DMA_TRIGGER_RISINGEDGE;
DMA_init(&AdcDMA);
DMA_setSrcAddress(DMA_CHANNEL_2,
(uint32_t) &ADC12MEM0,
DMA_DIRECTION_INCREMENT);
DMA_setDstAddress(DMA_CHANNEL_2,
(uint32_t) AdcRawCounts,
DMA_DIRECTION_INCREMENT);
DMA_disableTransferDuringReadModifyWrite();
DMA_enableRoundRobinPriority();
DMA_enableInterrupt(DMA_CHANNEL_2);
DMA_enableTransfers(DMA_CHANNEL_2);
DMA_startTransfer(DMA_CHANNEL_2);
}
Our object is to achieve correct reading in -10 to -40 C.
Reading taken in chamber on 5 devices.
| Temperature | Device1 | Device2 | Device3 | Device4 | Device5 |
| -10 | 0.95 | -4.1 | -3.97 | -2.36 | -3 |
| -20 | -9.53 | -15.3 | -15.37 | -13.06 | -13 |
| -25 | -14.29 | -20.28 | -20.7 | -18.04 | -18 |
| -30 | -18.58 | -25 | -25 | -22.52 | -23 |
| -35 | -22.62 | -29.24 | -29.82 | -26.75 | -27 |
| -40 | -26.2 | -33.47 | -33.88 | -30.98 | -31 |