您好,我的问题是这样的:
我现在用如下应用程序来测试多通道ad转换
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/fs.h>
#include <errno.h>
#include <string.h>
#define ADC_SET_CHANNEL 0xc000fa01
#define ADC_SET_ADCTSC 0xc000fa02
/*
1) cd Linux-2.6.38
2) make menuconfig
3) enter Device Drivers--->Input device support --->Touchscreens
4) unselect "S3C touchscreen driver for Mini6410"
5) make
*/
#define CHANNELCOUNT 6
int main(int argc, char* argv[])
{
//int channels[CHANNELCOUNT] = {0,1,4,5,6,7}; //for 6410
int channels[CHANNELCOUNT] = {0,1,6,7,8,9}; //for 210
int channel;
int i=0;
fprintf(stderr, "press Ctrl-C to stop\n");
int fd = open("/dev/adc", 0);
if (fd < 0) {
perror("open ADC device:");
return 1;
}
char output[255];
for(;;) {
puts("\033[2J");
output[0] = 0;
for (i=0; i<CHANNELCOUNT; i++) {
channel = channels;
if (ioctl(fd, ADC_SET_CHANNEL, channel) < 0) {
perror("Can't set channel for /dev/adc!");
close(fd);
return 1;
}
char buffer[30];
int len = read(fd, buffer, sizeof buffer -1);
if (len > 0) {
buffer[len] = '\0';
int value = -1;
sscanf(buffer, "%d", &value);
char outbuff[255];
sprintf(outbuff, "AIN%d %d\n", channel, value);
strcat(output, outbuff);
} else {
perror("read ADC device:");
close(fd);
return 1;
}
}
printf("%s",output);
usleep(300* 10000);
}
close(fd);
}
结果是:
AIN0 123
AIN1 4028
AIN6 3322
AIN7 0
AIN8 0
AIN9 3874
用万用表测各通道引脚的电压,结果如下:
0、 0v
1、 -200mv
2、 1.5mv
3、 2.7mv
4、 190mv
5、 -100mv
我的输入是每个通道都是0V,但是通道1、6、9都不是0,而且如果我改变各通道的输入电压,通道1、6、9的输出是不随输入变化的,其他通道正常。
请问,这是什么原因造成的呢?硬件问题还是软件问题?
我还是过裸板的ADC程序,用的是mini210的裸板教程那套代码,发现同样的问题。
我现在给变一个通道的输入,另一个通道的值也会受到影响。
这个真的没法琢磨呀。
感觉好像是底板的问题。
期盼您的解答,谢谢!