![]() |
|
Tài trợ cho PIC Vietnam |
PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
PIC Bang chủ
|
Nguyên tắc quãng đường = thời gian * vận tốc/2, người ta còn gọi là flying time, và phương pháp định vị người ta gọi là TOF = Time Of Flight. Có lẽ vì bạn dùng từ timedelay = độ giữ chậm thì anh Nam không hiểu.
Nguyên tắc này nói một cách sơ lược, đó là thời điểm Về bài toán của bạn, thực chất không có gì khác bài toán siêu âm, tuy nhiên, một vấn đề rất nghiêm trọng, đó là thời gian bay của sóng của bạn quá nhanh (bằng vận tốc ánh sáng). Do vậy, VIKO thực sự làm việc gì? VIKO thực hiện giống như trên cái thước ban-me, có nghĩa là nó phát ra xung liên tục ở một độ phân giải nhất định, sau đó đến khi nào có sự trùng lặp sóng, thì nó xác định được độ phân giải đó. Bởi vì thực tế, không thể phát hiện được độ sai lệch thời gian khi sóng chuyển động với vận tốc ánh sáng. Đây là một giải pháp khá hay, dùng giải pháp của thước ban-me cơ để đo thời gian ![]() ![]() Oki, việc đơn giản, đó là bạn nhận xung về. Chính xác là bạn cần phải dùng ngắt ngoài để xử lý thôi, nhưng một lưu ý rằng, độ rộng xung của bạn rất nhỏ, nó bắt cạnh lên, chúng ta quan tâm ở đó đã. Ngắt xảy ra trong PIC chiếm khoảng 20 - 30 dòng lệnh, nếu viết tối ưu code và phụ thuộc chương trình, sẽ có thể giảm nữa. Tổng cộng riêng xử lý ngắt hết khoảng 5 - 10us. Như vậy, đây sẽ là sai số chủ yếu mà bạn cần phải tính đến. Nói chung, giải pháp dùng ngắt của bạn hoàn toàn không có gì không được cả. Dùng ngắt đọc cạnh lên của xung là oki, còn phần cạnh xuống, không biết bạn có cần đọc không, vì mình không biết chi tiết và nguyên lý chính xác của nó như thế nào. Nhưng mà nếu phải đọc cạnh xuống nữa, thì cái này thật là khó. Nếu phải đọc cạnh xuống nữa, thì phải thực hiện như sau: Ngắt cạnh lên enable lại ngắt ngoài (dùng ngắt trong ngắt để lưu lại giá trị cạnh xuống), sau đó xử lý cả hai. Đây là giải pháp. Bạn xem bài viết về xử lý ngắt trong ngắt bên dientuvietnam, box Vi điều khiển PIC, bài viết những câu đố vui... Còn vấn đề xử lý ngắt như thế nào, tuỳ vào bạn muốn viết chương trình bằng MPASM hay C? Có bài hướng dẫn của F bên phần Học PIC trong 1 ngày, để viết ngắt cho PIC trong MPASM. Thuật toán của bạn sẽ phải được thực hiện như sau: Đặt timer = 0; Phát xung (nhớ tính toán lại thời gian thực chính xác khi xung được phát đi); Chờ tín hiệu phản hổi trên chân RB0 (ngắt ngoài); Nếu có ngắt đọc timer; giá trị timer chính là giá trị TOF Nếu không (không có vật cản) thoát; Chỉ đơn giản vậy thôi. Còn việc xử lý chi tiết của hệ thống bạn thế nào, thực tình F không biết cái hệ thống VIKO nó ra sao, như thế nào, nguyên lý hoạt động thể nào, chỉ dựa vào mô tả của bạn để đoán ra nguyên lý hoạt động. Nếu có thể, bạn mô tả nguyên lý hoạt động và có hình ảnh minh hoạ rõ hơn, chúng ta sẽ có bài toán hay đó, vì làm một cái thước ban-me để đo thời gian đúng là một ý tưởng hay, chỉ không biết độ phân giải của nó là cỡ nào thôi. Chúc vui PS> Về việc bạn đăng nhập không thành công, nhớ thông báo cho F qua email, và bạn thử chọn nút ghi nhớ user, pw rồi đăng nhập, F nghĩ như vậy sẽ thành công. Goodluck
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
![]() |
![]() |
![]() |
#2 |
Đệ tử 1 túi
Tham gia ngày: Jun 2006
Bài gửi: 20
: |
- Về việc đăng nhập ko thành công, cám ơn ADMIN đã hướng dẫn, tôi sẽ thử theo cách của bạn, có lẽ tại tôi sử dụng mạng công cộng (INTERNET TRÀ ĐÁ !!!) nên đôi khi mạng cũng hơi bị đơ 1 chút (điều này khi còn ở VN chắc F cũng đã biết).
- Về bài toán tính TOF: Thuật toán để tính TOF của 1 xung phản xạ cơ bản đúng như F đã trình bày (chỉ xử lý cạnh lên thôi, ko cần xử lý cạnh xuống). Nhưng trong bài toán của tôi ko chỉ có 1 xung phản xạ mà có thể nhiều hơn, và quan trọng là CHÚNG NẰM CÙNG TRÊN 1 KÊNH, có nghĩa là nếu tôi dùng 1 chân nào đó (chân số 1 của PIC chẳng hạn) để làm chân nhận tín hiệu ngắt ngoài của xung phản xạ, tương tự chân 0 nhận tín hiệu ngắt của xung chuẩn và phát triển chương trình theo thuật toán mà F đã trình bày thì sẽ xuất hiện các trường hợp sau: 1 Phát xung chuẩn (xung thăm dò) -> kích hoạt chương trình ngắt tại chân 0 chương trình này sẽ set time = 0. 2 Nhận được xung phản xạ 1 -> kích hoạt chương trình ngắt tại chân 1, chương trình này sẽ read time, TOF1 = giá trị time đọc được 3 Chấm hết ko có gì xảy ra ở chân 1 nữa -> dễ quá đợi đến khi có xung chuẩn xuất hiện tại chân 0 (sau 10 giây nữa) quay trở lại bước 1 4 Lại nhận được xung phản xạ 2 tại chân 1 -> làm gì tiếp đây ? Theo tôi lúc này chương trình ngắt tại chân 1 (gọi tắt Là CTN1) và chg trình ngắt chân 0 (CTN0) sẽ phải thay đổi, cụ thể là cần thêm 1 cái biến counter toàn cục (tạm gọi là C), CTN0 sẽ set C = 0, CTN1 sẽ tăng C lên 1 và kiểm tra, nếu C = 1 -> TOF1 = giá trị time đọc được, nếu C = 2 -> TOF2 = TOF1 + giá trị time đọc được, nếu C = n -> TOFn = TOF(n-1) + readtime(), tất nhiên n <7 - Như F nói thời gian xử lý ngắt khoảng 5-10us, OK quá đủ để tính TOF, tuy nhiên sẽ là ko đủ nếu các xung phản xạ quá gần nhau (tức là các mục tiêu bay sát nhau) khi này có lẽ CTN1 chỉ xử lý được với TOF1, đây là 1 vấn đề mà tôi chưa giải quyết được. - Thêm 1 vấn đề nữa, TOF giảm dần từ vài ms tới 0 (khi TOF = 0 và mục tiêu là 1 quả tên lửa không đối đất thì... BÙM... VIKO và hệ thống phòng không xung quanh nó sẽ biến mất trên bản đồ địa chính !!!) nhưng độ phân giải của các xung phản xạ lại tăng dần (khi các mục tiêu ở xa VIKO thì độ phân giải cỡ vài us và sẽ tăng dần khi chúng bay dần vào đài VIKO), thế thì cần phải cho bộ định thời hoạt động trong chế độ nào đây ? 16 bit hay 8 bit ? Hay là bỏ cách tư duy này đi, nhưng tôi chưa nghĩ ra cách nào hay hơn cả ! F và các bạn giúp tôi với nhé !!! Thân !!! |
![]() |
![]() |
![]() |
#3 |
PIC Bang chủ
|
Vậy bạn có thể cung cấp hình vẽ giản đồ xung sơ bộ để F và các bạn khác hiểu rõ hơn về bài toán của bạn được không, vì bạn dùng một số từ tiếng Việt về xung chuẩn, xung mẫu... nhưng F lại không hiểu rõ về thiết bị của bạn, nên rất khó hiểu các từ tiếng Việt này. Kể cả khi từ tiếng Anh, dùng trong một ngữ cảnh nào đó, phải thuộc chuyên ngành mới biết. Vậy tốt nhất bạn nên vẽ giản đồ xung ra cho mọi người xem nhé. Nên vẽ màu sắc khác nhau, mô tả bằng hình là trực quan nhất.
Chúc vui
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
![]() |
![]() |
![]() |
#4 | |
Đệ tử 1 túi
Tham gia ngày: Jun 2006
Bài gửi: 20
: |
Trích:
Thân ! ![]() thay đổi nội dung bởi: falleaf, 24-06-2006 lúc 11:08 PM. |
|
![]() |
![]() |
![]() |
#5 |
PIC Bang chủ
|
Mọi người chú ý khi post hình thì dùng photobucket.com để post hình và lưu trữ hình trên đó nhé, như vậy sẽ thuận tiện hơn cho việc theo dõi.
Như vậy, mình muốn hỏi thêm, giả sử như không nhận được xung phản xạ thì thôi, nhưng nếu nhận được xung phản xạ thứ nhất, thì phải chờ bao nhiêu xung phản xạ phía sau nữa? Và khoảng cách giữa những xung phản xạ này thực ra sẽ rất ngắn, vì nó bay với tốc độ ánh sáng. Như vậy, với tốc độ của vi điều khiển, liệu có đáp ứng được tốc độ đọc này không? Giả sử bắt được hết các xung phản xạ, yên tâm, có giải pháp để bắt được hết, nhưng mà vấn đề độ phân giải là quan trọng, cho nên giới hạn giữa hai xung liên tiếp, gần nhất là bao nhiêu? Xa nhất là bao nhiêu? (trong thực tế), và tối đa có thể có bao nhiêu xung phản xạ sẽ thu được (con số mong đợi, hoặc tối đa hoặc tối thiểu để tính toán xử lý). Chúc vui
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
![]() |
![]() |
![]() |
#6 | |
Đệ tử 1 túi
Tham gia ngày: Jun 2006
Bài gửi: 20
: |
Trích:
- Số lượng các xung phản xạ dao động từ 0 (khi ko có mục tiêu) đến 6 (ở bài trước tôi đã nói rồi mà n < 7), n sẽ ko cố định mà có thể thay đổi (bạn cứ hình dung: giả sử ban đầu có 6 mục tiêu (tối đa) bay vào -> có 6 xung phản xạ, sau đó tùy tình huống có thể 1 mục tiêu phát nhiễu hoặc cơ động vòng ra(tức là bay ra khỏi vùng quan sát được của VIKO) -> số lượng xung phản xạ giảm đi) nói chung tối đa là 6 xung - Khoảng cách gần nhất giữa các xung là 5us (cứ cho là như vậy đi để bài toán đỡ phức tạp hơn) còn khoảng cách xa nhất là 10s (nếu nhìn vào giản đồ xung bạn sẽ thấy điều này - bởi vì nếu khoảng cách đó vượt quá 10s nó sẽ bị lầm sang chu kỳ sau và trên thực tế không có xung phản xạ nào như vậy cả) - Để F và các bạn dễ hình dung hơn tôi sẽ post lên đây chương trình mô phỏng VIKO của tôi, tất nhiên vẫn đang trong giai đoạn test và các mục tiêu là giả Thân !!! |
|
![]() |
![]() |
![]() |
#7 | |
PIC Bang chủ
|
Trích:
Chúng ta có một số ràng buộc cần phải thực hiện. Giải sử, với 5us, chúng ta có thể thực hiện khoảng 20 lệnh (không dùng thạch anh tốc độ cao hơn), nhưng giả sử dùng dsPIC tốc độ cao hơn thì chúng ta có thể bớt đi một chút nguy hiểm, nhưng F cứ giả sử là như vậy đã để chúng ta giải quyết bài toán. Giải pháp 1, chúng ta giảm bớt những câu lệnh trong chương trình ngắt ngoài: Timer_temp[i] = timer i = i+1; Cái này dùng để giữ giá trị ngắt ngoại lại thôi, có nghĩa là chúng ta không xử lý gì cả, chỉ giữ lại giá trị để gần tới hết chu kỳ chúng ta mới xử lý, và truyền về máy tính để xử lý (chu kỳ 10s), giả sử đến 9.5 giây chúng ta mới xử lý. Rồi, đoạn chương trình vào ngắt, giả sử chúng ta viết chương trình chỉ trong 1 page, và các lệnh vào ngắt có thể bỏ bớt những dòng lệnh thừa. Giảm tối đa được số lệnh vào và ra ngắt còn khoảng 10 lệnh, thay vì khoảng 20 lệnh như chuẩn, tức là chúng ta mất 2us ở đây. Như vậy, về mặt nguyên tắc, nếu hai xung gần nhau nhất là 5us, thì đảm bảo xử lý được. Cách làm như sau: Chương trình ngắt: Đoạn vào ngắt; TIMERHIGH[i] = TIMER1H; TIMERLOW[i] = TIMER1L; i = i+1; Đoạn kết thúc ngắt; Như vậy, sau khi gần hết chu kỳ, chúng ta gửi mảng giá trị Timer[i] = TIMERHIGH[i]_TIMERLOW[i] (word 16 bit, kết nối lại) về cho máy tính xử lý. Còn lại, đảm bảo trong vòng chương trình ngắt, chỉ xử lý tối đa khoảng 2,3us thôi. Trong đó, thời gian TOF = Timer[1] - đoạn vào ngăt; vì thời điểm đầu quay về. delay[i] = Timer[i+1] - Timer[i] Còn các đoạn sau thì chúng ta biết rõ là nó vào ngắt rồi Như vậy luôn luôn đảm bảo. Vấn đề tiếp theo. Đó là may mắn khi mà timer chưa tràn. Chúng ta phải xử lý vấn đề khi timer tràn nữa. Như vậy, chúng ta phải bật một cái ngắt cho timer tràn nữa, nhưng luôn luôn ưu tiên ngắt ngoài. Lưu ý ở đây, timer bắt buộc setup ở tỉ lệ 1:1 so với tốc độ máy. Cho nên, chỉ vài lệnh, thì timer không thể tràn 2 lần được, vì timer 1bit. Giả sử có 6 lần vào ngắt (6 xung nhận về, nếu đủ 6 xung thì thôi, không cho phép ngắt ngoài nữa). Tổng thời gian tối đa: 30 (lệnh trong ngắt ngoài) x 6 = 300. Trong khi đó, 16bit lưu được số lớn hơn nhiều. Thành ra cái này hoàn toàn không sợ. Chỉ sợ là giữa hai xung bất kỳ, có khi timer sẽ bị tràn. Khi này chúng ta xử lý như sau: Chương trình ngắt: Đoạn vào ngắt; Nếu là ngắt ngoài, thực hiện chương trình ngat1: Nếu là ngắt timer, thực hiện chương trình ngat2: ngat1: TIMERHIGH[i] = TIMER1H; TIMERLOW[i] = TIMER1L; i = i+1; ngat2: chỗ này lưu ý, phải enable ngắt ngoài timer_counter = timer_counter + 1; temp[i] = i; để biết là lúc nào thì thì cờ tràn, sau này mới xử lý được Đoạn kết thúc ngắt; Như vậy, rõ ràng, neu như trong đoạn này mà ngắt ngoài xảy ra, chúng ta sẽ gặp vấn đề. bị mất một số chu kỳ nếu như ngắt xảy ra. Do vậy, chỗ này phải sử dụng kỹ thuật ngắt trong ngắt. Phần ngắt trong ngắt, bạn có thể xem cách xử lý ở dientuvietnam. Viết MPASM thì sẽ đơn giản hơn. Lúc này đặt lại cờ GIE, nếu như ngắt xảy ra thì nó sẽ tự động nhảy lại về chương trình ngắt. Chúc vui
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
![]() |
![]() |
![]() |
|
|