打印

关于ADC的时间转换时间

[复制链接]
1136|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gxgclg|  楼主 | 2012-8-23 17:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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上说的那个转换时间出来。

相关帖子

沙发
sinadz| | 2012-8-23 18:03 | 只看该作者
你使用的gettimeofday()函数,是Use the cycle counter to estimate an displacement from the last time tick。可见,还与计时的基准有关,该函数的精度常常是毫秒级别的。  
  查一下你平台上实现的gettimeofday()计时基准是多少?

使用特权

评论回复
板凳
yybj| | 2012-8-23 18:28 | 只看该作者
没太明白LZ的描述

使用特权

评论回复
地板
autor| | 2012-9-3 20:21 | 只看该作者
太难了 看不懂

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

1653

帖子

1

粉丝