PDA

View Full Version : Cho mình hỏi 1 chút


quang_nhon84
02-01-2009, 08:04 PM
Tại sao khi điện áp đưa ra ở các chân của PIC mình chỉ đo được khoảng 2 V? Nếu đọc tín hiệu analog được đưa vào giả sử là chân AIN0 3v, không thay đổi điện áp Vref = 5v thì kết quả đo được sẽ ghi vào thanh ADRESH là như thế nào?chỉ cho mình cách xác định giá tri đấy với! Dựa vào giá trị nào để xác định số khoảng điện áp 5V được chia nhỏ ra liệu có phải dựa vào giá trị ADCS1 và ADCS2 không? Với PIC16f877a tín hiệu là 10 bit tức là nó chia thành 1024 khoảng hay 10 khoảng,mình khôg học về ADC nên không rõ lắm.

namqn
02-01-2009, 09:16 PM
Tại sao khi điện áp đưa ra ở các chân của PIC mình chỉ đo được khoảng 2 V? Nếu đọc tín hiệu analog được đưa vào giả sử là chân AIN0 3v, không thay đổi điện áp Vref = 5v thì kết quả đo được sẽ ghi vào thanh ADRESH là như thế nào?chỉ cho mình cách xác định giá tri đấy với! Dựa vào giá trị nào để xác định số khoảng điện áp 5V được chia nhỏ ra liệu có phải dựa vào giá trị ADCS1 và ADCS2 không? Với PIC16f877a tín hiệu là 10 bit tức là nó chia thành 1024 khoảng hay 10 khoảng,mình khôg học về ADC nên không rõ lắm.
Câu thứ nhất: bạn chỉ đặt một câu hỏi mà không cung cấp sơ đồ mạch, code tương ứng thì rất khó trả lời.

Câu thứ hai: Việc ghi kết quả vào thanh ghi ADRESH phụ thuộc vào việc bạn chọn format cho kết quả là canh trái hay canh phải. Nếu canh trái (bit ADFM của thanh ghi ADCON1 mang giá trị '0') thì 8 bit cao nhất của kết quả sẽ được lưu vào thanh ghi ADRESH. Nếu canh phải (bit ADFM mang giá trị '1') thì chỉ có 2 bit cao nhất của kết quả được lưu vào thanh ghi ADRESH. Bạn có thể dùng công thức sau để tính kết quả chuyển đổi theo điện áp ngõ vào: ADRES = (Vin/Vref)*1024. Hàm truyền chính xác của bộ ADC có dạng bậc thang, chứ không phải là đường thẳng như công thức trên. Chú thích: Vin là điện áp giữa các chân VINH và VINL, Vref là điện áp giữa VREFH và VREFL.

Câu thứ ba: Dựa vào việc bộ biến đổi A/D có độ phân giải là 10-bit, dẫn đến số khoảng chia là 2^10 = 1024 khoảng. Các bit ADCS2 (của thanh ghi ADCON1) và ADCS1(của thanh ghi ADCON0), cùng với bit ADCS0 (của thanh ghi ADCON0) dùng để chọn tần số xung clock cấp cho bộ biến đổi A/D.

Câu thứ tư: xem câu trả lời thứ ba.

Thân,

quang_nhon84
02-01-2009, 09:53 PM
Cảm ơn bạn Nam,mình dùng canh lề trái và chỉ dùng ANCON0 và không dùng Vref nên giá trị
của thanh ADRESH = Vain/Vdd*1024 phải không bạn ? Nhưng còn 2 bit thấp ở ADRESL,mình có tính vào không hả bạn.

namqn
02-01-2009, 11:29 PM
Cảm ơn bạn Nam,mình dùng canh lề trái và chỉ dùng ANCON0 và không dùng Vref nên giá trị
của thanh ADRESH = Vain/Vdd*1024 phải không bạn ? Nhưng còn 2 bit thấp ở ADRESL,mình có tính vào không hả bạn.
ADRESH:ADRESL<7:6> = (Vain/Vdd)*1024, chứ không phải như bạn đã viết, vì ADRESH chỉ có 8 bit, trong khi kết quả là một số 10-bit. Việc có dùng 2 bit cao nhất của ADRESL hay không là tùy bạn.

Thân,

nguyenquoctoan
04-01-2009, 02:30 PM
theo em thì điện áp ra ở các chân của pic là 2V thì có thể gặp vấn đề, thông thường nếu xuất mức 1 ra thì điện thế có thể là 4.5-4.8V, theo em nghĩ trong vi điều khiển nào cũng vậy (pic, 89,..)đều có nội trợ vì vậy khi xuất mức 1 5V ra thì điện áp sẽ giảm đi phần nào, lý do đó mà khi xài led ma trận hay 7 đoạn người ta phải xài các con đảo (lm2803) để đèn được sáng hơn,...
sẵn đây bác Nam cho em hỏi, về thạch anh tạo dao động cho vi điều khiển thì có 2 chân, xung nhịp của 2 chân đó có khác nhau, bác có thể giải thích dùm em đuợc kô, vả lại thường thì nó chết một cách rất lạ lùng, bác có thể chỉ em cách kiểm tra nó bằng đồng hồ kô,...

quang_nhon84
11-01-2009, 11:27 AM
anh Nam cho em hỏi, em muốn Pic xử lí là đọc tín hiệu analog dùng ADC 10bit về xét 4 khoảng,giả sử từ 0-115;116-240;241-895;895-1024 mỗi khoảng thực hiện 1 lệnh thì ta xử lí thuật toán thế nào cho chương trình ngắn nhất? nếu viết bằng C thì có vẻ dễ nhưng em quen dùng ASM nên chưa biết xử lí thế nào vì tập lệnh không có lệnh so sánh số BCD.

namqn
11-01-2009, 05:16 PM
anh Nam cho em hỏi, em muốn Pic xử lí là đọc tín hiệu analog dùng ADC 10bit về xét 4 khoảng,giả sử từ 0-115;116-240;241-895;895-1024 mỗi khoảng thực hiện 1 lệnh thì ta xử lí thuật toán thế nào cho chương trình ngắn nhất? nếu viết bằng C thì có vẻ dễ nhưng em quen dùng ASM nên chưa biết xử lí thế nào vì tập lệnh không có lệnh so sánh số BCD.
Kết quả biến đổi A/D là số nhị phân, không phải dạng BCD, do đó bạn có thể so sánh bình thường. Thuật toán xác định 4 khoảng tín hiệu 0 < x1 < x2 < x3 < x4 nên hiện thực như sau:

- Xét xem giá trị x có < x1 hay không, nếu đúng thì nó thuộc khoảng 0 < x < x1,
- Nếu so sánh trên cho kết quả sai, xét xem x có < x2 hay không, nếu đúng thì nó thuộc khoảng x1 <= x < x2,
- Nếu so sánh trên cho kết quả sai, xét xem x có < x3 hay không, nếu đúng thì nó thuộc khoảng x2 <= x < x3,
- Nếu so sánh trên cho kết quả sai, nó thuộc khoảng x3 <= x

Để so sánh các giá trị 10-bit, bạn tham khảo code mẫu tại piclist về so sánh các đại lượng 16-bit:
http://www.piclist.com/techref/microchip/compcon.htm#16_bit

Thân,

quang_nhon84
05-02-2009, 07:37 PM
Anh Nam ơi, cho em hỏi về xử lí ngắt. Bây giờ đã đọc được tín hiệu analog rồi. Giả sử tín hiệu đấy đưa ra là >150 thì mình thực hiện lệnh bấm thời gian cứ khoảng 2 giờ lại thay đổi chân ở PORTD 1 lần nhưng trong lúc đó mình vẫn phải đọc tín hiệu analog xem nó có >150 không,nếu không thì thực hiện lệnh khác. Vậy ta phải xử lí thế nào hả anh? Chắc phải dùng ngắt nhưng em không có tài liệu nào hướng dẫn xử dụng ngắt cả. Anh Nam chỉ hộ em thuật toán với!

namqn
05-02-2009, 07:57 PM
Anh Nam ơi, cho em hỏi về xử lí ngắt. Bây giờ đã đọc được tín hiệu analog rồi. Giả sử tín hiệu đấy đưa ra là >150 thì mình thực hiện lệnh bấm thời gian cứ khoảng 2 giờ lại thay đổi chân ở PORTD 1 lần nhưng trong lúc đó mình vẫn phải đọc tín hiệu analog xem nó có >150 không,nếu không thì thực hiện lệnh khác. Vậy ta phải xử lí thế nào hả anh? Chắc phải dùng ngắt nhưng em không có tài liệu nào hướng dẫn xử dụng ngắt cả. Anh Nam chỉ hộ em thuật toán với!
Không cần phải dùng ngắt đâu bạn. Bạn đọc tín hiệu analog liên tục, nếu nó vẫn > 150 thì bạn cho timer 2 giờ chạy tiếp (đủ 2 giờ thì nó cập nhật PORTD). Nếu tín hiệu analog đọc về không thỏa điều kiện > 150 của bạn, thì bạn dừng timer 2 giờ, có thể xóa số đếm hiện thời của nó (để định thời lại từ đầu) hay không xóa số đếm hiện thời của nó (để cộng dồn những khoảng thời gian khi ngõ vào thỏa > 150).

Thân,

quang_nhon84
11-02-2009, 11:48 AM
Anh Nam ơi, bây giờ em cần hiển thị ra led 7 thanh dùng 2 con để hiện số 2 chữ số. Em phải làm thế nao? Ví dụ em đang có số B'00110100' tương ứng 50 nhưng em muốn hiện ra 2 thanh led số 25, anh chỉ cho em với.

namqn
11-02-2009, 05:53 PM
Anh Nam ơi, bây giờ em cần hiển thị ra led 7 thanh dùng 2 con để hiện số 2 chữ số. Em phải làm thế nao? Ví dụ em đang có số B'00110100' tương ứng 50 nhưng em muốn hiện ra 2 thanh led số 25, anh chỉ cho em với.
Như vậy là bạn chia giá trị thực cho 2 rồi mới hiển thị. Sau khi chia cho 2 (hay dịch phải 1 bit), bạn cần chuyển kết quả sang dạng BCD, rồi mới hiển thị lên LED (mỗi LED hiển thị 1 chữ số thập phân, chứa trong 4 bit).

Để hiển thị lên LED 7 thanh, trước hết bạn lấy giá trị 4 bit cần hiển thị và giải mã thành tổ hợp trạng thái của 7 thanh (thường dùng bảng tra, có 10 tổ hợp cho 10 chữ số thập phân), sau đó bạn xuất các trạng thái này ra LED 7 thanh. Với bộ hiển thị có từ 2 chữ số trở lên, bạn có thể dùng phương pháp quét: xuất chữ số thứ nhất, chờ một khoảng thời gian, rồi xuất chữ số thứ hai, lại chờ một khoảng thời gian, sau đó lặp lại chu kỳ quét.

Thân,

quang_nhon84
17-02-2009, 11:01 AM
Cảm ơn anh Nam! Em lại phải hỏi tiếp:D, dùng 2 con giải mã 74HC595 để hiển thị 2 Led 7 thanh thì mình nối tiếp chúng với nhau đúng không anh? Data cho vào chân DI của con 1, chân DO của con 1 lại cho vào chân DI của con 2, chân clock, chân mở, chân chốt dữ liệu chung? Khi mình truyền dữ liệu từ PIC thì minh xuất 16 xung clock để xuất 2 thanh ghi rồi chốt nó lại phải không anh? giống như là dùng 2 thùng đựng nước ,tràn hết thùng 1 thì tràn sang thùng 2, rồi khóa van lại phải không anh. Tức là dữ liệu thanh ghi thứ nhất sẽ nằm trong con giải mã 2 , em hiểu thế có đúng không?

namqn
17-02-2009, 05:36 PM
Cảm ơn anh Nam! Em lại phải hỏi tiếp:D, dùng 2 con giải mã 74HC595 để hiển thị 2 Led 7 thanh thì mình nối tiếp chúng với nhau đúng không anh? Data cho vào chân DI của con 1, chân DO của con 1 lại cho vào chân DI của con 2, chân clock, chân mở, chân chốt dữ liệu chung? Khi mình truyền dữ liệu từ PIC thì minh xuất 16 xung clock để xuất 2 thanh ghi rồi chốt nó lại phải không anh? giống như là dùng 2 thùng đựng nước ,tràn hết thùng 1 thì tràn sang thùng 2, rồi khóa van lại phải không anh. Tức là dữ liệu thanh ghi thứ nhất sẽ nằm trong con giải mã 2 , em hiểu thế có đúng không?
Nguyên tắc là như thế, nếu dùng PIC 8-bit thì byte đầu tiên được dịch ra sẽ nằm ở 74HC595 thứ hai.

Thân,