求助:ADC的实际转换时间

时间:2022-10-27 17:24:10
S3C2440的开发板,内核2.6.32自带的ADC驱动。


static ssize_t s3c2410_adc_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
char str[20];
int value;
struct timeval tstart,tend;    //添加
size_t len;
        do_gettimeofday(&tstart);      //添加
if (down_trylock(&ADC_LOCK) == 0) {
OwnADC = 1;
START_ADC_AIN(adcdev.channel, adcdev.prescale);

wait_event_interruptible(adcdev.wait, ev_adc);

ev_adc = 0;

//while(!(ADCCON & ADC_ENDCVT));
//adc_data = ADCDAT0 & 0x3ff;//

value = adc_data;
OwnADC = 0;
up(&ADC_LOCK);
} else {
value = -1;
}

        do_gettimeofday(&tend);     //添加
        printk("AD time: %ld us  value:%d \n", (tend.tv_usec-tstart.tv_usec),value);    //添加

len = sprintf(str, "%d\n", value);
if (count >= len) {
int r;
r = copy_to_user(buffer, str, len);
return r ? r : len;
} else {
return -EINVAL;
}
}


出来的结果是1380us,我又试了不要中断的方式,屏蔽wait_event,直接等待寄存器的15位置位,时间同样是1380us左右,没有变化。

我没改过PCLK那些,估计就是50M吧,另外我的预分频是0xFF,按照公式1/(50M/256/5)=25us

但实际程序为什么是1300多个us。我把AD中断里的程序都屏蔽掉了。

do_gettimeofday这个函数我验证过,算是正确的,虽然有点点误差,也不至于那么大。

求大神帮忙解释下!试来试去都试不出datasheet上说的那个转换时间出来。

7 个解决方案

#1


没太明白你的描述

 ADC,,,模拟量不变,,数字量肯定是固定的嘛

 ADC,不难的,,, 说白了,就是采样而已

 有空看看我的贴过的ADC转换例程

#2


引用 1 楼  的回复:
没太明白你的描述

 ADC,,,模拟量不变,,数字量肯定是固定的嘛

 ADC,不难的,,, 说白了,就是采样而已

 有空看看我的贴过的ADC转换例程

假如要算一次代码里的ADC的转换时间,用什么语句去算呢?
理论值是50M/预分频,再除5,再倒数,得出是5us。
我的意思就是实际代码里运行的时间和理论值5us相差很多很多

#3


你指的是采样频率么?

 也就是,多少时间做一次ADC 转换么?

#4


  你使用的gettimeofday()函数,是Use the cycle counter to estimate an displacement from the last time tick。可见,还与计时的基准有关,该函数的精度常常是毫秒级别的。 
   查一下你平台上实现的gettimeofday()计时基准是多少?

#5


引用 3 楼  的回复:
你指的是采样频率么?

 也就是,多少时间做一次ADC 转换么?

想知道从ADC转换开始到结束需要花费多少时间。

#6


引用 4 楼  的回复:
你使用的gettimeofday()函数,是Use the cycle counter to estimate an displacement from the last time tick。可见,还与计时的基准有关,该函数的精度常常是毫秒级别的。 
  查一下你平台上实现的gettimeofday()计时基准是多少?

tv_usec我使用的是结构体里的这个变量。


结构体原型是这样的:
struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};
millisecond        毫秒
microsecond        微秒

#7


引用 4 楼  的回复:
你使用的gettimeofday()函数,是Use the cycle counter to estimate an displacement from the last time tick。可见,还与计时的基准有关,该函数的精度常常是毫秒级别的。 
  查一下你平台上实现的gettimeofday()计时基准是多少?

tv_usec我使用的是结构体里的这个变量。


结构体原型是这样的:
struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};
millisecond        毫秒
microsecond        微秒

#1


没太明白你的描述

 ADC,,,模拟量不变,,数字量肯定是固定的嘛

 ADC,不难的,,, 说白了,就是采样而已

 有空看看我的贴过的ADC转换例程

#2


引用 1 楼  的回复:
没太明白你的描述

 ADC,,,模拟量不变,,数字量肯定是固定的嘛

 ADC,不难的,,, 说白了,就是采样而已

 有空看看我的贴过的ADC转换例程

假如要算一次代码里的ADC的转换时间,用什么语句去算呢?
理论值是50M/预分频,再除5,再倒数,得出是5us。
我的意思就是实际代码里运行的时间和理论值5us相差很多很多

#3


你指的是采样频率么?

 也就是,多少时间做一次ADC 转换么?

#4


  你使用的gettimeofday()函数,是Use the cycle counter to estimate an displacement from the last time tick。可见,还与计时的基准有关,该函数的精度常常是毫秒级别的。 
   查一下你平台上实现的gettimeofday()计时基准是多少?

#5


引用 3 楼  的回复:
你指的是采样频率么?

 也就是,多少时间做一次ADC 转换么?

想知道从ADC转换开始到结束需要花费多少时间。

#6


引用 4 楼  的回复:
你使用的gettimeofday()函数,是Use the cycle counter to estimate an displacement from the last time tick。可见,还与计时的基准有关,该函数的精度常常是毫秒级别的。 
  查一下你平台上实现的gettimeofday()计时基准是多少?

tv_usec我使用的是结构体里的这个变量。


结构体原型是这样的:
struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};
millisecond        毫秒
microsecond        微秒

#7


引用 4 楼  的回复:
你使用的gettimeofday()函数,是Use the cycle counter to estimate an displacement from the last time tick。可见,还与计时的基准有关,该函数的精度常常是毫秒级别的。 
  查一下你平台上实现的gettimeofday()计时基准是多少?

tv_usec我使用的是结构体里的这个变量。


结构体原型是这样的:
struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};
millisecond        毫秒
microsecond        微秒