PDA

View Full Version : Thời gian ADC = ???


ht2_hv
21-11-2011, 10:33 AM
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
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ỉ???