从目录中读取输入(4096)以在C

时间:2015-04-30 15:55:40

标签: c beagleboneblack beagleboard adc iio

我正在尝试从AIN0通道读取一个ADC(12位,0 - 4095)输入,并将其用作“int”,这样我就可以在数学函数中使用它。这可能吗?

我所指的目录是Beaglebone Black Debian Wheezy上的“sys / bus / iio / devices / iio:device0 / in_voltage0_raw”。

目前,我有一个C文件读取用户的输入(通过终端)并执行我需要它做的数学函数,但是我很难绕过这个有效/不断变化的ADC值。我也研究过使用“fopen”函数。使用下面的代码,我能够在终端上获得ADC值,并且它将根据电压的大小而改变。有没有办法“抓住”来自ADC的输入并在数学中使用它功能,即使ADC值不断变化?

#define SYSFS_ADC_DIR "/sys/bus/iio/devices/iio:device0/in_voltage0_raw"
#define MAX_BUFF 64
int main(){
  int fd;
  char buf[MAX_BUFF];
  char ch[5];   //Update
  ch[4] = 0;    //Update

  int i;
  for(i = 0; i < 30; i++)
      {
      snprintf(buf, sizeof(buf), SYSFS_ADC_DIR);
      fd = open(buf, O_RDONLY);
      read(fd,ch,4);
      printf("%s\n", ch);
      close(fd);

      usleep(1000);
    }
  }

更新代码

我已经对char ch [5]进行了更改,我在编写我想要的数学函数的代码中也得到了更多。

int AIN0_low = 0;    //lowest input of adc
int AIN0_high = 4095;   //highest input of adc
int motor_low = 0;      //lowest speed value for motor
int motor_high = 3200;  //highest speed value for motor
double output = 0;

int  main(){
  double fd;
  char buf[MAX_BUF];
  char ch[4] = 0;

  int i;
  for(i = 0; i < 30; i++)
  {
    snprintf(buf, sizeof(buf), SYSFS_ADC_DIR);

    fd = open(buf, O_RDONLY);
    read(fd, ch, 4);

    double slope = 1.0 * (motor_high - motor_low) / (AIN0_high - AIN0_low);
    output = motor_low + slope * (ch - AIN0_low);

    printf("%f\n", output);

    close(fd);
    usleep(1000);
  }
}

1 个答案:

答案 0 :(得分:1)

在第二个功能中,您在计算中使用文件句柄。我认为你的意思是你读的价值(ch)。在进入计算之前,只需将值转换为float。

还要在读取的缓冲区中添加另一个字节以容纳结尾\ 0

像这样的东西

int  main(){
  double fd = 0.0;
  char buf[MAX_BUF] = {0};
  char ch[5] = {0,0,0,0,0};

  // move slope here since it is constant
  double slope = 1.0 * (motor_high - motor_low) / (AIN0_high - AIN0_low);

  int i;
  for(i = 0; i < 30; i++)
  {
    snprintf(buf, sizeof(buf), SYSFS_ADC_DIR);

    fd = open(buf, O_RDONLY);
    read(fd, ch, 4);
    output = motor_low + slope * (atof(ch) - AIN0_low);

    printf("%f\n", output);

    close(fd);
    usleep(1000);
  }
  return 0; // add this
}

免责声明:我不知道您正在使用的硬件,如果设备的行为类似于文件,则修复您的代码。