NTC热敏电阻设计高精度温度计的方案1
采用廉价的NTC热敏电阻设计高精度温度计的方案, 根据NTC热敏电阻的温度特性,采用了较具新意程序算法;摆脱了传统的查表显示温度的方法, 特点:程序中无须查表,打破了常规的查表显示温度的方法。
#include<absacc.h>
#include<reg52.h>
#include<math.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <stdlib.h>
#include "drive.h"
unsigned int code V0=2320;//2.32伏=>R=32660 2.5K Vref=2.5V
// unsigned int code V0=3828;//3.828伏=>R=32660 10K Vref=5V
//uchar code K=2;
uchar TUP0=1;//在0度上
uint idata Vtest=0;
unsigned int code NTC[71]={//-10度 ~ +60度
55350,52420,49670,47080,44640,42340,40170,38130,36200,34380,
32660,30140,29510,28060,26690,25400,24180,23020,21920,20890,
19900,18970,18090,17260,16470,15710,15000,14320,13680,13070,
12490,11940,11420,10920,10450,10000,9572,9165,8777,8408,
8055,7721,7402,7098,6808,6531,6267,6015,5774,5545,
5325,5116,4916,4725,4543,4368,4201,4041,3888,3742,
3602,3468,3340,3217,3099,2987,2878,2775,2675,2580,
2488
};
//-----------------PID--------
uint idata Tempurature;//测得实际温度
float idata Pset=0,Iset=0,Dset=0;//实际上每个扩大了
uchar code TRange=100;//控温范围0-10
float idata VRange;//输出范围0-2V
float idata Et_Cool=0,Et1_Cool=0,Et2_Cool=0;//制冷
float idata Tset;//设置温度
unsigned int Vout;
//unsigned char idata Data[2];
unsigned int code WriteNum[8]={2000,77,100,1500,1000,2050,250,0x88}; //p I D Tset A1 A2 MAXI
//unsigned int idata ReadNum[8];
float idata T_Alarm1,T_Alarm2;
float idata outValue_Cool=0.0;
uint PIDOut_Cool();
uint GetTemperature(uchar IsTest);//如果25.0度返回2500
uint ReadAD(uchar port);
void initPID();
void ReadDataToBuf();
//
//
sbit Alarm1=P0^0;
sbit Alarm2=P0^1;
sbit TECON =P2^6;
sbit CoolON=P2^1;
//-----------------------------
//
// IsTest为1表示为测试温度,为0表示环境温度
/ 分压电阻为2500欧姆
// 2.39 =>-10 R=55350欧姆
// |
// 2.32 =>0 R=32660欧姆
// |
// 2 =>25 R=10000欧姆
// |
// 1.25 =>60 R=2488欧姆
///
uint GetTemperature( )//如果25.0度返回2500
{
float Temp;
unsigned char i;
bit find;
unsigned int Rtest,Ttest;
DOG=!DOG;
find=0;
i=0;
if (Vtest>V0) //零度以下 负温度系数
TUP0=0;
else
TUP0=1;
Rtest=2500*(Vtest/(2.5*1000-Vtest));//分压电阻为2.5K 总电压为2.5V
while(!find)
{
if (NTC[i]>=Rtest && NTC[i+1]<=Rtest)
find=1;
else
i++;
}
if (TUP0)
Temp=(float)(i-10)+(float)(NTC[i]-Rtest)/(NTC[i]-NTC[i+1]);
else
Temp=(float)(10-i)+(float)(NTC[i]-Rtest)/(NTC[i]-NTC[i+1]);
DOG=!DOG;
Ttest=fabs(Temp*100);
return Ttest;
}
///
uint ReadAD(uchar port)
{
uint ad2,AD;
float a,Vin,all,MaxV,MinV;
uchar i;
DOG=!DOG;
read2543(port);
AD=0;
ad2=read2543(port);
//vref=5.00*(ad2/4096.00);
i=0;
all=0;
a=0;
MaxV=0;
MinV=5;
for (i=0;i<255;i++)
{
DOG=!DOG;
ad2=read2543(port);
a=5.0*ad2/4096.00;
if (a > MaxV) MaxV=a;
if (a < MinV) MinV=a;
all+=a;
}
all=all-MaxV-MinV;
Vin=(all/253.0);
Vin*=1000;
AD=abs(Vin);
read2543(port);
return AD;
}
//
/// PID ///
void initPID()
{
Et_Cool=0.0;
Et1_Cool=0.0;
Et2_Cool=0.0;
}
//******************************
//******************************
//------------制冷--------------
uint PIDOut_Cool()
{
float Pa=0,Pb=0,Pc=0;
float Pterm=0.0,Iterm=0.0,Dterm=0.0,Cool_Out;
DOG=!DOG;
if (TUP0)
Et_Cool=Tempurature-Tset*100;//Tset=25 ,扩大100倍
else
Et_Cool=((-1)*Tempurature)-Tset*100;//Tset=25 ,扩大100倍
Pa=Et_Cool;
Pb=Et_Cool-Et1_Cool;
Pc=Et_Cool-2*Et1_Cool+Et2_Cool;
Pterm=(float)Pset*Pb;
Iterm=(float)Iset*Pa;
Dterm=(float)Dset*Pc;
outValue_Cool+=Pterm+Iterm+Dterm;//P、I、D增量算法
Cool_Out=outValue_Cool;
//------------------
if (outValue_Cool > TRange*100)
outValue_Cool=TRange*100;//分辨率为Trange=100,100X100=10000
if (outValue_Cool<0) outValue_Cool=0;
if (Cool_Out > (TRange*100)) Cool_Out=TRange*100;//分辨率为Trange=100,100X100=10000
if (Cool_Out<0) Cool_Out=0;
if (!TUP0) Cool_Out=0;
//------------------
Et2_Cool=Et1_Cool;
Et1_Cool=Et_Cool;
return Cool_Out;//还原为0-100输出,然后扩大100倍100X100=10000
}
//***************************************
///
/*
void ReadDataToBuf()
{
uchar i;
for (i=0;i<7;i++)
{
DOG=!DOG;
RW24XX(Data,2,0x0000+i*2, 0xa1,M2464);
ReadNum[i]=Data[0]*256+Data[1];
}
}
*/
//****************************************
//********************* *****************
//********************* 主程序 *****************
//********************* ****************
void main(void)
{
uint Cur_Temp;
uint out=0;
//
uchar i;
DOG=0;
DOG=!DOG;
P0&=0;
Alarm1=1;
Alarm2=1;
TECON=0;
CoolON=1;
//
for (i=0;i<200;i++) ;
InitMax7219();
ClsMax7219();
DOG=!DOG;
InitMAX512();
initPID();
/*
//
RW24XX(Data,2,0x0000+7*2, 0xa1,M2464);
ReadNum[7]=Data[0]*256+Data[1];
if (ReadNum[7]!=0x88)
{
for (i=0;i<7;i++)
{
DOG=!DOG;
Data[0]=WriteNum[i]/256;
Data[1]=WriteNum[i]%256;
RW24XX(Data,2,0x0000+i*2, 0xa0,M2464);
}
}
/
ReadDataToBuf();
*/
DOG=!DOG;
Pset= (float)WriteNum[0]/100.0;//读取参数
Iset= (float)WriteNum[1]/100.0;
Dset= (float)WriteNum[2]/100.0;
Tset= (float)WriteNum[3]/100.0;
T_Alarm1= (float)WriteNum[4]/100.0;
T_Alarm2= (float)WriteNum[5]/100.0;
VRange= (float)WriteNum[6]/100.0;
DOG=!DOG;
InitMAX512();
ClsMax7219();
//======设定温度 =========
MAX7219_ShowFloat(1,Tset*10,1);//如405为40.5
while (1)
{
DOG=!DOG;
Vtest=ReadAD(0);//pt100A
//================ 测试实际温度 ================
Tempurature=GetTemperature();//如25.0为2500 实际温度
///============== 制冷 =====================
if (Tempurature>=1500) CoolON=1;//制冷打开
else
CoolON=0; //制冷关闭
//-------------报警--------------------------
if (Tempurature<T_Alarm1*100 || !TUP0)
{
Delay(200);
if (Tempurature<T_Alarm1*100 || !TUP0)
Alarm1=0;
}
else
Alarm1=1;
if (Tempurature>T_Alarm2*100 && TUP0)
{
Delay(200);
if (Tempurature>T_Alarm2*100 && TUP0)
Alarm2=0;
}
else
Alarm2=1;
/
Cur_Temp=(uint)Tempurature/10;
MAX7219_ShowFloat(2,Cur_Temp,TUP0);//如405为40.5
out=PIDOut_Cool();
if (out>0) TECON=1;
else TECON=0;
Vout=(uint)(10.0*VRange*((float)out/TRange)); //如2V为2000
DAOut(0x01,Vout/10.0);//如2V为200 A通道
}
}
///
NTC热敏电阻设计高精度温度计的方案1相关推荐
- 电子设计教程40:软启动电路-串联NTC热敏电阻
串联电阻是最容易想到的限制浪涌电流的方案.如果电源电压是5V,在负载的电容前,串联5.1Ω的电阻(要注意标称电阻没有5Ω),就可以保持最大电流在1A以下.这种做法的缺点也是显而易见的,这个电阻要浪 ...
- Arduino STM32用NTC热敏电阻 OLED显示屏制作温度计
1.材料清单 STM32F103C8T6开发板(黑色板).NTC热敏电阻.12864OLED显示屏(四脚).microUSB数据线.导线及面包板 2.电路连接 NTC热敏电阻连接电路:GND-> ...
- 高精度、高可靠性、可引线接合安装的NTC热敏电阻
近年来,随着通信容量和速度的不断提升,光传输系统取得了巨大的进步.作为重要元件之一的激光二极管,需要温度传感器来保持恒定的环境温度.偶尔也使用热电偶作为温度传感器,其中TDK的NTC热敏电阻NTCWS ...
- 用STM32单片机ADC+NTC热敏电阻采集温度的设计思路 | 附参考电路
目录 前言 一.热敏电阻NTC 二.参考电路 三.激励电压选择 前言 记录一些我在工作和学习过程中遇到的问题 NTC:在淘宝随便买的 单片机型号:STM32G030C8T6 目的:用单片机采集NTC温 ...
- NTC热敏电阻基础以及应用和选择(转)
源:NTC热敏电阻基础以及应用和选择 NTC被称为负温度系数热敏电阻,是由Mn-Co-Ni的氧化物充分混合后烧结而成的陶瓷材料制备而来,它在实现小型化的同时,还具有电阻值-温度特性波动小.对各种温度变 ...
- 热敏电阻制作温度传感器的c语言,課题一NTC热敏电阻的温度测量和控制系统.doc...
課题一NTC热敏电阻的温度测量和控制系统 2011年暑期电子设计大赛课题一 基于NTC热敏电阻的温度测量与控制系统的设计 学生姓名杜衡.向奇林.刘露平院系名称物理与电子工程学院专业名称电子信息工程班级 ...
- NTC热敏电阻原理及应用
NTC热敏电阻是指具有负温度系数的热敏电阻.是使用单一高纯度材料.具有 接近理论密度结构的高性能陶瓷.因此,在实现小型化的同时,还具有电阻值. 温度特性波动小.对各种温度变化响应快的特点,可进行高灵敏 ...
- 一种基于NTC热敏电阻测量的温度模块
一种基于NTC热敏电阻测量的温度模块 设计初衷和经历: 设计这块温度采集模块时,最初的用途在冰箱的检测线,通过485总线的方式,采集每个工位的冰箱关键节点的温度.后因为工作变动,加以改进,增加了三相电 ...
- 【原创】ESP32+NTC热敏电阻测温SD卡采集OLED显示,Begabung_TC250
摘要 利用ESP32设计一款八通道热敏电阻采集方案,并使用SD卡采集及OLED显示,通过Arduino_IDE编写.本产品在淘宝店Begabung发售,型号:TC250. 内容 零件准 ...
最新文章
- 链表--只知道当前节点指针删除当前节点
- Windows中启动Redis走配置文件的bat脚本
- Flink分布式standalone部署方式(第二种方式)
- 通过运行时单步调试弄清楚[(ngModel)]的双向绑定的工作原理
- “双十一缔造者”张勇
- linux平台C++开发基本知识
- php三级分销系统制作_微分销商城系统创建三级微商分销体系方法
- 【操作系统】同步和互斥
- 前端开发中,对图片的优化技巧有哪些?
- js 对一个字段去重_写一个N-API没那么难?
- IOS开发之Post 方式获取服务器数据
- cacti 安装部署
- warning: C4819的解决办法
- 浙江大学计算机科学与技术博士培养研究方向,浙江大学博士研究生培养方案
- 疯狂java 李刚 pdf_Java开发教程 – 《疯狂Java讲义第4版》PDF及代码+李刚
- 健康体适能答案2021(持续更新)
- 谁说大象不能跳舞——《读书笔记》
- 中通财报:“增收不增利”怪圈难破
- 恢复U盘未分配空间怎么合并,u盘分区扩展卷不显示怎么办
- 通过具体的例子说明一维和二维的相关运算、卷积运算究竟是怎么做的。