Чтение ввода (4096) из каталога для использования в C

Я пытаюсь прочитать входной АЦП (12 бит, который является 0 - 4095) из моего канала AIN0, и использую его как "int", чтобы я мог использовать его в математической функции. Это возможно?

Директория, на которую я ссылаюсь - это "sys/bus/iio/devices/iio:device0/in_voltage0_raw" на Beaglebone Black Debian Wheezy.

В настоящее время у меня есть C-файл, который читает входные данные пользователя (через терминал) и выполняет математическую функцию, которая мне нужна, но мне трудно обдумать это активное / постоянно меняющееся значение АЦП. Я также изучил использование функций "fopen". Используя приведенный ниже код, я могу получить значение АЦП на терминале, и оно будет меняться в зависимости от того, сколько вольт поступает. Есть ли способ "получить" вход от АЦП и использовать его в математике функционировать, даже если значение АЦП постоянно меняется?

#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 ответ

Решение

Во второй функции вы используете файловый дескриптор в своих вычислениях. Я думаю, что вы имели в виду значение, которое вы прочитали (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
}

Отказ от ответственности: я не знаю об оборудовании, которое вы используете, просто исправил ваш код, если устройство ведет себя как файл.

Другие вопросы по тегам