PDA

View Full Version : Xin moi nguoi giup do!


anzuus
12-12-2005, 07:14 AM
Chào mọi người, em vừa mới biết đến PIC chưa lâu mà bây giờ đã có 1 bài tập, và em chưa biết giải quyết thế nào :(, mong mọi người giúp đỡ em trong bước khởi đầu gian nan :p

Bài tập của em là xây dựng một mạch điện, sử dụng PIC (16F84) để đo khoảng cách, và display thông qua 3 đèn LED ( vang - <500mm; xanh - 500 to 1300mm; đỏ - >1300mm).
Tín hiệu được nhận từ một bộ Polaroid ultrasonic sensor (là một bộ truyền nhận-transceiver sóng âm có tần số cao) thông qua giao diện cổng COM-DB9 (tín hiệu chỉ được nhận từ duy nhất pin 4 - Echo của bộ ultrasonic)

Tình huống: Khi sensor phát hiện được objec trong pham vi hoạt động -> sẽ có 1 tín hiệu phản hồi (echo) được nhận và đi vào port A của PIC thông qua Pin 4. khi PIC nhận được tín hiệu sẽ so sánh thởi gian trễ -> và tính ra được khoảng cách là <500mm; from 500 to 1300; hay là >1300mm, và sẽ bật các đèn LED tương ứng.

Về mạch điện thì rất đơn giản, nhưng về phần code cho PIC thì em chưa rành lắm. Nhất là phần so sánh khoảng cách xa gần mà dùng độ trễ. Mong mọi người góp ý cho em.

Cảm ơn mọi người nhiều

falleaf
12-12-2005, 04:56 PM
Em chú ý một điều, đó là nguồn của siêu âm Polaroid cần là rất lớn, lên đến 2A cho một siêu âm. Chính vì vậy, nếu em làm không đủ nguồn, thì siêu âm không đọc được.

Với vấn đề của em, nên xử lý một cách "thông minh hơn" như sau:

- Dùng cảm biến siêu âm, đặt trước bề mặt tường (độ dày tường phải trên 20 cm - phần này em nghiên cứu kỹ về siêu âm sẽ biết vì sao phải vậy).

- Đo khoảng cách chính xác từ siêu âm đến tường. Khoảng cách này với siêu âm Polaroid là 80cm, 1m, 2m, 3m, 6m, 8m và 10m.

- Ở mỗi khoảng cách, em phát và thu 10 lần, sau đó di chuyển đến khoảng cách khác.

- Em lặp lại thí nghiệm này 3 lần.

- Như vậy, em sẽ có một mảng dữ liệu ở mỗi khoảng cách là 30 mẫu.

- Dùng phương pháp trung bình để tính ra mean, bởi vì phân bố đo được của cảm biến siêu âm có dạng Gaussian.

- Từ dữ liệu của mấy khoảng cách khác nhau, em tìm hàm tuyến tính giữa timer và khoảng cách. Để làm việc này, em dùng thuật toán linear fit data, hoặc linear best fit data. Nó cho phép em fit được đường tuyến tính tốt nhất qua các điểm.

- Với hệ số này, em chỉ cần đo timer, thì sẽ xác định được. Nếu lớn hơn hoặc nhỏ hơn giá trị timer nào đó, em bật hoặc tắt đèn. Không cần phải tính toán ngược lại khoảng cách rồi mới so sánh khoảng cách.

Việc làm này, giúp em calibrate được cái siêu âm, và cũng dùng để tính được khoảng cách một cách chính xác. Ngoài ra, từ việc làm này, em có thể truyền thẳng giá trị timer về máy tính, sau đó mới dùng chương trình máy tính để tính toán, thì nó sẽ thuận tiện và nhanh hơn rất nhiều lần.

Về thuật toán đo khoảng cách. Em có thể dùng chức năng capture, nhưng chức năng này chỉ có ở PIC16F88, hoặc 16F628A, chứ không có ở 16F84.

Vì thế, em nên dùng chức năng EXTINT trên chân RB0 để nhận echo. Khi đó ngắt xảy ra, thì em đọc echo. Còn khi em phát, thì em bật timer lên, thì timer bắt đầu đếm từ 0, đến khi có tín hiệu EXTINT, thì đọc giá trị timer ra. Em có thể dùng timer1 với 16 bit, hoặc timer0, timer2 với 8 bit. Nhớ dùng bộ chia timer Prescaler hợp lý, bởi vì em có những khoảng cách đo trong tầm ngắn.

Tuy nhiên, em kiểm tra lại, bây giờ anh không nhớ chính xác lắm thông số, nhưng Polaroid có rất nhiều mức giới hạn, nếu em muốn đo ở khoảng cách rất ngắn, thì phải chuyển mode. Khoảng cách của em là 50cm đến 1m3. Đó là khoảng cách rất ngắn. Còn thông thường, Polaroid 6500 đo được từ 80cm đến 10m.

Trong trường hợp này, em phải chọn mode đo khoảng cách ngắn.

Các khoảng cách trên kia, em sẽ chuyển lại thành: 40cm, 50cm, 60cm...130cm. Rồi lại thực hiện như anh đã nói trên kia.

Chúc vui.

anzuus
12-12-2005, 06:27 PM
Cảm ơn anh falleaf!

Anh có the nói rõ hơn cho em về thuật tóan linear fit data và linear best fit data duoc không ạ.
Và cả chức năng capture nua, hình như cái phần này chưa có trong bài giảng của anh thì phải.

Có một vấn đề mà em thấy vướng, đó là làm sao có thể đồng bộ thời gian send tín hiệu của sensor với thời gian khởi động timer

Cảm ơn anh nhiều!

falleaf
12-12-2005, 11:00 PM
Theo anh nhớ, khi send tín hiệu, em chỉ cần 1 lệnh là send được. Như vậy, em làm như sau:

Tắt timer
Xóa timer
Khởi động timer
Send tín hiệu.

Như vậy, timer sẽ được khởi động trước 1 chu kỳ máy so với lệnh send tín hiệu.

Tuy nhiên, việc này cũng sẽ không quan trọng, bởi vị khi em dùng linear fit data thì nó sẽ không đi qua điểm 0. Điểm 0 này chính là thời gian trễ của tín hiệu so với khoảng cách, phương trình có dạng:

y = ax + b. Cái anh nói là b.

Như vậy, b bao hàm rất nhiều cái trễ. Vd như khoảng cách từ bề mặt siêu âm, đến bề mặt cảm biến, nằm bên trong vỏ siêu âm, vấn đề trễ tín hiệu do mạch điện tử, và kể cả việc khởi động timer cũng ảnh hưởng đến.

Nhưng em lưu ý, việc khởi động trễ 1 chu kỳ máy là rất nhỏ ở tần số 10MHz, hay 2.5Mflop đối với 16F84, và nhỏ hơn so với khoảng cách từ bề mặt siêu âm cho tới miếng áp điện.

Chính vì thế, em không cần phải lo đến việc trễ này.

Còn về fit data, thực ra anh hay dùng tiếng Anh mấy cái thuật ngữ này, chữ nó chẳng có gì quan trọng đâu. Đó là em xác định một đường thẳng dạng

y = ax + b;

sao cho khoảng cách từ các điểm thực nghiệm đến đường thẳng đó là nhỏ nhất. Có rất nhiều tiêu chuẩn trong này, như tổng bình phương nhỏ nhất, hoặc trị tuyệt đối lớn nhất nhỏ nhất, hoặc... tóm lại là rất nhiều tiêu chuẩn.

Nhưng bởi vì anh dự đoán (theo kinh nghiệm), thì hàm của cảm biến siêu âm trong khoảng cách đó là tuyến tính.

Tuy nhiên, để giải bài toán cụ thể của em, tại sao em không đặt cảm biến siêu âm ở chính xác những khoảng cách em cần 50cm, ...1m3.. Sau đó chỉ cần đo khoảng 30 lần ở các vị trí đó. Cuối cùng lấy giá trị timer trung bình của các lần đo.

Vd: Đo 30 lần tại 50cm, em có giá trị timer là 500 chẳng hạn. Thế thì cứ lớn hơn hoặc nhỏ hơn giá trị đó, thì em bật đèn tương ứng. Nhưng khổ nỗi, em lại phải truyền giá trị đó về máy tính, cho nên đằng nào thì em cũng phải tính giá trị đó ra.

Nhưng anh thấy, mục tiêu đề tài của em, hình như giống như dành cho việc đậu xe ô tô thì phải. Đặt sẵn các siêu âm trong nhà để xe, nếu xe de vào gần tường rồi thì báo đèn đỏ để dừng lại, còn nếu không thì báo đèn xanh, hoặc đèn vàng, để phía trước mặt người lái xe (hướng đối diện với bãi de xe) trong các khu vực nhà chật, hoặc để xe dưới tầng hầm?

Không biết phải em định làm cái giống kiểu vậy không? Nếu làm vậy, anh nghĩ thôi làm hồng ngoại cho rẻ tiền :D.

Chỉ là đoán mò tán dóc thôi, đừng để ý :D

Chúc vui

anzuus
12-12-2005, 11:54 PM
Chao anh!

:p ý tưởng bãi đậu xe của anh hay thật, nhưng đề tài của em khác cơ. Bài tập này chỉ là phần mở đầu thôi, còn bài tập của em là phải thiết kế một Ultrasonic RADAR Sytem.
Nó gồm 4 phần:
1. Điều khiển Polaroid ultrasonic sensor, xử lý tín hiệu rồi gửi vào máy tính
2. Điều khiển stepper motor (or sevor), quay 360 do roi quay nguoc lai...
3. Điều khiển kết nối với máy vi tính thông qua MAX202
4. Viết GUI program

Em nghĩ đây 1 là đề tài khá hay, ứng dụng được nhiều, như ứng dụng trong Robotic, Security, v.v. Nhưng nó tương đối khó với em, em mới vô diễn đàn, đọc nhiều bài viết của anh, nói chung 1 từ "ấn tượng". Nếu anh thấy hứng thú với đề tài của em thì giúp em 1 tay. Vì em mới bắt đầu tìm hiểu thôi, không phải chuyên nghiệp.

falleaf
13-12-2005, 12:14 AM
Sorry, anh không có thời gian hướng dẫn cho em đâu. Hơn nữa, đề tài của em cũng khá đơn giản, không có gì phức tạp lắm, không cần anh hướng dẫn đâu. Nếu anh hướng dẫn đề tài thế này, anh đưa source code cho em, đêm nay em thức đến sáng để test, sáng mai lên nộp bài cũng được nữa.

Rất tiếc, anh không hướng dẫn sinh viên theo kiểu đó. Trả lời em như thế này anh nghĩ là cách hướng dẫn hay nhất.

Có nhiều sinh viên làm việc với anh, công việc đầu tiên là học viết báo cáo. N thằng không thằng nào học cái phần viết báo cáo cho thông. Đến N+1 thì lại là đứa con gái, và nó đang rất thành công. Nhóm mod của picvietnam cũng đang làm khá tốt đấy.

Nếu muốn học, em cứ vào PIC Việt Nam - Chuyên Nghiệp để xem mẫu báo cáo của nhóm đang làm.

Chúc vui.

anzuus
13-12-2005, 01:38 AM
:(hic, thì đúng là với anh thì dễ rùi, nhưng với em thì vẫn khó. Nhưng em sẽ thử, có gì ko hiểu thì hỏi anh vậy.

Hay anh thử hướng dẫn em bằng cách đưa cho em 1 đoạn code nào đấy rồi em tập viết báo cáo.

Em kinh nghiệm từ bản thân, cái gì bước khởi đầu học mà ko tốt, ko chất lượng là rất khó thành công, nên có gì anh hướng dẫn em nhé.

Many thanks :rolleyes:

falleaf
13-12-2005, 08:21 PM
Coding, đối với anh không phải việc phức tạp, bởi vì nếu cần coding, anh sẽ thuê một người chuyên coding làm chuyện đó. Em cần học về điều khiển, hay học về coding?

Nếu em học về coding, anh không thể cho em source được, bởi vì đó là cái em cần học. Nếu em học về điều khiển, em giải bài toán hoàn toàn lý thuyết ra, viết bằng form báo cáo anh đưa ở box PIC Việt Nam - Chuyên nghiệp.

Sau khi em làm xong toàn bộ về lý thuyết điều khiển, các thông số tính toán, anh sẽ đưa code cho em. Những vấn đề gì em cần học trong phần lý thuyết, anh sẽ hướng dẫn thêm. Sau đó, anh sẽ đưa cho em source code mẫu, có thể trong ứng dụng của em, chỉ cần sửa vài dòng là chạy tốt. Đó là điều anh chắc chắn.

Do đó, hiện tại việc đưa source code cho em là không cần thiết.

Anh đã nói, anh không hướng dẫn sinh viên gõ code, hoặc không làm cái kiểu ăn sẵn để lấy tiếng tăm. Em luôn chú ý, học cái gì cần học, và hãy chú tâm học cái đó thật tốt.

Chúc vui.

anzuus
16-12-2005, 08:27 AM
hi,
Em bít rùi, sau khi suy nghĩ em chọn theo học điều khiển. Hoc coding co le nhanh hon dễ hơn nhưng nếu muốn đi xa thì kiểu gì cũng phải quay lại học điều khiển, nên em sẽ học điều khiển trước, coding tự khắc sẽ tiến bộ dần dần.
Vì mới bắt đầu nên anh đừng giao cho em đề tài gì khó quá nhé :p , ko lại bị choáng -> dễ chán.

:D chào anh

falleaf
16-12-2005, 02:50 PM
Em cứ giải lý thuyết ra chính cái đề tài của em cần giải quyết. Đầu tiên, em thiết kế lại xem, mình phải giải quyết những bài toán gì? Mục đích để làm gì...

Tất cả những bài báo cáo đó, em sử dụng form anh cung cấp.

Ngoài ra, vấn đề naò em gặp khó khăn, em cứ nói, cần các thông tin gì thêm, hiểu biết gì thêm để có thể phân loại bài toán, và phân tách các bài toàn, em cú nói với anh cụ thể, anh và các thành viên khác sẽ giúp đỡ em.

Chúc vui.

anzuus
12-01-2006, 07:29 AM
Em chao anh, Xmas rồi nhà em có việc nên em phải về, ko ghé forum.

Em đã tiến hành làm đề tài, phần điều khiển Unipolar Stepper Motor em làm cũng được khá nhiều, về phần em đã hỏi anh - Polaroid Ultrasonic Ranging System thì em đang trong giai đoạn hoàn thành. Em đã down form của anh về, tuần tới em bắt đầu viết báo cáo.

Em cũng tham khảo nhiều chỗ, em post cái schematic voi đoạn chương trình của em, vẫn chưa đc, anh góp ý hộ em. Tuần tới em cũng phải báo cáo phần này.

http://www.vndichvu.com/albums/userpics/untitled.GIF

Sơ đồ này em chưa điền giá trị của linh kiện, cái SW2 thi chi là cái khóa thôi ạ.

Đây là code ạ

list p=16F628A
;
;**************Progaram Equates*****************
;
pc equ 0x02
status equ 0x03
trisa equ 0x05
porta equ 0x05
trisb equ 0x06
portb equ 0x06
counter equ 0x0c
maxvalue equ 0x0d
minvalue equ 0x0e
loop equ 0x0f
timerctr1 equ 0x10
finaltime equ 0x11
buzztime equ 0x12
temp1 equ 0x13
temp2 equ 0x14
temp3 equ 0x15
range equ 0x16
retvalue equ 0x17
rp0 equ 5
w equ 0
f equ 1
carry equ 0
zero equ 2
;
;
;****************Main Program*******************
;
start clrf timerctr1 ;Clear sleep timer
clrf finaltime
bcf portb,1
bcf portb,2
bcf portb,3

bsf status,rp0 ;select bank1
movlw b'01110000' ;select I/O pin
movwf trisb ;of port b
movlw b'00011111' ;select I/O pin
movwf trisa ;of port a
bcf status,rp0 ;bank 0
;
;******************Check for Start Swiitch*******
poll btfsc porta,0 ;check start
goto poll

;******************Measure distance************
;
begin
call delay_40ms
call delay_40ms ;call delay 80ms
movlw 0x00 ;reset counter
movwf counter
bsf portb,0 ;set INIT

;
again call delay_30us ;call delay 30 us
incf counter ;increase cointer by 1
;
btfss portb,4 ;check echo coming
goto again ;back
bcf portb,0 ; reset INIT
;
call delay_40ms
call delay_40ms
;
;****************Read User Set Range************
;
movf porta,w ;read maximum range value
call getmax
movwf maxvalue
movf porta,w ;read minimum range value
call getmin
movwf minvalue
;
;***********Compare User Set Range With Measure Value********
;
movf minvalue,w ;compare minimum value
subwf counter,w ;with counter
btfsc status,carry ;if counter > minimum value
goto compmax ;compare with maximum value
goto light_red ;if couter < minimum value
;
compmax movf maxvalue,w ;compare maximum value
subwf counter,w
btfss status,carry
goto light_green
goto light_yellow
;
;******************LED**************************** ********
light_red bcf portb,3 ;off yellow led
bcf portb,2 ; off green led
bsf portb,1 ;on red led
clrf timerctr1
clrf finaltime
goto begin
light_green bcf portb,3 ;off yellow led
bcf portb,1 ; off green led
bsf portb,2 ;on red led
clrf timerctr1
clrf finaltime
goto begin
light_yellow bcf portb,2 ;off yellow led
bcf portb,1 ; off green led
bsf portb,3 ;on red led
;
;********************Sleep timer************************
incfsz timerctr1
goto begin
incf finaltime
movlw .6
subwf finaltime,w
btfss status,zero
goto begin
bcf portb,3
sleep
goto start
;
;********************* Delay Subroutine******************
;
delay_5ms movlw .10
movwf temp1
;
outer1 movlw .167
movwf temp2
;
inner1 decfsz temp2
goto inner1
decfsz temp1
goto outer1
return
;
;
delay_30us movlw .7
movwf loop
go decfsz loop
goto go
nop
nop
return
delay_40ms clrf temp1
clrf temp2
movlw .40
movwf temp1
;
outer2 movlw .167
movwf temp2
;
inner2 decfsz temp2
goto inner2
decfsz temp1
goto outer2
;
return
;
;*********************Look up table****************
getmin addwf pc,f
retlw .96
retlw .100
retlw .114
retlw .128
retlw .142
retlw .158
retlw .172
retlw .186
retlw .200
retlw .216
retlw .230
retlw .244
;
getmax addwf pc,f
retlw .100
retlw .114
retlw .128
retlw .142
retlw .158
retlw .172
retlw .186
retlw .200
retlw .216
retlw .230
retlw .244
retlw .252
;
end
;
;************************************************* ****************************


anh xem rồi góp ý sửa chữa hộ em với, em đặt tên cũng hơi lung tung :p

Cảm ơn anh

falleaf
12-01-2006, 12:50 PM
Em gửi báo cáo có phần cứng, lưu đồ giải thuật, chứ bây giờ anh không có thời gian để xem code đâu.

Chúc vui.

anzuus
18-01-2006, 10:54 PM
Chao anh!

Em có một câu hỏi về Delay time.

Em đã tham khảo công thức tính delay time của anh. Nhưng công thức đó là tính delay trong chương trình (bao gồm cả chu kỳ máy của các câu lệnh)

Trường hợp em làm là em tính thời gian từ khi sensor gửi tín hiệu (INIT signal) cho đến khi nhận được ECHO signal.

Công thức của em là: Time = (Distance * 2) / V

V: vận tốc của âm thanh ỏ 20 độ C ( V = 331.4 + 0.6*T do C)

Ví dụ em đo khoảng cách 550mm ở nhiệt độ 20 độ C, Time = 3.203 ms

Vấn đề của em là em phải convert ms thành chu kì máy. Em tính theo cách hiểu của em thì la 3203 cycle.

Vì em dùng Crystal 4Mhz nên một chu kì máy là 1us, 3.203 tức là 3203 chu kì máy.

Số chu kì máy đấy em nghĩ là đúng nhưng ko thể đưa vào chương trình, cái này em ko chắc vì em chưa thấy bao giờ. Bởi vì thông thường chu kỳ máy sẽ nhân với một hằng số để tính ra delay time :P

Anh xem giúp em với.

falleaf
19-01-2006, 02:49 PM
Em thử tính ra xem, 333m/s là bằng bao nhiêu mm/chuky máy?

Cần gì em phải giữ đơn vị đo m/s? tính ra mm/ckm là được. Như vậy, với một khoảng cách bất kỳ em nhân với flying time thì em sẽ có được khoảng cách chính xác thôi.

Chúc vui.