PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Thời gian ADC = ??? (http://www.picvietnam.com/forum/showthread.php?t=11892)

ht2_hv 21-11-2011 10:33 AM

Thời gian ADC = ???
 
Em có một con pic6f877 dùng thạch anh ngoài 20MHz vậy thời lấy mẫu nhỏ nhất có thể được là bao nhiêu? (em muốn lấy mẫu và lưu vào một mảng)
Đọc trong datasheet thì thấy cái thời gian
TACQ = Amplifier Settling Time + Hold Capacitor Charging Time + Temperature Coefficient
= TAMP + TC + TCOFF
mà không hiểu cho lắm, nó có liên quan gì đến thời gian lấy mẫu không, bác nào giải thích giúp, em xin cám ơn trước :D!

ladykiller 21-11-2011 11:30 AM

tần số lấy mẩu lớn nhất là tần số thạch anh chia 2, nhỏ nhất là tần số thạch anh chia 64
ngoài ra p16f877a còn có thể sử dụng tần số lấy mẩu từ dao động R/C ( cái này không xài nên không biết rõ)

ht2_hv 21-11-2011 04:23 PM

Cám ơn bác đã trả lời.
Em muốn hỏi thêm là như bác nói thì với thạch anh 20M thì thời gian lấy mẫu nhỏ nhất là 0.4 us, vậy sao em lấy mẫu trong 20 us mà chỉ được có 3 mẫu, các bác xem code có gì sai không???
code:

#include<16f877.h>
#include <_df_.h>
#use delay(clock = 20000000)
#use rs232(baud = 9600,parity = n,xmit = pin_C6, rcv = pin_C7)

int var_adc[];
int var_timer1_count = 0;
int16 var_adc_count = 0;

void init()
{
enable_interrupts(int_timer1);
setup_timer_1(t1_internal | t1_div_by_2);

set_timer1(65486);
//T_timer = (65536-65486)*4*2/20M = 20us
}

#int_timer1
void interrupt_timer1(void)
{
var_timer1_count++;
if(var_timer1_count != 2)
printf("%lu\n\r",var_adc_count);
set_timer1(65486);
}

void main(void)
{
enable_interrupts (GLOBAL);
setup_adc(adc_clock_div_2);
setup_adc_ports(AN0_AN1_VSS_VREF );
set_adc_channel(0);
init();
while(true)
{
if(var_timer1_count == 2)
{
var_adc[var_adc_count++] = read_adc();
}
}
}

tdm 21-11-2011 09:53 PM

Trích:

Nguyên văn bởi ht2_hv (Post 51713)
Cám ơn bác đã trả lời.
Em muốn hỏi thêm là như bác nói thì với thạch anh 20M thì thời gian lấy mẫu nhỏ nhất là 0.4 us, vậy sao em lấy mẫu trong 20 us mà chỉ được có 3 mẫu, các bác xem code có gì sai không???
code:

#include<16f877.h>
#include <_df_.h>
#use delay(clock = 20000000)
#use rs232(baud = 9600,parity = n,xmit = pin_C6, rcv = pin_C7)

int var_adc[];
int var_timer1_count = 0;
int16 var_adc_count = 0;

void init()
{
enable_interrupts(int_timer1);
setup_timer_1(t1_internal | t1_div_by_2);

set_timer1(65486);
//T_timer = (65536-65486)*4*2/20M = 20us
}

#int_timer1
void interrupt_timer1(void)
{
var_timer1_count++;
if(var_timer1_count != 2)
printf("%lu\n\r",var_adc_count);
set_timer1(65486);
}

void main(void)
{
enable_interrupts (GLOBAL);
setup_adc(adc_clock_div_2);
setup_adc_ports(AN0_AN1_VSS_VREF );
set_adc_channel(0);
init();
while(true)
{
if(var_timer1_count == 2)
{
var_adc[var_adc_count++] = read_adc();
}
}
}

theo như code bạn viết thì 40us mới lấy mẫu một lần
trích:
{
if(var_timer1_count == 2)//20us*2
{
var_adc[var_adc_count++] = read_adc();
}

ht2_hv 21-11-2011 10:24 PM

không phải là 40 us vì mình chỉ lấy mẫu trong thời gian mà biến var_timer1_count = 2
có nghĩa là khoảng thời gian giữa lần ngắt thứ 2 và thứ 3 của timer1 => thời gian chỉ có 20 us. Hic, nhưng dù thế thì tại sao chỉ có được 3 mẫu thôi nhỉ???


Múi giờ GMT. Hiện tại là 10:39 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam