PDA

View Full Version : Hỏi về Lập trình chuyển đổi tín hiệu ADC trong PIC 18F4431


vmt.dttt
04-11-2008, 06:48 PM
Chào các sư huynh đệ, mình muốn hỏi chút về PIC 18F4431 thế này, mong mọi người giúp đỡ.

Mình muốn thu tín hiệu tương tự từ cảm biến bên ngoài vào VDK PIC,
VD từ 0 - 5V, tín hiệu mình cần nhiều mức. VD là từ
0- 1.2V,
1.2V - 2.1V ;
2.1V - 3V;
3V- 3.6 V
....
......
3.6 -5V
====> Mình phân nó ra làm 2 TH thé này:

TH1:
//*******************************************

0V.........................2.1V....3V.......3.6V.. .............5V
|--------------------*------*-----*---------------|

|<------Mức 1------>|
|<--------Mức 2----------->|
|<------------Mức 3------------->|
|-------------------Mức 4------------------------>|

//*******************************************


TH2:
//*******************************************

0V.........................2.1V.....3V....3.6V.... ..............5V
|--------------------*------*-----*---------------|

|<------Mức 1------>|
-------------------->|Mức 2|
--------------------------->|Mức 3|
----------------------------------->|----Mức 4----|

//*******************************************

Nếu ta thu được mức là 4 V chẳng hạn, thì lập trình thé nào đẻ nó nhận ra là nó đang nằm trong mức 4 (đối với TH2)
- Mình làm trên CCS, giải thuật lập trình trong TH này sẽ như thế nào. Để nó nhận biết tất cả các mức điện áp thu đuọc ??
............
Cảm ơn!

namqn
04-11-2008, 07:18 PM
Bạn dùng các cấu trúc so sánh lồng nhau. Ví dụ, có 3 ngưỡng cần phát hiện là T1 < T2 < T3, bạn có thể viết như sau:

if (tin_hieu < T1) do_sth1; //0 <= tin_hieu < T1
else-if (tin_hieu < T2) do_sth2; //T1 <= tin_hieu < T2
else-if (tin_hieu < T3) do_sth3; //T2 <= tin_hieu < T3
else do_sth4; //T3 <= tin_hieu

do_sth1, do_sth2, do_sth3, và do_sth4 là các công việc tương ứng ở mỗi trường hợp.

Thân,

vmt.dttt
05-11-2008, 02:48 PM
Bạn dùng các cấu trúc so sánh lồng nhau. Ví dụ, có 3 ngưỡng cần phát hiện là T1 < T2 < T3, bạn có thể viết như sau:

if (tin_hieu < T1) do_sth1; //0 <= tin_hieu < T1
else-if (tin_hieu < T2) do_sth2; //T1 <= tin_hieu < T2
else-if (tin_hieu < T3) do_sth3; //T2 <= tin_hieu < T3
else do_sth4; //T3 <= tin_hieu

do_sth1, do_sth2, do_sth3, và do_sth4 là các công việc tương ứng ở mỗi trường hợp.

Thân,

Ah`, trước hết xin cảm ơn bạn namqn...
Cho hỏi thêm các biến T1, T2, T3 ở trên của bạn, khai báo ???
Dùng từ 0 - 255 hay thế nào??? Và trong TH này liệu có ok không????


Hình như bạn không hiểu ý mình lắm. Ý mình là:
[Thu được tín hiệu tương tự ... đọc và xử lý tín hiệu... và xuất ra là tín hiệu số (Cuối cùng).]
- Trong TH này liệu có sử dụng ADC?? và phải sử dụng nó thé nào???

VD: Thu tín hiệu đầu vào là tín hiệu tương tự, và xuất tín hiệu ra vào port B
...
....
#device 18f4431*=16 adc=8
#use delay (clock = 20000000)
int8 adc;
//======================
main()
{
setup_adc (adc_clock_internal);
setup_adc_ports(an0);
set_adc_chanel(0);

delay_ms(10);
while(1)
{
adc=read_adc();
output_d(adc);
}
}
//============================================

- Vậy câu hỏi đặt ra là thằng ADC nó xuất tín hiệu đầu ra là thẳng PORT B là từ 0-255 trong TH sử dụng 8 bít này ??
- Tín hiệu thu vào và ADC xử lý là dải từ 0 - 255 ???

Cám ơn!

love_ac
05-11-2008, 04:35 PM
anh namqn lại mệt rồi
Cáo lỗi em spam !!

namqn
05-11-2008, 05:58 PM
Các ngưỡng T1, T2, T3 là các hằng số ứng với các điện áp 2.1 V, 3 V, ... mà bạn đã nêu ra ở câu hỏi. Tùy vào việc bạn dùng bao nhiêu bit trong kết quả chuyển đổi ADC mà các hằng số này có các giá trị cụ thể nào đó.

Với vi điều khiển (là các bộ xử lý dữ liệu số), mọi tín hiệu tương tự cần được xử lý sẽ được biểu diễn ở dạng dữ liệu số bên trong vi điều khiển. Tuy nhiên, nếu bài toán của bạn chỉ đơn giản như đã nêu ở post #1 thì không nhất thiết phải dùng ADC. Bạn đã đặt câu hỏi về cách phát hiện giá trị ngõ vào analog nằm trong các tầm giá trị khác nhau, và tôi đã trả lời cho câu hỏi đó của bạn.

Với PIC18F4431, kết quả chuyển đổi ADC là 10-bit. Bạn có thể yêu cầu trình biên dịch C chỉ lấy 8-bit cao nhất, hoặc dùng cả 10-bit (code ví dụ của bạn dùng 8-bit). Nếu chỉ dùng 8-bit thì tất nhiên tầm giá trị là 0 .. 255.

Thân,