2

AIN0 チャネルから ADC (0 ~ 4095 の 12 ビット) 入力を読み取ろうとしており、それを「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);
  }
}
4

1 に答える 1

1

2 番目の関数では、計算でファイルハンドルを使用しています。あなたが読んだ値を意味していたと思います(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
}

免責事項:使用しているハードウェアについてはわかりません。デバイスがファイルのように動作する場合は、コードを修正してください。

于 2015-04-30T17:00:43.403 に答える