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);
}
}