• ch58x/ch59xADC差分采样NTC电阻获取当前温度


    前言:之前的文章中也有关于使用I2C器件进行温度的采集的文章

    采集温度的方式不止使用传感器,也可以使用NTC温敏电阻进行采集,此方法的外围电路较为简单切成本较低,代码也较为容易实现。

    实现原理:先通过差分采样电路进行采集,采集之后可以获取NTC或者定值电阻的电压;已知这些信息可以通过欧姆定律得到当前电路的电流,根据串联电路电流处处相等的特性可再通过欧姆定律获取当前NTC的阻值。(温度越高NTC阻值越小,温度越低NTC阻值越大)

    获取到了当前NTC的阻值可以通过查表得到一个粗略的温度,也可以通过公式获得当前的温度较为准确一些。

    NTC 热敏电阻温度计算公式:Rt = R*EXP(B(1/T1-1/T2))

    其中,T1和T2指的是K度,即开尔文温度。

    Rt 是热敏电阻在T1温度下的阻值。

    R是热敏电阻在T2常温下的标称阻值。100K的热敏电阻25℃的值为10K(即R=10K)。T2=(273.15+25)

    EXP是e的n次方

    通过此公式可以得到温度转换的公式:T1 =1/(ln(Rt/R)/B+1/T2)-273.15+0.5;

    这里+0.5的误差矫正。

    1、NTC电阻的选型:

    NTC实际的选型B值是一个很关键的参数,同时也要考虑自己的实际应用去选择合适阻值的电阻;笔者这里为了简便计算选择了10k的定值电阻与B值为3950的10k的NTC;

    硬件设计:

     2、代码实现:

    复制代码
    #include "CH59x_common.h"
    #include "math.h"
    uint16_t adcBuff[40];
    float sum=0;//多次采样和
    float averagevalue =0;//平均值
    volatile uint8_t adclen;
    volatile uint8_t DMA_end = 0;
    float basicvalue = 3.3;//输入电压
    float Difference=0;//压差
    float currentvalue=0;//电流
    float NTC=0;//NTC阻值
    float temp=0;//温度
    复制代码
    复制代码
    int main()
    {
    
        uint8_t      i; 
        SetSysClock(CLK_SOURCE_PLL_60MHz);
    
        /* 配置串口调试 */
        DebugInit();
        PRINT("Start @ChipID=%02X\n", R8_CHIP_ID);
        PRINT("\n4.Diff channel sampling...\n");
        GPIOA_ModeCfg(GPIO_Pin_4 | GPIO_Pin_12, GPIO_ModeIN_Floating);
        ADC_ExtDiffChSampInit(SampleFreq_3_2, ADC_PGA_1_4);
        ADC_ChannelCfg(0);
        R8_ADC_CFG|= RB_ADC_BUF_EN;
    
        while(1)
        {
            for(i = 0; i < 10; i++)
                    {
                        adcBuff[i] = ADC_ExcutSingleConver(); // 连续采样20次
                    }
                    for(i = 0; i < 10; i++)
                    {
                        PRINT("%d \n", adcBuff[i]);
                        sum+= adcBuff[i];
    
                    }
                    PRINT("sum %f\n",sum);
                    averagevalue = (((sum/10)/512)-4)*1.05;
    
                    PRINT("average:%f V\n", averagevalue);
    
                   Difference = basicvalue-averagevalue;
                   PRINT("Difference:%f V\n", Difference);
                   currentvalue = Difference/10000;
                   NTC=averagevalue/currentvalue;
                    PRINT("NTC:%f Ω\n",NTC);
            //      T1 =1/(ln(Rt/R)/B+1/T2)-273.15
                    temp=1/((log(NTC/10000)/3950)+(1/(273.15+25)))-273.15+0.5;
                    PRINT("temp:%f ℃\n",temp);
                    sum = 0;
                    DelayMs(1000);
        }
    }
    复制代码

    3、验证现象:

    代码打印温度:

    实际温度:

     4:注意事项:

    再使用的时候需要使用精度较高的定制电阻,MCU的供电电压与参考电压稳定,同时NTC的供电要稳定。

    常用温度阻值对照表:

     

    仅用于个人学习分享;

    如有错漏请指正。

  • 相关阅读:
    快鲸scrm管理系统:六大功能实现企业营收更大化
    阿里P9整理出千页笔记:Java程序设计与数据结构基础+进阶
    lightdb21.3-支持语句级hint
    金仓数据库KingbaseES客户端编程开发框架-MyBatis(2. 概述 3. MyBatis配置说明)
    第一章 CIS 安全基准-Ingress配置证书
    TNF1LTX_TNF2LTX_TNF3LTX 全新板卡10路(TNF1LTX)/11路(TNF2LTX/TNF3LTX)高速任意业务汇聚波长转换板
    Unload-labs-pass-04
    03.UDP套接字与原始套接字
    JavaWeb学习笔记
    探索 ArrayList 原理 - 第一节 ArrayList 集合底层数据结构
  • 原文地址:https://www.cnblogs.com/frontier/p/18225714