我正在使用DriverLib ADC14示例,它测量我正在使用新的红色Launchpad的芯片内部温度:
/*******************************************************************************
* MSP432 ADC14 -单通道重复温度传感器
*
*说明:此示例显示了内部温度传感器的使用。
*使用软件触发器设置简单的连续ADC采样/转换。
*采样时间设置为TBD,如用户指南所示。 所有计算
*都在ISR中进行,ISR利用FPU的堆叠模式。
*温度以摄氏度和华氏度为单位计算。
*
** MSP432P401
* -----------
* /|\\| |
* || |
* --|RST 5.5 |
* | |
* | |
* | |
*
*作者:Timothy Logan
****************************************************************************** /*
DriverLib包括*/
#include "driverlib.h"
/*标准包括*/
#include <stdint.h>
#include <string.h>
volatile float tempC;
volatile float F;
int main(void){
/*正在停止WDT */
WDT_A_HoldTimer();
interrup_enableSleepOnIsrExit();
/*启用FPU并启用堆栈(用于ISR)*/
FPU_enableModule();
FPU_enableLazyStacking();
/*在温度传感器已布设的情况下初始化ADC (MCLK/1/1)*/
ADC14_enableModule();
ADC14_INITModule (ADC_CLOCKSOURCE_MCLK,ADC_PREDIVIDER_1,ADC_DIVIDER_1,
ADC_TEMPSENSEMAP);
/*重复配置ADC内存(ADC_MEM0 A22 (温度传感器)
*模式)。
*/
ADC14_configureSingleSampleMode (ADC_MEM0,TRUE);
ADC14_configureConversionMemory (ADC_MEM0,ADC_VREFPOS_AVCC_VREFNEG_VSS,
ADC_INPUT_A22,FALSE);
/*为TBD */配置采样/保持时间
ADC14_setSampleHoldTime (ADC_PULSE_WIDES_192,ADC_PULSE_WIDES_192);
/*在自动迭代模式下启用采样计时器并中断*/
ADC14_enableSampleTimer(ADC_AUTOMATICATE_IREDATE);
ADC14_enableInterrupt (ADC_INT0);
/*将参考电压设置为2.5 并启用温度传感器*/
ref_a_setReferenceVoltage (REF_A_VREF2_5V);
ref_a_enableReferenceVoltage();
ref_a_enableTempSensor();
/*启用中断*/
interrupT_enableInterrupt (INT_ADC14);
interrup_enableMaster();
/*触发样本开始*/
ADC14_enableConversion();
ADC14_toggleConversionTrigger();
/*进入睡眠状态*/
同时(1)
{
PCM_gotoLPM0();
}
}/*
每次转换完成时都会发生此中断。 由于FPU
*在堆栈模式下启用,我们能够安全地使用FPU来执行
*高效的浮点运算。*/
void ADC14_IRQHandler(void){
UINT64_t状态;
uINT32_t cal30,cal85;
状态= ADC14_getEnabledInterruptStatus();
ADC14_clearInterruptFlag (状态);
IF (状态和ADC_INT0)
{
cal30 = sysctl_getTempCalibrationConstant (sysctl_2_5V_REF,
sysctl_30_degrees_C);
cal85 = sysctl_getTempCalibrationConstant (sysctl_2_5V_REF,
sysctl_85_degrees_C);
tempC =(float)(((UINT32_t) ADC14_getResult (ADC_MEM0)- cal30)*(85 - 30))
/(cal85 - cal30)+ 30.0f;
tempF = tempC * 9.0f / 5.0f + 32.0f;
}
}
运行时,cal30 = 4702,cal85 = 5401,我的ADC读数约为3500。
首先:
如果有人测量的温度低于30 C,我认为您应该对所有int变量进行签名。 当我测量到一个巨大的温度时,我真的很困惑。 8^)
但是,即使在我修复后,我仍测量了大约-60C,这显然是不正确的。 我做错了什么?