当前位置: 代码迷 >> 驱动开发 >> ADC的实际转换时间
  详细解决方案

ADC的实际转换时间

热度:10   发布时间:2016-04-28 10:46:59.0
求助:ADC的实际转换时间
S3C2440的开发板,内核2.6.32自带的ADC驱动。

C/C++ code
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上说的那个转换时间出来。

------解决方案--------------------
你指的是采样频率么?

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

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