历史上的今天
返回首页

历史上的今天

今天是:2025年03月03日(星期一)

正在发生

2020年03月03日 | 基于STM8L的NTC热敏检测

2020-03-03 来源:eefocus

随手小记一下,如果有错误还望大佬指正。


至关重要的就是确定型号,程序其实没多少东西。


首先你要先确定你的热敏电阻的型号,如果你是从淘宝购买,可以去问客服。如果你不知道型号如何,可以列一个表,在STM中利用你的分压公式,计算出你的电阻在温度多少的时候,电阻是多少。程序在下方,如图。要想问参考温度怎么得到的,那就是用另一个温度传感器。

热敏电阻的电阻值是随着温度的变化而变化的,温度越高电阻越小。电阻值与温度对应表在以下网址http://www.thermistors.cn/news/238.html,http://www.mcnic.com/rt/103.html,如果都对应不上那你需要继续百度了,因为本人实力有限,建了个数组用来查询。


static float temp_res[61] = {

43.1172,41.1663,39.3153,37.5587,35.891,

34.3074,32.8029,31.3734,30.0145,28.7225,

27.4936,26.3245,25.2119,24.1527,23.1442,

22.1835,21.2682,20.3959,19.5644,18.7714,

18.0151,17.2935,16.6048,15.9475,15.3198,

14.7203,14.1475,13.6003,13.0772,12.5771,

12.0988,11.6413,11.2037,10.7848,10.3839,

10,9.6324,9.2802,8.9428,8.6195,

8.3096,8.0124,7.7275,7.4541,7.1919,

6.9403,6.6987,6.4669,6.2442,6.0304,

5.825,5.6276,5.438,5.2557,5.0804,

4.9119,4.7498,4.5939,4.4439,4.2995,

4.1605

}; //数组的【0】代表-10摄氏度,数组最高到50摄氏度 每增加一个数就上升一度  对应的元素代表此温度下的电组值 以K为单位

建好数组后,就要想怎么将阻值采集出来,由于只能采集电压值,所以你要在外围搭建一个小电路,我才用的是串联分压,与10K电阻串联。在中点采集的电压即是这个电阻电压。

AD采集代码


void sys_adc_init(void)

{

  GPIO_DeInit(GPIOB);//复位GPIOB

  GPIO_Init(GPIOB,GPIO_Pin_0,GPIO_Mode_In_FL_No_IT);//初始化B0为浮空输入

  CLK_PeripheralClockConfig (CLK_Peripheral_ADC1,ENABLE);//开启ADC时钟

  ADC_Init (ADC1,ADC_ConversionMode_Single,ADC_Resolution_12Bit,ADC_Prescaler_1);//ADC1,单次采样,12位,1分频

  ADC_Cmd(ADC1,ENABLE);//ADC1使能

  ADC_ChannelCmd (ADC1,ADC_Channel_18,ENABLE);//ADC1 18通道使能  18通道是B0 通道号对应什么引脚在PDF里

}

 

u16 sys_adc_read(void)

{

  ADC_SoftwareStartConv (ADC1);//开启软件转换         

  while(!ADC_GetFlagStatus (ADC1,ADC_FLAG_EOC));//等待转换结束

  ADC_ClearFlag (ADC1,ADC_FLAG_EOC);//清除相关标识    

  return ADC_GetConversionValue (ADC1);

}

计算电阻公式


float compute_res(u16 adc_value) //计算对应ad值下的电阻值

{

  float res;

  res = (float)(10 * adc_value) / (float)(4095 - adc_value); //10是与热敏电阻串联的电阻大小 以K为单位

  return res;

}

进行电阻值在数组区间查询:


void find_temp(float real_res) //计算出电阻值后,用for循环查询估摸出处于哪个区间里。

{

  for(u8 i=0;i<61;i++) //正着数找到温度最大值

  {

    if(real_res > temp_res[i])

    {

      temp_max_flag = i;

      break;

    }

  }

  //其实这两个温度就是差1度,也可以temp_min_flag = temp_max_flag - 1;

  

  for(int8_t i=60;i>=0;i--)//倒着数找温度最小值

  {

    if(real_res < temp_res[i])

    {

      temp_min_flag = i;

      break;

    }

  }

}

 

//温度最低值

temp_min = -20 + temp_min_flag; //-20是最低温度

 真实温度计算:


/********************

 看看再这个温度区间里,真实的value占多少,一度这个区间的

相当于在这1度的区间内,将其线性化

********************/

    temp_real_region =  temp_res[temp_min_flag] - c; //c是计算的电阻值。

    temp_region =  temp_res[temp_min_flag] - temp_res[temp_max_flag];

    

    d = temp_real_region / temp_region;

    //真实温度就是最小温度,加上占的那区间的百分比

    temp = (float)temp_min + d; 

主函数:


void main(void)

{

  u16 u16_adc1_value;//记录每次采集的AD值

  int16_t temp_min;//当前阻值温度的可能的最小值

  float c,d;//防止直接给函数赋值失败,先让其计算一下

  float temp_real_region,temp_region,temp; //计算真实温度的变量

  

  sys_clock_init();//时钟初始化

  sys_adc_init();//AD初始化

  usart_init(115200);//串口初始化

  while (1)

  {    

      

    u16_adc1_value = sys_adc_read(); //取出电压值

    

    c = compute_res(u16_adc1_value);//计算

    

    find_temp(c);

    

    temp_min = -10 + temp_min_flag; //估摸一下温度准不准

    

    

    /********************

    看看再这个温度区间里,真实的value占多少,一度这个区间的

    ********************/

    temp_real_region =  temp_res[temp_min_flag] - c;

    temp_region =  temp_res[temp_min_flag] - temp_res[temp_max_flag];

    

    d = temp_real_region / temp_region;

    //真实温度就是最小温度,加上占的那区间的百分比

    temp = (float)temp_min + d; 

    

    

    mprintf("阻值value结果为: "); 

    mprintf("%dn",u16_adc1_value);

    mprintf("最高阻值为: ");

    mprintf("%fn",c);

    mprintf("最低温度为: ");

    mprintf("%dn",temp_min);

    mprintf("真实温度为: ");

    mprintf("%fn",temp);

  }

}


得到的结果:

经过电压表测量,AD值正确,电阻值正确, 经查表,温度值在电阻值区间内。

推荐阅读

史海拾趣

Curtis Industries公司的发展小趣事

Curtis Industries公司在发展的同时,也积极承担社会责任。公司关注环保问题,采用环保材料和节能技术生产产品,减少对环境的影响。此外,公司还积极参与公益活动,支持教育事业和社会福利事业的发展。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了新的动力。

AZ Displays公司的发展小趣事

AZ Displays公司最初是一家专注于研发和生产TFT面板与LCD模块的初创企业。在电子行业激烈的竞争中,AZ Displays凭借其专业的技术团队和对市场的敏锐洞察,成功开发出一系列具有竞争力的产品。公司不断追求技术创新,持续优化生产工艺,逐渐在行业中树立起良好的口碑。

Bias Power公司的发展小趣事

随着全球化进程的加速,Bias Power公司积极寻求国际合作,以拓展更广阔的市场。公司与国际知名电子企业建立了战略合作关系,共同研发新产品,分享技术和市场资源。通过国际合作,Bias Power公司成功打入欧洲、亚洲等多个地区的市场,实现了业务的快速增长。

此外,Bias Power公司还积极参与国际展览和交流活动,展示其最新技术和产品,与全球同行进行深入交流。这些活动不仅提升了公司的知名度,还为公司的进一步发展奠定了坚实基础。

Hongfa公司的发展小趣事

为了推动公司的进一步发展,宏发公司于2008年进行了股份制改造,并成立了“厦门宏发电声股份有限公司”。2012年,公司成功上市,通过资本市场获得了更多的资金支持和发展动力。上市后,宏发继续加大在技术研发、市场拓展和产能提升等方面的投入,不断巩固和扩大其在继电器行业的领先地位。同时,公司还积极履行社会责任,为行业发展和地方经济做出了积极贡献。

Deltron / DEM Manufacturing公司的发展小趣事

随着公司实力的不断增强,DEM Manufacturing开始积极拓展国际市场。公司凭借优质的产品和专业的服务,成功打入欧洲、北美等多个地区的市场,并建立了稳定的销售网络。同时,公司还积极参与国际展览和论坛,与国际同行进行交流和合作,不断提升自身的国际影响力。

General Electric Company公司的发展小趣事
可能是由于电路布局不合理或外部元件选择不当引起的。解决方案是优化电路布局、选择合适的外部元件并加强电源滤波。

问答坊 | AI 解惑

PCB培训邀请函

深圳启程PCB培训学校 ‘国家信息技术紧缺人才培养工程’深圳教育考基地 (★学PCB热门技术,拿高薪!深圳启程PCB培训,免费试学,满意再报名。实力验证一切!!     已经就业于所学专业的毕业学员的好评及用人单位的好评是最大的实力 ...…

查看全部问答>

DCIF的分辨率

经过研究发现一种更为有效的监控视频编码分辨率(DCIF),其像素为528×384。DCIF分辨率的是视频图像来历是将奇、偶两个HALF D1,经反隔行变换,组成一个D1(720*576),D1作边界处理,变成4CIF(704×576),4CIF经水平3/4缩小、垂直2/3缩小,转换 ...…

查看全部问答>

单片机的C语言轻松入门

单片机的C语言轻松入门…

查看全部问答>

电子工程师 毕业3年,工资从5k到20k的经历

前一阵子从网上看到一篇文章说 一个美女程序员毕业3年半,工资从2k到8k,换了3个工作。看后颇有同感,一直想也写一篇自己的经历。     1〉我的背景:生于江南,自认为较有追求,本科是二本普通学校,研究生是北京一个二流重点大学,当然我深爱 ...…

查看全部问答>

ce 6 eboot 下载NK 启动后挂了

平台2440  使用NBOOT+EBOOT  下载NK    DNW信息如下   : Enter your selection: d INFO: Probe: DM9000 is detected. DM9000: MAC Address: 0:11:22:33:44:55 System ready! Preparing for downl ...…

查看全部问答>

这是什么结构体语法?

static struct file_operations qq2440_leds_fops = {         .owner        =        THIS_MODULE,         .ioctl        =  &nb ...…

查看全部问答>

在wince系统中TCP/IP服务没有加载起来

   在测试wifi时,我能够连接上无线AP,并拿到无线AP的MAC地址。现在的困惑就是无法获取路由器分配的地址。不过Windows ce系统提供了一个Ipconfig的cpp文件,同时也可以进入wince的命令行状态,在命令行下输入命令Ipconfig,也可以获取网 ...…

查看全部问答>

华为3G模块问题,USTS 00 00 01 c0 canceled ,USTS 04 00 01 c0 stall pid

问题描述 :    使用华为的WCDMA 3G模块,自己做一个拨号软件,发现连接和断开有问题,有时候连了很久连不上去,有时候连上了断不开,开始时怀疑我的程序有问题,后面再windows下控制面板->网络连接里面 新建一个连接,然后一直连接, ...…

查看全部问答>

S3C2440中的Uart串口地址问题

请教S3C2440中的Uart串口地址问题:UART0的发送缓冲区地址为0X50000020,接收缓冲区地址为0X50000024,中间只相差4个字节,怎么来的64字节的FIFO缓冲区呢? 谢谢!…

查看全部问答>

lpc111x4 操作系统

大家在LPC1114上用什么操作系统呢?…

查看全部问答>