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

Reading an input (4096) from a directory to use in C

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

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

目前,我有一个 C 文件可以读取用户的输入(通过终端)并执行我需要它执行的数学函数,但我很难理解这个 active/constantly改变 ADC 值。我也研究过使用 "fopen" 函数。使用下面的代码,我能够在终端上获取 ADC 值,它会根据输入的电压变化而变化。有没有办法 "grab" 来自 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);
  }
}

在您的第二个函数中,您在计算中使用了文件句柄。我认为你的意思是你读到的值(ch)。只需将值转换为浮点数再放入计算即可。

同时向您读取的缓冲区添加另一个字节以容纳结尾的 \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
}

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