亚博智能论坛  
  
查看: 581|回复: 2

RC充放电实现温度测量,前一段时间用过的,总结一下 转载

  [复制链接]

该用户从未签到

6

主题

16

帖子

35

积分

新手上路

Rank: 1

积分
35
发表于 2017-6-22 16:39:04 | 显示全部楼层 |阅读模式
首先检讨一下,用的cpu是本人很不喜欢的甚至讨厌的stc某一系列的,不为别的,就因为
祖父祖母的,太扯淡了。言归正传。。
一提到温度测量,我们通常往往都会想到AD采样,但是在一些对测量精度要求不是很高的场合,

我们是不是可以换一种思路,抛弃AD,用其他的方式来实现呢,呵呵,正好接触到一个项目,所

以打算挑战一下,没错,就是RC充放电来实现温度测量。

先看一下基本的电路连接:

图O:cpu拿出三个GPIO管脚,分别连接热敏电阻、100K高精电阻R1、泄流电阻R2,然后

通过一只电容器连接到GND。在这里电容器可以理解成一只小电池,而且还是一只可

充电电池。



图1:将RT设置成高阻太(输入),这样热敏电阻相当于断开(虚线),R1设置成输出,泄流电阻R2

设置成输出,如果cpu内部有上拉的话,最好打开,或者配置成强推挽,具体情况根据所选则的cpu而定。

这样R2给电容器充电,程序中一直检测R1管脚,直到R1管脚为高 while(R1 == 1);其实电容器被不一定被充满

电,只要满足R1管脚处的电平对于cpu来说是个高电平就足以。



图2:保持RT继续高阻(断开),将R1设置成输出,输出0(低电平),R2设置成输入,此时电容通过100K

高精度电阻进行放电,程序中一直检测R2管脚,直到R2管脚为低电平 while(R2 == 0);记录时间T1,T1就是

电容器通过100k电阻放电所需要的时间。

图3:过程跟图一是一模一样的,给电容器充电(不一定充满),原因你懂的;






图4:将R1设置成高阻(断开),RT设置成输出,并且输出低电平,将R2设置成输出;此时电容器通过RT进行放电,程序中一直检测R2管脚,直到R2管脚为低电平 while(R2 == 0);记录时间T2,T2就是电容器通过100k电阻放电所需要的时间。

到此,我们就可以算出热敏电阻RT的阻值了:




  1. /**
  2. *青岛昊阳智能微控技术有限公司
  3. *
  4. * 温度采集
  5. * 参考电阻为100 K
  6. * @param
  7. *              unsigned char channel:采集哪个通道的温度   
  8. *              NTP_OUTSIDE: 温控器外部温度探头
  9. *              NTP_INSIDE: 温控器内部探头
  10. *@return
  11. *              ERROR_NTP_PARA_ERROR:参数错误
  12. *              ERROR_NTP_LOST_ERROR:温度探头丢失
  13. *              非负:采集到的温度值
  14. *
  15. * @brief
  16. *              by kaka,2011,2,20         
  17. */


  18. #define NTP_CHECK (1)
  19. short ntp_100k_get_temperature(unsigned char channel){
  20. double x, y, z;
  21. unsigned long temperature_cnt_a, temperature_cnt_b;
  22. unsigned char tmp;

  23. if(channel == NTP_INSIDE){
  24. SET_P2(7, IO_PORT_TRI_IN); //参考电阻 输入
  25. SET_P2(6, IO_PORT_PULL_OUT); // 泄流电阻输出
  26. SET_P4(4, IO_PORT_TRI_IN); // 热敏电阻输入

  27. RFL0 = 0; //泄流电阻输出0
  28. while(RE0);   // 一直等到电容空

  29. RFL0 = 1; //泄流电阻输出1
  30. while(!RE0);      // 一直等到电容满

  31. SET_P2(7, IO_PORT_NO_PULL_IO); //参考电阻 输出
  32. SET_P2(6, IO_PORT_TRI_IN); // 泄流电阻输入
  33. SET_P4(4, IO_PORT_TRI_IN);// 热敏电阻输入

  34. RE0 = 0; //参考电阻输出0, 给电容放电
  35. temperature_cnt_a = 1;
  36. while(RFL0){ // 等到电容电量放空
  37. temperature_cnt_a ++;
  38. if(temperature_cnt_a > NTP_MAX_COUNTER){
  39. return ERROR_NTP_LOST_ERROR;
  40. }
  41. }

  42. SET_P2(7, IO_PORT_TRI_IN); //参考电阻 输入
  43. SET_P2(6, IO_PORT_PULL_OUT); // 泄流电阻输出
  44. SET_P4(4, IO_PORT_TRI_IN); // 热敏电阻输入

  45. RFL0 = 0; //泄流电阻输出0
  46. while(RE0);   // 一直等到电容空

  47. RFL0 = 1; //泄流电阻输出1
  48. while(!RE0);      // 一直等到电容满

  49. SET_P2(7, IO_PORT_TRI_IN); //参考电阻 输入
  50. SET_P2(6, IO_PORT_TRI_IN); // 泄流电阻输入
  51. SET_P4(4, IO_PORT_NO_PULL_IO);// 热敏电阻输出
  52. RT0 = 0; //通过热敏电阻给电容充电
  53. temperature_cnt_b = 1;
  54. while(RFL0){
  55. temperature_cnt_b ++;
  56. if(temperature_cnt_b > NTP_MAX_COUNTER){
  57. return ERROR_NTP_LOST_ERROR;
  58. }
  59. }
  60. }else if(channel == NTP_OUTSIDE){
  61. SET_P2(4, IO_PORT_TRI_IN); //参考电阻 输入
  62. SET_P2(3, IO_PORT_PULL_OUT); // 泄流电阻输出
  63. SET_P2(5, IO_PORT_TRI_IN); // 热敏电阻输入

  64. RFL1 = 1; //泄流电阻输出1
  65. while(!RE1);      // 一直等到电容放满

  66. SET_P2(4, IO_PORT_NO_PULL_IO); //参考电阻 输出
  67. SET_P2(3, IO_PORT_TRI_IN); // 泄流电阻输入
  68. SET_P2(5, IO_PORT_TRI_IN);// 热敏电阻输入


  69. temperature_cnt_a = 1;
  70. while((RFL1)){ // 等到电容电量充满
  71. temperature_cnt_a ++;
  72. if(temperature_cnt_a > NTP_MAX_COUNTER){
  73. return ERROR_NTP_LOST_ERROR;
  74. }
  75. }
  76. SET_P2(4, IO_PORT_TRI_IN); //参考电阻 输入
  77. SET_P2(3, IO_PORT_PULL_OUT); // 泄流电阻输出
  78. SET_P2(5, IO_PORT_TRI_IN); // 热敏电阻输入

  79. RFL1 = 1; //泄流电阻输出1
  80. while(!RE1);      // 一直等到电容满

  81. SET_P2(4, IO_PORT_TRI_IN); //参考电阻 输入
  82. SET_P2(3, IO_PORT_TRI_IN); // 泄流电阻输入
  83.                 SET_P2(5, IO_PORT_NO_PULL_IO);// 热敏电阻输出
  84. RT1 = 0; //通过热敏电阻给电容放电
  85. temperature_cnt_b = 1;
  86. while(RFL1){
  87. temperature_cnt_b ++;
  88. if(temperature_cnt_b > NTP_MAX_COUNTER){
  89. return ERROR_NTP_LOST_ERROR;
  90. }
  91. }
  92. }else{
  93. return ERROR_NTP_PARA_ERROR;
  94. }

  95. x = 0;
  96. y = temperature_cnt_a;
  97. z = temperature_cnt_b*100000;
  98. x = z / y;  //热敏电阻除以参考电阻
  99. tmp = ntp_100k_conversion(x);

  100. return tmp;
  101. }
复制代码



回复

使用道具 举报

该用户从未签到

16

主题

52

帖子

109

积分

菜鸟程序猿

Rank: 2

积分
109
发表于 2017-6-22 16:39:27 | 显示全部楼层
不错   标记一下
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2017-7-27 10:11
  • 8

    主题

    22

    帖子

    53

    积分

    新手上路

    Rank: 1

    积分
    53
    发表于 2017-6-22 16:39:51 | 显示全部楼层
    流程图做得不错
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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