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êm một câu hỏi về timer (http://www.picvietnam.com/forum/showthread.php?t=2618)

bachelor 18-07-2008 08:47 PM

thêm một câu hỏi về timer
 
tôi đang có một ứng dụng cần dùng bộ định thời nhưng khi làm thì thấy mắc vài chỗ, xin các cao thủ chỉ giáo dùm.
trước hết xin hỏi: khi sử dụng hàm set_timerX(Y) (tôi dùng CCS) ví dụ set_timer0(0); nó có reset lại bộ định thời tương ứng để bắt đầu đếm lại từ đầu không ?
Rất mong câu trả lời sớm của mọi người trong diễn đàn để tôi còn hỏi các câu khác :D
Thanks !

namqn 18-07-2008 09:26 PM

Trích:

Nguyên văn bởi bachelor (Post 17509)
tôi đang có một ứng dụng cần dùng bộ định thời nhưng khi làm thì thấy mắc vài chỗ, xin các cao thủ chỉ giáo dùm.
trước hết xin hỏi: khi sử dụng hàm set_timerX(Y) (tôi dùng CCS) ví dụ set_timer0(0); nó có reset lại bộ định thời tương ứng để bắt đầu đếm lại từ đầu không ?
Rất mong câu trả lời sớm của mọi người trong diễn đàn để tôi còn hỏi các câu khác :D
Thanks !

Bộ timer sử dụng một bộ đếm để thực hiện chức năng của nó. Nếu được cấu hình để đếm xung bất đồng bộ bên ngoài, nó làm việc như một bộ đếm. Nếu được cấu hình để đếm xung đồng hồ (có qua bộ chia hoặc không) bên trong PIC, nó làm việc như một đồng hồ.

Việc gọi hàm set_timerX(Y) sẽ đặt giá trị Y vào bộ đếm đó. Việc gọi hàm set_timer0(0) sẽ ghi giá trị 0 vào bộ đếm của timer0, và timer0 sẽ bắt đầu đếm từ giá trị đó, nếu nó được kích hoạt.

Reset có nhiều nghĩa, tùy theo cách bạn diễn dịch. Do đó, tôi không khẳng định việc gọi hàm set_timer0(0) sẽ "reset" bộ định thời, vì không rõ bạn ngụ ý gì khi nói đến "reset".

Thân,

bachelor 18-07-2008 10:23 PM

Trích:

Nguyên văn bởi namqn (Post 17511)
Bộ timer sử dụng một bộ đếm để thực hiện chức năng của nó. Nếu được cấu hình để đếm xung bất đồng bộ bên ngoài, nó làm việc như một bộ đếm. Nếu được cấu hình để đếm xung đồng hồ (có qua bộ chia hoặc không) bên trong PIC, nó làm việc như một đồng hồ.

Việc gọi hàm set_timerX(Y) sẽ đặt giá trị Y vào bộ đếm đó. Việc gọi hàm set_timer0(0) sẽ ghi giá trị 0 vào bộ đếm của timer0, và timer0 sẽ bắt đầu đếm từ giá trị đó, nếu nó được kích hoạt.

Reset có nhiều nghĩa, tùy theo cách bạn diễn dịch. Do đó, tôi không khẳng định việc gọi hàm set_timer0(0) sẽ "reset" bộ định thời, vì không rõ bạn ngụ ý gì khi nói đến "reset".

Thân,

Trước hết xin cảm ơn vì bạn đã trả lời rất nhanh mặc dù tôi vừa mới post câu hỏi !
Để bạn namqn dễ hình dung hơn tôi xin nêu cụ thể bài toán của mình như sau:
Tôi cần phải đo thời gian ở giữa hai xung. Ở đây tôi không dùng bộ định thời làm bộ đếm vì một số lý do thực tế. Phương án giải quyết của tôi là sử dụng timer0 với prescale=1, clock nội=1MHz(sử dụng thạch anh 4MHz) như vậy bộ định thời sẽ tràn ở 256us. Giả thiết là thời gian xuất hiện giữa hai xung luôn nhỏ hơn 256us, ở đây tôi sử dụng 2 xung này để làm nguồn ngắt ngoài cho vi xử lý (PIC16F877A). Với ngắt xuất hiện bởi xung thứ nhất tôi gọi hàm set_timer0(0); để bắt đầu đếm từ 0. Với ngắt xuất hiện bởi xung thứ hai tội gọi hàm get_timer0(); để lấy lại giá trị hiện thời của bộ đếm, giả sử giá trị trả về là 100 tức là thời gian giữ chậm giữa 2 xung là 100us.
Một vấn đề sẽ nảy sinh khi có 2 xung tiếp tục tới:
Ngắt bởi xung 1 -> Set_timer0(0);
-Nếu có reset -> bộ định thời lại bắt đầu đếm từ 0 -> đến ngắt bởi xung 2 -> get_timer0() sẽ cho ra một kết quả chính xác (giả sử lại là 100).
-Nếu không có reset-> bộ định thời tiếp tục đếm từ giá trị hiện thời (giả thiết cái xung 1 lần 2 cách xung 2 lần 1 1us thì giá trị hiện thời của bộ đếm là 101) -> đến ngắt bởi xung 2 -> get_timer0() trả về giá trị 201 là giá trị sai !
Đến đây chắc namqn đã hiểu khái niệm reset tôi muốn đề cập là gì và có thể trả lời tường tận giúp tôi. Mong bạn trả lời sớm
Thanks !

namqn 18-07-2008 11:21 PM

Về nguyên tắc, cách làm của bạn là ổn. Nếu bạn dùng hàm set_timer0(0) khi phát hiện xung thứ nhất, số đếm của timer0 sẽ được đặt là 0, và timer sẽ tiếp tục chạy nếu nó được kích hoạt (enabled). Ở xung thứ hai, bạn dùng hàm get_timer0() để lấy số đếm thì có thể đo được khoảng thời gian giữa hai xung.

Tuy nhiên, bạn cần chú ý là tồn tại thời gian trễ giữa thời điểm xuất hiện xung thứ nhất và tác động xóa số đếm của timer0 bằng lệnh set_timer0(0), cũng như giữa thời điểm xuất hiện xung thứ hai và lệnh get_timer0(). Nếu bạn cần độ chính xác cỡ 1 us, bạn cần phải xem xét kỹ lưỡng những yếu tố này, tốt nhất là dùng thực nghiệm để xác định độ lệch nếu có.

Có vẻ như bạn đã từng hỏi vấn đề này trên diễn đàn cách đây một dạo?

Thân,

bachelor 19-07-2008 12:01 PM

Trích:

Nguyên văn bởi namqn (Post 17514)
Về nguyên tắc, cách làm của bạn là ổn. Nếu bạn dùng hàm set_timer0(0) khi phát hiện xung thứ nhất, số đếm của timer0 sẽ được đặt là 0, và timer sẽ tiếp tục chạy nếu nó được kích hoạt (enabled). Ở xung thứ hai, bạn dùng hàm get_timer0() để lấy số đếm thì có thể đo được khoảng thời gian giữa hai xung.

Tuy nhiên, bạn cần chú ý là tồn tại thời gian trễ giữa thời điểm xuất hiện xung thứ nhất và tác động xóa số đếm của timer0 bằng lệnh set_timer0(0), cũng như giữa thời điểm xuất hiện xung thứ hai và lệnh get_timer0(). Nếu bạn cần độ chính xác cỡ 1 us, bạn cần phải xem xét kỹ lưỡng những yếu tố này, tốt nhất là dùng thực nghiệm để xác định độ lệch nếu có.

Có vẻ như bạn đã từng hỏi vấn đề này trên diễn đàn cách đây một dạo?

Thân,

Thanhks, như vậy là đã rõ về hàm set_timerX();
Vấn đề tiếp theo :)
Trở lại bài toán mà tôi đã đề cập ở trên, tuy nhiên khi này khoảng cách (thời gian) giữa 2 xung thay đổi trong một dải lớn, giả thiết là từ 100us đến 10ms.
Vẫn sử dụng timer0 làm bộ định thời với clock nội = 1MHz, prescale = 1.
Khi này không thể sử dụng cách mà tôi đã nêu ở bài trước (vì với những khoảng thời gian > 256us thì rõ ràng hàm get_timer0() sẽ trả về giá trị sai)
Trong trường hợp này phương án giải quyết của tôi như sau:
- ở phần khởi tạo, cho phép ngắt bởi bộ định thời 0.
- phần chương trình thực hiện bởi ngắt định thời 0: tăng biến đếm i lên 1 (i là biến toàn cục)
- ngắt ngoài khi có xung thứ nhất đến: gán i = 0; gọi hàm set_timer0(0); gọi hàm enable_interrupts(INT_TIMER0);
- ngắt ngoài khi có xung thứ hai đến: diasble_interrupts(INT_TIMER0); Thời gian cần đo = i*256 + get_timer0(); [đơn vị us]
Khi test chương trình trên proteus với khoảng cách xung lớn thì khá chính xác, nhưng khi khoảng cách nhỏ hơn 256 us thì kết quả ra không chính xác và thay đổi loạn cả lên, không hiểu vì sao :(
Vậy mong mọi người xem qua phương án giải quyết bài toán của tôi và chỉ giùm tôi chỗ sai sót.
To Namqn: Trên thực tế bài toán tôi cần giải quyết cho phép sai số 1 vài us khi đo. Cũng lâu rồi không vào diễn đàn, quả thật đã từng hỏi vấn đề này nhưng trước đó tôi hỏi theo khía cạnh khác có thể nói là không liên quan :D . Thanks !

namqn 19-07-2008 08:48 PM

Trích:

Nguyên văn bởi bachelor (Post 17534)
Thanhks, như vậy là đã rõ về hàm set_timerX();
Vấn đề tiếp theo :)
Trở lại bài toán mà tôi đã đề cập ở trên, tuy nhiên khi này khoảng cách (thời gian) giữa 2 xung thay đổi trong một dải lớn, giả thiết là từ 100us đến 10ms.
Vẫn sử dụng timer0 làm bộ định thời với clock nội = 1MHz, prescale = 1.
Khi này không thể sử dụng cách mà tôi đã nêu ở bài trước (vì với những khoảng thời gian > 256us thì rõ ràng hàm get_timer0() sẽ trả về giá trị sai)
Trong trường hợp này phương án giải quyết của tôi như sau:
- ở phần khởi tạo, cho phép ngắt bởi bộ định thời 0.
- phần chương trình thực hiện bởi ngắt định thời 0: tăng biến đếm i lên 1 (i là biến toàn cục)
- ngắt ngoài khi có xung thứ nhất đến: gán i = 0; gọi hàm set_timer0(0); gọi hàm enable_interrupts(INT_TIMER0);
- ngắt ngoài khi có xung thứ hai đến: diasble_interrupts(INT_TIMER0); Thời gian cần đo = i*256 + get_timer0(); [đơn vị us]
Khi test chương trình trên proteus với khoảng cách xung lớn thì khá chính xác, nhưng khi khoảng cách nhỏ hơn 256 us thì kết quả ra không chính xác và thay đổi loạn cả lên, không hiểu vì sao :(
Vậy mong mọi người xem qua phương án giải quyết bài toán của tôi và chỉ giùm tôi chỗ sai sót.
To Namqn: Trên thực tế bài toán tôi cần giải quyết cho phép sai số 1 vài us khi đo. Cũng lâu rồi không vào diễn đàn, quả thật đã từng hỏi vấn đề này nhưng trước đó tôi hỏi theo khía cạnh khác có thể nói là không liên quan :D . Thanks !

Về mặt nguyên tắc, phương pháp thực hiện của bạn là ổn. Trong thực tế, có những yếu tố dẫn đến sai lệch kết quả đo mà bạn không đánh giá trong phương pháp trên.

Như tôi đã nói ở post trên, có thời gian trễ giữa thời điểm xuất hiện xung và việc diễn ra các thao tác. Cụ thể: khi xuất hiện xung thứ nhất, vài chu kỳ máy sau trình phục vụ ngắt ngoài mới được thực hiện, và mất thêm vài chu kỳ máy nữa cho việc lưu các thanh ghi cần được lưu (việc này trình biên dịch tự làm) rồi mới đến các lệnh thực sự. Khi xuất hiện xung thứ hai, tương tự như vậy, cũng mất một khoảng thời gian nữa mới đến việc thực thi các lệnh mà bạn muốn thực hiện cho trường hợp này, bên trong chương trình phục vụ ngắt. Thời gian trễ ở trường hợp thứ nhất và trường hợp thứ hai có thể khác nhau. Điều quan trọng hơn nữa, thứ tự thực hiện lệnh cho các trường hợp sẽ ảnh hưởng rất lớn đến sai lệch của kết quả.

Bạn nên chỉnh lại thứ tự thực hiện như sau (cho trình phục vụ ngắt ngoài):
- Ngắt ngoài khi có xung thứ nhất đến: gọi hàm set_timer0(0); gọi hàm enable_interrupts(INT_TIMER0); gán i = 0;
- Ngắt ngoài khi có xung thứ hai đến: biến_tạm = get_timer0(), diasble_interrupts(INT_TIMER0); thời gian cần đo = i*256 + biến_tạm; [đơn vị us]

Tuy nhiên, tôi cho rằng phương pháp sau tốt hơn:
1. Khởi tạo timer0 và cho phép ngắt timer0, nhưng timer0 chưa chạy; xóa thanh ghi timer0

2. Giả thiết bạn dùng PIC16/PIC18, chương trình phục vụ ngắt sẽ kiểm tra ngắt ngoài trước rồi mới kiểm tra ngắt timer0

3. Ngắt ngoài khi có xung thứ nhất đến: bật timer0 bằng hợp ngữ; gán i = 0;

4. Ngắt ngoài khi có xung thứ hai đến: đọc thanh ghi timer0 vào biến_tạm bằng hợp ngữ; tắt timer0; xóa thanh ghi timer0; thời gian cần đo = i*256 + biến_tạm; [đơn vị us]

5. Phần code phục vụ ngắt timer0 chỉ tăng i

6. Nếu thời gian đo được luôn lớn hơn hay nhỏ hơn thời gian thực tế, bạn có thể bù sai lệch này trong công thức tính thời gian cần do.

Cần nhớ: Thứ tự viết code là quan trọng, vì bạn đo thời gian, mà các lệnh cũng cần thời gian để thực thi.

Thân,

bachelor 20-07-2008 01:28 PM

Trích:

Nguyên văn bởi namqn (Post 17546)
Về mặt nguyên tắc, phương pháp thực hiện của bạn là ổn. Trong thực tế, có những yếu tố dẫn đến sai lệch kết quả đo mà bạn không đánh giá trong phương pháp trên.

Như tôi đã nói ở post trên, có thời gian trễ giữa thời điểm xuất hiện xung và việc diễn ra các thao tác. Cụ thể: khi xuất hiện xung thứ nhất, vài chu kỳ máy sau trình phục vụ ngắt ngoài mới được thực hiện, và mất thêm vài chu kỳ máy nữa cho việc lưu các thanh ghi cần được lưu (việc này trình biên dịch tự làm) rồi mới đến các lệnh thực sự. Khi xuất hiện xung thứ hai, tương tự như vậy, cũng mất một khoảng thời gian nữa mới đến việc thực thi các lệnh mà bạn muốn thực hiện cho trường hợp này, bên trong chương trình phục vụ ngắt. Thời gian trễ ở trường hợp thứ nhất và trường hợp thứ hai có thể khác nhau. Điều quan trọng hơn nữa, thứ tự thực hiện lệnh cho các trường hợp sẽ ảnh hưởng rất lớn đến sai lệch của kết quả.

Bạn nên chỉnh lại thứ tự thực hiện như sau (cho trình phục vụ ngắt ngoài):
- Ngắt ngoài khi có xung thứ nhất đến: gọi hàm set_timer0(0); gọi hàm enable_interrupts(INT_TIMER0); gán i = 0;
- Ngắt ngoài khi có xung thứ hai đến: biến_tạm = get_timer0(), diasble_interrupts(INT_TIMER0); thời gian cần đo = i*256 + biến_tạm; [đơn vị us]

Tuy nhiên, tôi cho rằng phương pháp sau tốt hơn:
1. Khởi tạo timer0 và cho phép ngắt timer0, nhưng timer0 chưa chạy; xóa thanh ghi timer0

2. Giả thiết bạn dùng PIC16/PIC18, chương trình phục vụ ngắt sẽ kiểm tra ngắt ngoài trước rồi mới kiểm tra ngắt timer0

3. Ngắt ngoài khi có xung thứ nhất đến: bật timer0 bằng hợp ngữ; gán i = 0;

4. Ngắt ngoài khi có xung thứ hai đến: đọc thanh ghi timer0 vào biến_tạm bằng hợp ngữ; tắt timer0; xóa thanh ghi timer0; thời gian cần đo = i*256 + biến_tạm; [đơn vị us]

5. Phần code phục vụ ngắt timer0 chỉ tăng i

6. Nếu thời gian đo được luôn lớn hơn hay nhỏ hơn thời gian thực tế, bạn có thể bù sai lệch này trong công thức tính thời gian cần do.

Cần nhớ: Thứ tự viết code là quan trọng, vì bạn đo thời gian, mà các lệnh cũng cần thời gian để thực thi.

Thân,

Cám ơn gợi ý của namqn, sẽ nghiên cứu chèn các mã asm thích hợp để tối ưu hóa thời gian xử lý của chương trình.
Thêm một câu hỏi nữa :) :
1. Các xung làm nguồn ngắt ngoài có độ rộng (rỗng) 0,5 us đến 1 us. Không biết các ngắt ngoài có đáp ứng được không nhỉ (tôi chọn kích hoạt ngắt theo sườn lên). Mô phỏng trên proteus thì vẫn xử lý được, chưa thử thực tế :D
2. Hai xung (mà chương trình cần đo khoảng cách thời gian giữa chúng) không nằm cùng một kênh (một đường tín hiệu). Đây là lý do tôi không thể dùng timer như một counter mà phải dùng đến ngắt ngoài và sẽ phải dùng đến 2 ngắt ngoài cho 2 xung. 16f877a lại chỉ có một ngắt ngoài. Liệu có thể dùng một chân ngắt của PortB làm ngắt ngoài được không ? Lưu ý là độ rộng xung chỉ có từ 0,5 - 1 us , thằng ngắt ngoài thì còn khả dĩ nhưng liệu thằng ngắt cổng B có đáp ứng được không nhỉ ? Hay phải dùng đến PIC18 -> đắt :D
Hai vấn đề này có vẻ hơi lạc với chủ đề đề cập ban đầu nhưng lại là những câu hỏi mang tính thực tế :) Những ai đã từng có kinh nghiệm xử lý các chuỗi xung với các tham số tương tự bằng PIC16 or PIC18 hãy giúp tôi với nhé :)
Thanhks !

namqn 20-07-2008 08:26 PM

Trích:

Nguyên văn bởi bachelor (Post 17555)
Cám ơn gợi ý của namqn, sẽ nghiên cứu chèn các mã asm thích hợp để tối ưu hóa thời gian xử lý của chương trình.
Thêm một câu hỏi nữa :) :
1. Các xung làm nguồn ngắt ngoài có độ rộng (rỗng) 0,5 us đến 1 us. Không biết các ngắt ngoài có đáp ứng được không nhỉ (tôi chọn kích hoạt ngắt theo sườn lên). Mô phỏng trên proteus thì vẫn xử lý được, chưa thử thực tế :D
2. Hai xung (mà chương trình cần đo khoảng cách thời gian giữa chúng) không nằm cùng một kênh (một đường tín hiệu). Đây là lý do tôi không thể dùng timer như một counter mà phải dùng đến ngắt ngoài và sẽ phải dùng đến 2 ngắt ngoài cho 2 xung. 16f877a lại chỉ có một ngắt ngoài. Liệu có thể dùng một chân ngắt của PortB làm ngắt ngoài được không ? Lưu ý là độ rộng xung chỉ có từ 0,5 - 1 us , thằng ngắt ngoài thì còn khả dĩ nhưng liệu thằng ngắt cổng B có đáp ứng được không nhỉ ? Hay phải dùng đến PIC18 -> đắt :D
Hai vấn đề này có vẻ hơi lạc với chủ đề đề cập ban đầu nhưng lại là những câu hỏi mang tính thực tế :) Những ai đã từng có kinh nghiệm xử lý các chuỗi xung với các tham số tương tự bằng PIC16 or PIC18 hãy giúp tôi với nhé :)
Thanhks !

1. Tôi không rõ các ngắt ngoài có thể đáp ứng với các xung đó hay không. Nhưng nếu các xung không đủ rộng thì tôi chỉ cần kéo dài các xung đó ra. Tôi ít khi mô phỏng mà chỉ dùng mạch thật để thử nghiệm cho những bài toán loại này.

2. Một cổng OR 2 ngõ vào đơn giản sẽ giúp tôi dồn 2 tín hiệu đó vào một chân ngắt ngoài. Không nhất thiết phải dùng vi mạch logic, mà vài linh kiện rời vẫn có thể thực hiện chức năng này.

Thân,

bachelor 20-07-2008 10:26 PM

Trích:

Nguyên văn bởi namqn (Post 17558)
1. Tôi không rõ các ngắt ngoài có thể đáp ứng với các xung đó hay không. Nhưng nếu các xung không đủ rộng thì tôi chỉ cần kéo dài các xung đó ra. Tôi ít khi mô phỏng mà chỉ dùng mạch thật để thử nghiệm cho những bài toán loại này.

2. Một cổng OR 2 ngõ vào đơn giản sẽ giúp tôi dồn 2 tín hiệu đó vào một chân ngắt ngoài. Không nhất thiết phải dùng vi mạch logic, mà vài linh kiện rời vẫn có thể thực hiện chức năng này.

Thân,

Càng ngày càng đi chệch ra khỏi các chủ đề của diễn đàn :) nhưng vẫn theo luồng nên tiện hỏi luôn :D
1. Namqn có thể chỉ giúp một vài sơ đồ mạch kéo dãn độ rộng xung sử dụng đc trong trường hợp này (với yêu cầu sườn trước của xung sau mạch hiệu chỉnh không được giữ chậm quá nhiều so với xung đầu vào)
2. Cái này theo tôi hơi khó, vì độ rộng của xung chỉ có từ 0,5 - 1 us có nghĩa là thời gian ngõ vào ở mức "1" rất nhỏ -> lại trở lại vấn đề tìm được các linh kiện rời or IC có thời gian đáp ứng đủ nhỏ là rất khó khăn. Nếu có thể Namqn chỉ giùm tôi luôn :)
Thanks !

namqn 20-07-2008 11:59 PM

Trích:

Nguyên văn bởi bachelor (Post 17561)
Càng ngày càng đi chệch ra khỏi các chủ đề của diễn đàn :) nhưng vẫn theo luồng nên tiện hỏi luôn :D
1. Namqn có thể chỉ giúp một vài sơ đồ mạch kéo dãn độ rộng xung sử dụng đc trong trường hợp này (với yêu cầu sườn trước của xung sau mạch hiệu chỉnh không được giữ chậm quá nhiều so với xung đầu vào)
2. Cái này theo tôi hơi khó, vì độ rộng của xung chỉ có từ 0,5 - 1 us có nghĩa là thời gian ngõ vào ở mức "1" rất nhỏ -> lại trở lại vấn đề tìm được các linh kiện rời or IC có thời gian đáp ứng đủ nhỏ là rất khó khăn. Nếu có thể Namqn chỉ giùm tôi luôn :)
Thanks !

1. Đã giới thiệu cho bạn các sơ đồ mạch monostable bên DTVN để bạn nắm được cách thức hoạt động của mạch. Với các xung có độ rộng khoảng 1 us trở lại, bạn có thể dùng các vi mạch chuyên dụng, loại monostable multivibrator, như 74HC123, hay 74HC221. Các vi mạch này chấp nhận xung ngõ vào có độ rộng tối thiểu là 20 ns ở nguồn 5 V, có lẽ thừa đủ cho yêu cầu của bạn.

2. Các vi mạch logic như 74HC32 (4 mạch OR 2 ngõ vào) có thời gian trễ lan truyền khoảng 20 ns ở nguồn 5 V, có lẽ không gặp vấn đề gì với xung của bạn. Không rõ bạn đã thử dùng các vi mạch loại này chưa mà bảo rằng không tìm được các IC có thời gian đáp ứng đủ nhỏ.

Thân,

bachelor 25-07-2008 11:32 PM

Trích:

Nguyên văn bởi namqn (Post 17567)
1. Đã giới thiệu cho bạn các sơ đồ mạch monostable bên DTVN để bạn nắm được cách thức hoạt động của mạch. Với các xung có độ rộng khoảng 1 us trở lại, bạn có thể dùng các vi mạch chuyên dụng, loại monostable multivibrator, như 74HC123, hay 74HC221. Các vi mạch này chấp nhận xung ngõ vào có độ rộng tối thiểu là 20 ns ở nguồn 5 V, có lẽ thừa đủ cho yêu cầu của bạn.

2. Các vi mạch logic như 74HC32 (4 mạch OR 2 ngõ vào) có thời gian trễ lan truyền khoảng 20 ns ở nguồn 5 V, có lẽ không gặp vấn đề gì với xung của bạn. Không rõ bạn đã thử dùng các vi mạch loại này chưa mà bảo rằng không tìm được các IC có thời gian đáp ứng đủ nhỏ.

Thân,

Cám ơn vì cả bài bên DTVN :D
Quả thật chưa thử bao giờ, để xem thị trường ngoài Bắc có con này không đã !
Thanks !


Múi giờ GMT. Hiện tại là 05:11 PM.

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