![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: Jan 2011
Bài gửi: 4
: |
![]() 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 ![]() |
![]() |
![]() |
![]() |
#2 |
Đệ tử 3 túi
Tham gia ngày: Nov 2011
Bài gửi: 58
: |
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õ) |
![]() |
![]() |
![]() |
#3 |
Nhập môn đệ tử
Tham gia ngày: Jan 2011
Bài gửi: 4
: |
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(); } } } |
![]() |
![]() |
![]() |
#4 | |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Trích:
trích: { if(var_timer1_count == 2)//20us*2 { var_adc[var_adc_count++] = read_adc(); }
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. |
|
![]() |
![]() |
![]() |
#5 |
Nhập môn đệ tử
Tham gia ngày: Jan 2011
Bài gửi: 4
: |
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ỉ??? |
![]() |
![]() |
![]() |
Tags |
ladykiller, tdm |
|
|