经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 计算机硬件 » 查看文章
ch58x/ch59xADC差分采样NTC电阻获取当前温度
来源:cnblogs  作者:小舟从此逝_1  时间:2024/6/1 18:16:34  对本文有异议

前言:之前的文章中也有关于使用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、代码实现:

  1. #include "CH59x_common.h"
  2. #include "math.h"
  3. uint16_t adcBuff[40];
  4. float sum=0;//多次采样和
  5. float averagevalue =0;//平均值
  6. volatile uint8_t adclen;
  7. volatile uint8_t DMA_end = 0;
  8. float basicvalue = 3.3;//输入电压
  9. float Difference=0;//压差
  10. float currentvalue=0;//电流
  11. float NTC=0;//NTC阻值
  12. float temp=0;//温度
  1. int main()
  2. {
  3. uint8_t i;
  4. SetSysClock(CLK_SOURCE_PLL_60MHz);
  5. /* 配置串口调试 */
  6. DebugInit();
  7. PRINT("Start @ChipID=%02X\n", R8_CHIP_ID);
  8. PRINT("\n4.Diff channel sampling...\n");
  9. GPIOA_ModeCfg(GPIO_Pin_4 | GPIO_Pin_12, GPIO_ModeIN_Floating);
  10. ADC_ExtDiffChSampInit(SampleFreq_3_2, ADC_PGA_1_4);
  11. ADC_ChannelCfg(0);
  12. R8_ADC_CFG|= RB_ADC_BUF_EN;
  13. while(1)
  14. {
  15. for(i = 0; i < 10; i++)
  16. {
  17. adcBuff[i] = ADC_ExcutSingleConver(); // 连续采样20次
  18. }
  19. for(i = 0; i < 10; i++)
  20. {
  21. PRINT("%d \n", adcBuff[i]);
  22. sum+= adcBuff[i];
  23. }
  24. PRINT("sum %f\n",sum);
  25. averagevalue = (((sum/10)/512)-4)*1.05;
  26. PRINT("average:%f V\n", averagevalue);
  27. Difference = basicvalue-averagevalue;
  28. PRINT("Difference:%f V\n", Difference);
  29. currentvalue = Difference/10000;
  30. NTC=averagevalue/currentvalue;
  31. PRINT("NTC:%f Ω\n",NTC);
  32. // T1 =1/(ln(Rt/R)/B+1/T2)-273.15
  33. temp=1/((log(NTC/10000)/3950)+(1/(273.15+25)))-273.15+0.5;
  34. PRINT("temp:%f ℃\n",temp);
  35. sum = 0;
  36. DelayMs(1000);
  37. }
  38. }

3、验证现象:

代码打印温度:

实际温度:

 4:注意事项:

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

常用温度阻值对照表:

 

仅用于个人学习分享;

如有错漏请指正。

原文链接:https://www.cnblogs.com/frontier/p/18225714

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号