从目录中读取输入 (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
}
免责声明:我不知道您使用的硬件,如果设备的行为类似于文件,我只是修复了您的代码。
我正在尝试从我的 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
}
免责声明:我不知道您使用的硬件,如果设备的行为类似于文件,我只是修复了您的代码。