极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16147|回复: 5

关于模拟口读取数据的问题

[复制链接]
发表于 2015-10-17 22:25:55 | 显示全部楼层 |阅读模式
我设计了一个读取电阻的电路,在模拟时都正常,但是在实践时发现没有接线的模拟口也能读取到数据,想请教大家是什么问题
程序是借鉴别人的

  1. //设置参考电阻
  2. #define basis 20000.0
  3. //定义测试端口
  4. int AnPin[] = {A0, A1, A2, A3, A4, A5};


  5. //定义读取模拟端口值以及计算后所得的电阻值
  6. float val, r;//定义变量
  7. String CommandString = ""; //定义存储命令变量
  8. String Sendtext = ""; //定义存储说有传感器的值

  9. //程序初始化
  10. void setup()
  11. {

  12.   Serial.begin(9600);//串口定义

  13. }



  14. void loop()

  15. {
  16.   while (Serial.available() > 0)
  17.   {
  18.     CommandString += int(Serial.read()) - '0';
  19.     delay(3);
  20.   }
  21.   switch (CommandString[1])
  22.   {
  23.     case '1':
  24.       GetRES(CommandString[1]);
  25.       Serial.println("case1");
  26.       CommandString = ""; //输出数据后清除命令内容
  27.       break;
  28.     case '2':
  29.       GetRES(CommandString[1]);
  30.       Serial.println("case2");
  31.       CommandString = ""; //输出数据后清除命令内容
  32.       break;
  33.     case '3':
  34.       GetRES(CommandString[1]);
  35.       Serial.println("case3");
  36.       CommandString = ""; //输出数据后清除命令内容
  37.       break;
  38.     case '4':
  39.       GetRES(CommandString[1]);
  40.       Serial.println("case4");
  41.       CommandString = ""; //输出数据后清除命令内容
  42.       break;
  43.     case '5':
  44.       GetRES(CommandString[1]);
  45.       Serial.println("case5");
  46.       CommandString = ""; //输出数据后清除命令内容
  47.       break;
  48.     case '6':
  49.       GetRES(CommandString[1]);
  50.       Serial.println("case6");
  51.       CommandString = ""; //输出数据后清除命令内容
  52.       break;
  53.     case '7'://测试所有传感器
  54.       GetRES();
  55.       Serial.println("case7");
  56.       CommandString = ""; //输出数据后清除命令内容
  57.       break;
  58.   }



  59.   delay(2000);
  60. }


  61. //计算并输出值
  62. void GetRES(char Port)
  63. {
  64.   int PortNum = int(Port) - 49; //由于转换字符到ACSIC码值因此要减49

  65.   val = analogRead(AnPin[PortNum]); //读取端口的值到变量
  66.    Serial.println(val);
  67.   r = ((basis * 1023.0) / (1023.0 - val)) - basis;
  68.   Serial.println(r);

  69.   delay(100);

  70.   if (filter() >= 1000)
  71.   {
  72.     if (filter() >= 500.0 * 1000.0)
  73.     {
  74.       Serial.println("Infinity!!");
  75.     }
  76.     else
  77.     {
  78.       //Serial.print(filter() / 1000.0);//输出电阻值
  79.       Serial.print(int(filter() / 1000)); //1k为一个cm单位输出
  80.       
  81.       Serial.print("cm");
  82.     }
  83.   }
  84.   else
  85.   {
  86.     Serial.print("2A");
  87.   }
  88. }
  89. //滤波公式
  90. float filter()

  91. {

  92.   float sum = 0;

  93.   for (int count = 0; count < N; count++)

  94.   {

  95.     sum += r;

  96.     delay(5);

  97.   }

  98.   return (float)(sum / N);

  99. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-10-18 20:58:36 | 显示全部楼层
在setup里定义测量接口为高阻态OUTPUT,接口10K下拉,应该就正常了。
回复 支持 反对

使用道具 举报

发表于 2015-10-19 16:54:26 | 显示全部楼层
这不是你程序的事,说复杂了会太深,说的简单点这是AVR内部电路的事,因为这6个通道共用一个AD转换器,浮空的引脚上会有感生电压。其实这不会影响你需要的那两个引脚上的测量值的,如果你有强迫症。。。。那么将那几个没用到模拟口用10K电阻接到地或者接到5V电源。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-1 20:01:37 | 显示全部楼层
sanyouhi 发表于 2015-10-19 16:54
这不是你程序的事,说复杂了会太深,说的简单点这是AVR内部电路的事,因为这6个通道共用一个AD转换器,浮空 ...

谢谢,写的很详细,我现在直接接地,显示为0了
回复 支持 反对

使用道具 举报

发表于 2015-11-13 23:12:47 | 显示全部楼层
anduony 发表于 2015-11-1 20:01
谢谢,写的很详细,我现在直接接地,显示为0了

不用谢。(凑够10个字符)
回复 支持 反对

使用道具 举报

发表于 2016-10-12 20:49:47 | 显示全部楼层
学习学习了
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-13 22:52 , Processed in 0.072017 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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