采用廉价的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相关推荐

  1. 电子设计教程40:软启动电路-串联NTC热敏电阻

      串联电阻是最容易想到的限制浪涌电流的方案.如果电源电压是5V,在负载的电容前,串联5.1Ω的电阻(要注意标称电阻没有5Ω),就可以保持最大电流在1A以下.这种做法的缺点也是显而易见的,这个电阻要浪 ...

  2. Arduino STM32用NTC热敏电阻 OLED显示屏制作温度计

    1.材料清单 STM32F103C8T6开发板(黑色板).NTC热敏电阻.12864OLED显示屏(四脚).microUSB数据线.导线及面包板 2.电路连接 NTC热敏电阻连接电路:GND-> ...

  3. 高精度、高可靠性、可引线接合安装的NTC热敏电阻

    近年来,随着通信容量和速度的不断提升,光传输系统取得了巨大的进步.作为重要元件之一的激光二极管,需要温度传感器来保持恒定的环境温度.偶尔也使用热电偶作为温度传感器,其中TDK的NTC热敏电阻NTCWS ...

  4. 用STM32单片机ADC+NTC热敏电阻采集温度的设计思路 | 附参考电路

    目录 前言 一.热敏电阻NTC 二.参考电路 三.激励电压选择 前言 记录一些我在工作和学习过程中遇到的问题 NTC:在淘宝随便买的 单片机型号:STM32G030C8T6 目的:用单片机采集NTC温 ...

  5. NTC热敏电阻基础以及应用和选择(转)

    源:NTC热敏电阻基础以及应用和选择 NTC被称为负温度系数热敏电阻,是由Mn-Co-Ni的氧化物充分混合后烧结而成的陶瓷材料制备而来,它在实现小型化的同时,还具有电阻值-温度特性波动小.对各种温度变 ...

  6. 热敏电阻制作温度传感器的c语言,課题一NTC热敏电阻的温度测量和控制系统.doc...

    課题一NTC热敏电阻的温度测量和控制系统 2011年暑期电子设计大赛课题一 基于NTC热敏电阻的温度测量与控制系统的设计 学生姓名杜衡.向奇林.刘露平院系名称物理与电子工程学院专业名称电子信息工程班级 ...

  7. NTC热敏电阻原理及应用

    NTC热敏电阻是指具有负温度系数的热敏电阻.是使用单一高纯度材料.具有 接近理论密度结构的高性能陶瓷.因此,在实现小型化的同时,还具有电阻值. 温度特性波动小.对各种温度变化响应快的特点,可进行高灵敏 ...

  8. 一种基于NTC热敏电阻测量的温度模块

    一种基于NTC热敏电阻测量的温度模块 设计初衷和经历: 设计这块温度采集模块时,最初的用途在冰箱的检测线,通过485总线的方式,采集每个工位的冰箱关键节点的温度.后因为工作变动,加以改进,增加了三相电 ...

  9. 【原创】ESP32+NTC热敏电阻测温SD卡采集OLED显示,Begabung_TC250

    摘要 利用ESP32设计一款八通道热敏电阻采集方案,并使用SD卡采集及OLED显示,通过Arduino_IDE编写.本产品在淘宝店Begabung发售,型号:TC250. 内容         零件准 ...

最新文章

  1. 链表--只知道当前节点指针删除当前节点
  2. Windows中启动Redis走配置文件的bat脚本
  3. Flink分布式standalone部署方式(第二种方式)
  4. 通过运行时单步调试弄清楚[(ngModel)]的双向绑定的工作原理
  5. “双十一缔造者”张勇
  6. linux平台C++开发基本知识
  7. php三级分销系统制作_微分销商城系统创建三级微商分销体系方法
  8. 【操作系统】同步和互斥
  9. 前端开发中,对图片的优化技巧有哪些?
  10. js 对一个字段去重_写一个N-API没那么难?
  11. IOS开发之Post 方式获取服务器数据
  12. cacti 安装部署
  13. warning: C4819的解决办法
  14. 浙江大学计算机科学与技术博士培养研究方向,浙江大学博士研究生培养方案
  15. 疯狂java 李刚 pdf_Java开发教程 – 《疯狂Java讲义第4版》PDF及代码+李刚
  16. 健康体适能答案2021(持续更新)
  17. 谁说大象不能跳舞——《读书笔记》
  18. 中通财报:“增收不增利”怪圈难破
  19. 恢复U盘未分配空间怎么合并,u盘分区扩展卷不显示怎么办
  20. 通过具体的例子说明一维和二维的相关运算、卷积运算究竟是怎么做的。

热门文章

  1. 墨菲安全受邀与腾讯安全共话软件供应链安全治理
  2. acm暑期集训_2020.07.02
  3. 转载 PVE 防火墙
  4. python适合小白学吗_有没有适合零基础小白学习的python课程?
  5. gammatone 滤波器详解及其MATLAB代码实现
  6. pycharm选择虚拟环境
  7. AE脚本:AE导入SubRip/SRT/TXT/VTT字幕
  8. ps cs6移除html,ps cs6清除照片中不想要的杂物教程
  9. Inventor制作动画
  10. 集易市场微信小程序项目