打印
[方案相关]

小华ADC+NTC温度测量

[复制链接]
362|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AD, ADC, NTC, dc, tc
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℃范围内。

23002657832f23c94a.png (127.68 KB )

23002657832f23c94a.png

9764865783477d3b0e.png (7.92 KB )

9764865783477d3b0e.png

使用特权

评论回复
沙发
tpgf| | 2024-1-5 12:10 | 只看该作者
ntc电阻是那种阻值变动特别大的温度传感器吗

使用特权

评论回复
板凳
aoyi| | 2024-1-5 13:24 | 只看该作者
5度为跨度的话 精度是不是相差很多

使用特权

评论回复
地板
tfqi| | 2024-1-5 21:29 | 只看该作者
adc在采集前是不是应该做一下自校准啊

使用特权

评论回复
5
gwsan| | 2024-1-5 22:00 | 只看该作者
温度采集本来就相对来说 滞后,查表的话 跨度还这么大

使用特权

评论回复
6
zljiu| | 2024-1-5 22:31 | 只看该作者
ntc温度传感器是不是也分好多种类呢

使用特权

评论回复
7
nawu| | 2024-1-5 23:12 | 只看该作者
这个阻值和温度的转换关系有算法吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

81

帖子

0

粉丝