anduony 发表于 2015-10-17 22:25:55

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

我设计了一个读取电阻的电路,在模拟时都正常,但是在实践时发现没有接线的模拟口也能读取到数据,想请教大家是什么问题
程序是借鉴别人的

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


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

//程序初始化
void setup()
{

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

}



void loop()

{
while (Serial.available() > 0)
{
    CommandString += int(Serial.read()) - '0';
    delay(3);
}
switch (CommandString)
{
    case '1':
      GetRES(CommandString);
      Serial.println("case1");
      CommandString = ""; //输出数据后清除命令内容
      break;
    case '2':
      GetRES(CommandString);
      Serial.println("case2");
      CommandString = ""; //输出数据后清除命令内容
      break;
    case '3':
      GetRES(CommandString);
      Serial.println("case3");
      CommandString = ""; //输出数据后清除命令内容
      break;
    case '4':
      GetRES(CommandString);
      Serial.println("case4");
      CommandString = ""; //输出数据后清除命令内容
      break;
    case '5':
      GetRES(CommandString);
      Serial.println("case5");
      CommandString = ""; //输出数据后清除命令内容
      break;
    case '6':
      GetRES(CommandString);
      Serial.println("case6");
      CommandString = ""; //输出数据后清除命令内容
      break;
    case '7'://测试所有传感器
      GetRES();
      Serial.println("case7");
      CommandString = ""; //输出数据后清除命令内容
      break;
}



delay(2000);
}


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

val = analogRead(AnPin); //读取端口的值到变量
   Serial.println(val);
r = ((basis * 1023.0) / (1023.0 - val)) - basis;
Serial.println(r);

delay(100);

if (filter() >= 1000)
{
    if (filter() >= 500.0 * 1000.0)
    {
      Serial.println("Infinity!!");
    }
    else
    {
      //Serial.print(filter() / 1000.0);//输出电阻值
      Serial.print(int(filter() / 1000)); //1k为一个cm单位输出
      
      Serial.print("cm");
    }
}
else
{
    Serial.print("2A");
}
}
//滤波公式
float filter()

{

float sum = 0;

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

{

    sum += r;

    delay(5);

}

return (float)(sum / N);

}

carney 发表于 2015-10-18 20:58:36

在setup里定义测量接口为高阻态OUTPUT,接口10K下拉,应该就正常了。

sanyouhi 发表于 2015-10-19 16:54:26

这不是你程序的事,说复杂了会太深,说的简单点这是AVR内部电路的事,因为这6个通道共用一个AD转换器,浮空的引脚上会有感生电压。其实这不会影响你需要的那两个引脚上的测量值的,如果你有强迫症。。。。那么将那几个没用到模拟口用10K电阻接到地或者接到5V电源。

anduony 发表于 2015-11-1 20:01:37

sanyouhi 发表于 2015-10-19 16:54 static/image/common/back.gif
这不是你程序的事,说复杂了会太深,说的简单点这是AVR内部电路的事,因为这6个通道共用一个AD转换器,浮空 ...

谢谢,写的很详细,我现在直接接地,显示为0了

sanyouhi 发表于 2015-11-13 23:12:47

anduony 发表于 2015-11-1 20:01 static/image/common/back.gif
谢谢,写的很详细,我现在直接接地,显示为0了

不用谢。(凑够10个字符)

milkbob 发表于 2016-10-12 20:49:47

学习学习了
页: [1]
查看完整版本: 关于模拟口读取数据的问题