找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1363|回复: 11
打印 上一主题 下一主题
收起左侧

请问这里的NTC温度检测要怎么写

[复制链接]
跳转到指定楼层
楼主
ID:1041297 发表于 2024-8-26 08:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问这里的NTC温度检测要怎么写

1.PNG (149.29 KB, 下载次数: 15)

1.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:404160 发表于 2024-8-26 13:18 | 只看该作者
#include "sc92f7411.h" // 包含SC92F7411的寄存器定义头文件

// 定义常量
#define ADC_CHANNEL 0  // 假设NTC连接到ADC0通道
#define FIXED_RESISTOR 10000  // 固定电阻值
#define VCC 3.3  // 假设参考电压为3.3V
#define NTC_BETA 3950  // NTC的B参数

// 初始化ADC
void adc_init() {
    // 配置ADC时钟、参考电压、转换模式等
    // ... 根据数据手册配置ADC寄存器
    ADCCON = 0x00; // 初始化ADC控制寄存器,具体配置根据数据手册
    ADCCON |= (1 << ADCEN); // 使能ADC
}

// 读取ADC值
uint16_t read_adc(uint8_t channel) {
    // 设置ADC通道
    ADCCON &= ~(0x0F); // 清除通道选择位
    ADCCON |= channel;
    // 启动转换
    ADCCON |= (1 << ADCS);
    // 等待转换完成
    while (!(ADCCON & (1 << ADRDY)));
    // 读取ADC结果
    return ADCDAT;
}

// 计算温度
float calculate_temperature(uint16_t adc_value) {
    // ... 同样根据Steinhart-Hart方程计算温度
}

int main() {
    adc_init();
    while (1) {
        uint16_t adc_reading = read_adc(ADC_CHANNEL);
        float temperature = calculate_temperature(adc_reading);
        // 显示或处理温度数据
    }
}
NTC的参数: 根据你用的NTC的B参数、阻值修改程序。以及ADC的配置: 您希望ADC的工作模式、分辨率等。
回复

使用道具 举报

板凳
ID:1109793 发表于 2024-8-26 14:38 | 只看该作者
跟厂家索取表格,然后论坛里面下载一个软件,生成ADC的结果表格,然后查表
回复

使用道具 举报

地板
ID:309610 发表于 2024-8-26 20:41 | 只看该作者
#include <math.h>
float T_c=0.0;   //温度值
// 定义常量
#define R_FIXED 10000.0 // 固定电阻值10kΩ
#define B_CONST 3950.0 // NTC的B常数
#define T0 298.15 // 25℃转换为开尔文
#define R0 10000.0 // NTC在25℃时的电阻值10kΩ

float calculate_temperature(float voltage) {
    float R_ntc, T;
    float V_supply = 3.3; // 电源电压3.3V

    // 计算NTC电阻值
    R_ntc = R_FIXED * (V_supply / voltage - 1);

    // 计算温度(开尔文)
    T = 1 / (1 / T0 + log(R_ntc / R0) / B_CONST);

    // 转换为摄氏度
    T = T - 273.15;

    return T;
}

        T_c=calculate_temperature( filtered_voltage[1]); //电压转温度计算  filtered_voltage[1]为ADC采样转换后电压
要求不高可以使用上面程序,按硬件修改相应电阻值
回复

使用道具 举报

5#
ID:1041297 发表于 2024-8-28 07:59 | 只看该作者
xiaobendan001 发表于 2024-8-26 14:38
跟厂家索取表格,然后论坛里面下载一个软件,生成ADC的结果表格,然后查表

兄弟,这个软件在哪里获取
回复

使用道具 举报

6#
ID:1109793 发表于 2024-8-28 10:23 | 只看该作者
1314love 发表于 2024-8-28 07:59
兄弟,这个软件在哪里获取

论坛里面搜搜吧
回复

使用道具 举报

7#
ID:1130995 发表于 2024-8-28 13:30 | 只看该作者
1314love 发表于 2024-8-28 07:59
兄弟,这个软件在哪里获取

#define VREF    5000  //电压,单位mv
#define NTC_K   273.15
#define NTC_T2  298.15
#define NTC_B   3950.0
#define NTC_R   10000.0  //热敏电阻标称值10K
#define R14       4700.0   //与NTC电阻并联的电阻 阻值   

//计算热敏电阻对应的温度值,返回值放大10倍,例如:152表示15.2度
//u16 dat:采集的电压值,单位毫伏
u16 Cal_Temperature(u16 dat)
{        
          u16 tmp = 0;
                float tmp1 = 0.0;
                float tmp2 = 0.0;
          float Resisit = 0.0;
        
          tmp = VREF - dat;
                Resisit = R14*tmp;
                Resisit = Resisit/dat;  //计算出当前温度下热敏电阻的阻值
                tmp1 = Resisit/NTC_R;
                tmp2 = log(tmp1);   
                tmp1 = tmp2/NTC_B;
                tmp2 = 1/NTC_T2;
                tmp1 = (tmp1+tmp2);
                tmp2 = 1.0/tmp1;
    if(tmp2 <= 274)tmp2 = 274;
                tmp2 -= 273.15;
          tmp1 = tmp2+0.05;
          tmp1 = (int)(tmp1*10);
         
                return tmp1;
}
回复

使用道具 举报

8#
ID:1041297 发表于 2024-8-28 14:55 | 只看该作者
guobaox1981 发表于 2024-8-26 20:41
#include
float T_c=0.0;   //温度值
// 定义常量

请问你这个voltage是ADC值吗,还是说这个voltage是获取的ADC值后转化为电压
回复

使用道具 举报

9#
ID:1041297 发表于 2024-8-28 16:02 | 只看该作者
guobaox1981 发表于 2024-8-26 20:41
#include
float T_c=0.0;   //温度值
// 定义常量

兄弟  我有个疑问 我不知道理解的对不对,您帮我看看,就是先用ADC去算出ADC值,然后返回回来去算NTC电阻值,再去算温度,然后比如我有个加热模式,我设定了150°,那我把这个算出来的温度去和这个设定的温度去比较,如果相等,就是等于加热完成了对不对?还有就是那个查表法,我看你这边没有用,是不是查表法只是方便不用总是去看手册,然后把它列到数组里面方便看
回复

使用道具 举报

10#
ID:309610 发表于 2024-8-28 21:09 | 只看该作者
1314love 发表于 2024-8-28 14:55
请问你这个voltage是ADC值吗,还是说这个voltage是获取的ADC值后转化为电压

voltage是ADC采样转换后的电压值为浮点数。
回复

使用道具 举报

11#
ID:309610 发表于 2024-8-31 16:17 | 只看该作者
1314love 发表于 2024-8-28 16:02
兄弟  我有个疑问 我不知道理解的对不对,您帮我看看,就是先用ADC去算出ADC值,然后返回回来去算NTC电阻 ...

是的 我是多通道ADC采样,采样定时器中断开启,ADC转换完成中断保存结果,所以统一采样完成12位ADC值保存到数组内,建立完成标志。采样完成后主程序统一计算和滤波转换为真实电压值。再根据热电阻电压及电源电压计算热电阻阻值,再根据计算出温度值,无需查表,一般精度够用。 比起查表法,由于使用大量浮点计算,比较吃硬件,51单片机的话比较占系统资源,计算时间也较长,查表法就比较快,不占太多资源。
回复

使用道具 举报

12#
ID:13282 发表于 2024-9-1 00:52 | 只看该作者
1314love 发表于 2024-8-28 07:59
兄弟,这个软件在哪里获取

把数据复制到EXCEL表一个列中, 然后用EXCEL函数计算ADC值就可以啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表