大家好、我使用示例代码来读取内部温度、但得到的结果是荒谬的。 以摄氏度为单位的稳态温度为55C (应为~室温)。 芯片发热会导致摄氏度不上升、这是我无法解释的、尤其是当原始 ADC 值不断增加时。
我正在使用的代码来自 Resource Explorer、并在下面重复使用。
问题- #define CALADC_15V_30C (0x1A1A)和 #define CALADC_15V_85C (0x1A1C)的存储器地址值是否正确? 数据表中没有完全像写入的那些值、 我想这些值是 CAL_ADC_15T30和 CAL_ADC_15T85、它们的存储器偏移地址为0x8和0xB。
提前感谢。
理查德
/* --COPYRIGHT--,BSD_EX * Copyright (c) 2018, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************* * * MSP430 CODE EXAMPLE DISCLAIMER * * MSP430 code examples are self-contained low-level programs that typically * demonstrate a single peripheral function or device feature in a highly * concise manner. For this the code may rely on the device's power-on default * register values and settings such as the clock configuration and care must * be taken when combining code from several examples to avoid potential side * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware * for an API functional library-approach to peripheral configuration. * * --/COPYRIGHT--*/ //****************************************************************************** // MSP430FR235x Demo - ADC, Sample A12 Temp and Convert to oC and oF // // Description: This example works on Single-Channel Single-Conversion Mode. // A single sample is made on A12 (temperature) with reference to // internal 1.5V Vref. Software sets ADCSC to start sample and conversion // periodically // - ADCSC automatically cleared at EOC. ADC internal oscillator times // sample and conversion. In Mainloop MSP430 waits in LPM3 to save power until // ADC conversion complete, ADC12_ISR will convert the result to oC and oF // // ACLK = default REFO ~32768Hz, MCLK = SMCLK = default DCODIV ~1MHz. // // Uncalibrated temperature measured from device to device will vary due to // slope and offset variance from device to device - please see datasheet. // // This code example show how to use the TLV calibrated data to measure temperature. // This code example is for industrial temperature device which operating temperature range is -40oC ~ +85oC. // For extended temperature device (-40oC ~ +105oC), ADC calibration result is for 105oC - please see datasheet. // // MSP430FR2355 // ----------------- // /|\| | // | | | // --|RST | // | | // >---|A12(temp) | // // // Winter Yu // Texas Instruments Inc. // April. 2018 // Built with IAR Embedded Workbench v7.10 & Code Composer Studio v7.2 //****************************************************************************** #include <msp430.h> #define CALADC_15V_30C *((unsigned int *)0x1A1A) // Temperature Sensor Calibration-30 C // See device datasheet for TLV table memory mapping #define CALADC_15V_85C *((unsigned int *)0x1A1C) // Temperature Sensor Calibration-High Temperature (85 for Industrial, 105 for Extended) int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop WDT TB0CCTL0 |= CCIE; // TBCCR0 interrupt enabled TB0CCR0 = 65535; TB0CTL = TBSSEL__ACLK | MC__UP; // ACLK, UP mode // Configure ADC - Pulse sample mode; ADCSC trigger ADCCTL0 |= ADCSHT_8 | ADCON; // ADC ON,temperature sample period>30us ADCCTL1 |= ADCSHP; // s/w trig, single ch/conv, MODOSC ADCCTL2 &= ~ADCRES; // clear ADCRES in ADCCTL ADCCTL2 |= ADCRES_2; // 12-bit conversion results ADCMCTL0 |= ADCSREF_1 | ADCINCH_12; // ADC input ch A12 => temp sense ADCIE |=ADCIE0; // Enable the Interrupt request for a completed ADC_B conversion // Configure reference PMMCTL0_H = PMMPW_H; // Unlock the PMM registers PMMCTL2 |= INTREFEN | TSENSOREN; // Enable internal reference and temperature sensor __delay_cycles(400); // Delay for reference settling __bis_SR_register(LPM0_bits | GIE); // LPM0 with interrupts enabled __no_operation(); // Only for debugger } // ADC interrupt service routine #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=ADC_VECTOR __interrupt void ADC_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(ADC_VECTOR))) ADC_ISR (void) #else #error Compiler not supported! #endif { volatile float temp; volatile float IntDegF; volatile float IntDegC; switch(__even_in_range(ADCIV,ADCIV_ADCIFG)) { case ADCIV_NONE: break; case ADCIV_ADCOVIFG: break; case ADCIV_ADCTOVIFG: break; case ADCIV_ADCHIIFG: break; case ADCIV_ADCLOIFG: break; case ADCIV_ADCINIFG: break; case ADCIV_ADCIFG: temp = ADCMEM0; // Temperature in Celsius // The temperature (Temp, C)= IntDegC = (temp-CALADC_15V_30C)*(85-30)/(CALADC_15V_85C-CALADC_15V_30C)+30; // Temperature in Fahrenheit // Tf = (9/5)*Tc | 32 IntDegF = 9*IntDegC/5+32; //__bic_SR_register_on_exit(LPM3_bits); // Exit LPM3 break; default: break; } } // Timer B0 interrupt service routine #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector = TIMER0_B0_VECTOR __interrupt void Timer_B (void) #elif defined(__GNUC__) void __attribute__ ((interrupt(TIMER0_B0_VECTOR))) Timer_B (void) #else #error Compiler not supported! #endif { ADCCTL0 |= ADCENC | ADCSC; // Sampling and conversion start }