NTC电阻是一种低成本的温度传感器,在很多方案中都有广泛的使用。 本文分享本人使用过程中的一些经验方法, 使用小华L196芯片的ADC外设+ NTC电阻实现的一种温度检测方法。
此方法有以下特点: 1、 不需要高精度基准电压。 2、 采样结果自动累加,可以减少MCU的一些工作量,方便做平均,采样值比较稳定。 3、 具有温度区间细化功能,提高温度结果的精度,实际进行高低温测试,结果与TI的高精度温度传感器(TMP117)的误差在1℃以内。
硬件设计: 硬件设计比较简单,NTC测温核心电路可以简化为如下电路,电阻分压之后直接接入芯片的ADC引脚,测量分压即可计算出当前电阻,并进一步计算出温度。
软件设计: 1、 ADC配置 本次采样点连接到通道ADCCH11。 小华ADC外设支持单通道重复采集,并可以将采集结果进行累加。 所以本次代码中,将ADC配置为顺序扫描,扫描数为8,将ADCCH11连续转换8次,并将结结果自动累加。 如下代码 voidApp_AdcInit(void) { stc_adc_cfg_t stcAdcCfg; DDL_ZERO_STRUCT(stcAdcCfg); ///< 开启ADC/BGR外设时钟 Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE); Bgr_BgrEnable(); ///< 开启BGR ///< ADC 初始化配置 stcAdcCfg.enAdcMode = AdcScanMode; ///<采样模式 多通道采样 stcAdcCfg.enAdcClkDiv = AdcMskClkDiv1; ///<采样分频-1 stcAdcCfg.enAdcSampCycleSel =AdcMskSampCycle8Clk; ///<采样周期数8 stcAdcCfg.enAdcRefVolSel=AdcMskRefVolSelAVDD; ///<参考电压选择 外部AVDD stcAdcCfg.enAdcOpBuf =AdcMskBufDisable; ///<OP BUF配置-关 stcAdcCfg.enInRef =AdcMskInRefDisable; ///<内部参考电压使能-关 stcAdcCfg.enAdcAlign = AdcAlignRight; ///<转换结果对齐方式-右 Adc_Init(&stcAdcCfg); } ///< ADC 采样模式 配置 voidApp_AdcSglCfg(void) {
stc_adc_sqr_cfg_t stcAdcSqrCfg; DDL_ZERO_STRUCT(stcAdcSqrCfg); ///< 顺序扫描模式功能及通道配置 stcAdcSqrCfg.bSqrDmaTrig = FALSE; stcAdcSqrCfg.enResultAcc =AdcResultAccEnable; stcAdcSqrCfg.u8SqrCnt = 8; Adc_SqrModeCfg(&stcAdcSqrCfg); Adc_CfgSqrChannel(AdcSQRCH0MUX,AdcExInputCH11); Adc_CfgSqrChannel(AdcSQRCH1MUX,AdcExInputCH11); Adc_CfgSqrChannel(AdcSQRCH2MUX,AdcExInputCH11); Adc_CfgSqrChannel(AdcSQRCH3MUX,AdcExInputCH11); Adc_CfgSqrChannel(AdcSQRCH4MUX,AdcExInputCH11); Adc_CfgSqrChannel(AdcSQRCH5MUX,AdcExInputCH11); Adc_CfgSqrChannel(AdcSQRCH6MUX,AdcExInputCH11); Adc_CfgSqrChannel(AdcSQRCH7MUX,AdcExInputCH11); }
2、 获取NTC当前阻值 在ADC采样之后,就会获得当前的ADC的值。 当前ADC的值可以根据参考电压转换成实际电压值,如果参考电压不稳或者参考电压存在一致性不好的问题,那ADC抓换出的电压值也会存在误差,因此常规做法必须要有一个稳定的电压参考源。 但实际上,我们最终的目的是要得到NTC的电阻,我们在计算过程中把参考电压消除掉,就可以不去关心参考电压的精度。
假设分压后的电压为V0,ADC采样后的值为V_adc,12位ADC满量程值为0XFFF。 则根据电路我们得到以下关系 10K / R_NTC = (0XFFF– V_adc) / V_adc; 因此 R_NTC = 10k *V_adc / (0XFFF – V_adc) 可以看出NTC的阻值,只跟ADC采样值以及标准10K相关,与基准电压无关。 代码如下,传入参数为AD采集值,返回对应的NTC电阻值。 uint16_tGet_NTC_Res(uint16_t NTC_ADC) { uint16_t NTC_Res = 0; NTC_Res = 10000 * NTC_ADC / (0xfff -NTC_ADC); return NTC_Res; }
3、根据NTC阻值获取温度 NTC电阻采用NCP18XH103F03RB,其阻值与温度的对应关系并不是线性的,如下图所示 NTC厂家会给出具体的阻值表,以5度为一个跨度,如下图 实际代码中,为简化计算,认为每5度的区间内,NTC的温度阻值关系是线性的。 因此代码需要做两个步骤,一是确认当前阻值落在哪个温度区间,二是计算当前区间内的具体温度。 对于第一步区间查找,本例采用二分法查表
最终获取NTC温度的代码如下
以上就是使用小华ADC和NTC电阻采样温度的方法, 需要注意硬件中使用的10K标准电阻要使用1%精度的电阻,实测可以较为准确的测量环境温度,误差在1℃范围内。
|