PDA

View Full Version : Mạch chuyển đổi RS232<=>RS485 tự động chuyển mạch


stupid11
20-05-2011, 10:27 PM
Em đang làm đồ án tốt nghiệp có liên quan tới truyền thông qua mạng RS485..Em có làm mạch chuyển đổi RS232<=>RS485 của anh HoangLongU bên ĐTVN..nhưng hình như nó không chạy,anh nào có kinh nghiệm hay đã làm mạch này rồi,hoặc có mạch chuyển đổi khác có thể giúp em được không..em đang cần gấp lắm..

Đây là mạch của anh HoangLongU :
For PC:
-Mạch này con 75176 chân 8 nối nguồn,chân 5 nối mass..không biết tại sao anh HoangLongU không vẽ ra nữa...
http://i1090.photobucket.com/albums/i375/dungdt08b/ForPC.jpg
For MCU:
Mạch này điện trở 120 cho trạm cuối..còn các trạm giữa thì không có.
http://i1090.photobucket.com/albums/i375/dungdt08b/ForMCU.jpg
Em đã tiến hàn và test 2 mạch này.Nhưng khi vừa cấp nguồn thì con LED RxD đã sáng....
Mong các anh giúp đở..Em chân thành cảm ơn.

stupid11
21-05-2011, 10:22 AM
Sao không anh em nào giúp mình thế nhỉ ?????

nhuythuy
21-05-2011, 12:49 PM
Ở trên PC bạn thử làm theo mạch này xem (SN75176, SN75LBC184 có thể thay thế cho nhau)
http://users.skynet.be/DCI_Site/dcibus_e.html


Ở dưới vi điều khiển, bạn chỉ cần dùng SN75176 nối trực tiếp vào chân Rx và Tx của VĐK. Tuy nhiên bạn phải dùng thêm 1 chân nữa để điều khiển hướng truyền/nhận. Chân này nối với chân DE và RE của SN75176 (2 chân DE và RE nối với nhau và nối với chân điều khiển hướng truyền/nhận này)
Mỗi khi bạn muốn gửi ra bus, chân vi điều khiển nối với DE và RE phải set lên mức 1 (tham khảo datasheet DE tích cực cao, /RE tích cực thấp); sau mỗi khi gửi dữ liệu ra bus, bạn lại ngay lập tức đặt chân này về mức 0 để nó chờ nhận tín hiệu. Tất nhiên, khi khởi tạo trong hàm main, bạn phải đặt chân điều khiển này ở mức 0 để vi điều khiển có thể nhận dữ liệu

Túm lại:
1. Pin_DE_RE = 1;
2. SendData();
3. Pin_DE_RE = 0;

nhuythuy
21-05-2011, 12:58 PM
Mình quên là trên PC, phải bổ xung lệnh điều khiển chân điều khiển Request to Send RTS (pin 7). Cách điều khiển chân này tương tự như điều khiển chân DE, /RE phá dưới VXL (nhưng nhớ là MAX232 có tác dụng đảo tín hiệu Negative của MAX232 tương ứng với + của SN75176 và ngược lại

stupid11
21-05-2011, 01:06 PM
Ở trên PC bạn thử làm theo mạch này xem (SN75176, SN75LBC184 có thể thay thế cho nhau)
http://users.skynet.be/DCI_Site/dcibus_e.html


Ở dưới vi điều khiển, bạn chỉ cần dùng SN75176 nối trực tiếp vào chân Rx và Tx của VĐK. Tuy nhiên bạn phải dùng thêm 1 chân nữa để điều khiển hướng truyền/nhận. Chân này nối với chân DE và RE của SN75176 (2 chân DE và RE nối với nhau và nối với chân điều khiển hướng truyền/nhận này)
Mỗi khi bạn muốn gửi ra bus, chân vi điều khiển nối với DE và RE phải set lên mức 1 (tham khảo datasheet DE tích cực cao, /RE tích cực thấp); sau mỗi khi gửi dữ liệu ra bus, bạn lại ngay lập tức đặt chân này về mức 0 để nó chờ nhận tín hiệu. Tất nhiên, khi khởi tạo trong hàm main, bạn phải đặt chân điều khiển này ở mức 0 để vi điều khiển có thể nhận dữ liệu

Túm lại:
1. Pin_DE_RE = 1;
2. SendData();
3. Pin_DE_RE = 0;

Cảm ơn bạn !
Việc điều khiển hướng IC driver 485 thì mình biết..nhưng quan trọng là trên PC việc đk bằng tín hiệu bắt tay thì mình không biết lập trình như thế nào hết (mới mò VB mà :D )..với lại có 1 vấn đề nữa làm sao để mình biết data đã đi hết mà đảo hướng IC driver đây.(cả trên PC lẫn VĐK luôn).nếu không thì data sẽ bị mất..hay phải quy định 1 khoảng delay,,.phải chăng là có 1 cờ kiểm tra nào đó mà mình ko biết..Nên mình muốn làm mạch tự động đổi hướng truyền nhận để dễ dàng cho việc lập trình hơn...
Mong các bạn giúp đỡ

nhuythuy
21-05-2011, 09:18 PM
Bạn có thắc mắc rất hợp lý. Mình đã code phần mềm chạy với một số thiết bị "của Tây" chưa gặp hiện tượng như bạn đã nêu. Lý do theo mình có thể là:

- Phần mềm của mình viết là Modbus Master

- Khi master còn đang phát request, tức là trên bus đang còn có tín hiệu thì slave sẽ không thể phát tín hiệu.

- Khi Master đang còn phát yêu cầu (request), tức là slave chưa nhận hết request thì slave chưa thể hiểu request là gì mà trả lời, nên trên bus sẽ không thể có tín hiệu nào khác ngoài tín hiệu của master.

- Khi chưa nhận hết bản tin request (yêu cầu) từ master thì thiết bị (slave) nhận chưa thể biết phải làm gì, nên nó không gửi tín hiệu gì trên.

- Các slave khác khi chưa có request thì cũng sẽ không có respond, nên trên bus chỉ có tín hiệu request từ master

nhuythuy
21-05-2011, 09:33 PM
Mình quên về cách code chân RTS. Đây là đoạn code trên Delphi bạn có thể thực hiện tương tự trên VB hay VC

mcComm.FlushInBuffer();
mcComm.RTS := False;
mcComm.RS485Mode := False;
mcComm.PutString(sRequest);
mcComm.RS485Mode := True;
mcComm.RTS := True;


Mình vừa mò lại bằng VB, có vẻ code như thế này

mcComm.RTSEnable = True
mcComm.Output = sRequest
mcComm.RTSEnable = False

stupid11
21-05-2011, 09:49 PM
Cảm ơn bạn rất nhiều !!!
Mình hiểu giao thức Master-Slave này rồi...vậy ở trạm tớ (slave) mình sẽ qui định 1 khoảng delay vừa đủ để cho data truyền đi hết sau đó sẽ đảo hướng MAX485.Mình tính như sau cậu xem có hợp lý không nhé :
tốc độ baud=9600;thì 1s truyền được 1200 byte..frame truyền của mình gồm 10 byte vậy mình sẽ delay 1 khoảng là 8.3 ms (mình sẽ chọn 10ms cho an toàn)..như vậy sau 10ms mình sẽ đảo hướng truyền sang nhận...

nhuythuy
21-05-2011, 10:16 PM
Theo mình ko cần delay.

Lý do là bên slave mà chưa gửi xong respond cho master thì master cũng chưa hiểu slave nói gì. Nên nó sẽ vẫn còn đợi cho đến khi nhận xong toàn bộ respond từ slave (vì sau khi nhận xong hết master mới tính được CRC và hiểu Slave gửi respond đúng hay không). Vậy là chỉ khi nào slave gửi xong respond thì master mới phân tích và hiểu được respond đó rồi sau đó nó mới tiếp tục gửi request cho slave khác hoặc chính slave đó

nhuythuy
21-05-2011, 10:18 PM
Mình vừa gửi bạn cách tính CRC cho Modbus RTU trong thread bạn hỏi về CRC

stupid11
21-05-2011, 10:27 PM
Hình như bạn vẫn chưa hiểu ý mình thì phải,
ví dụ như thế này nhé :
daohuong=1;
printf("abcdef");
daohuong=0;

Nếu bạn viết như vậy thì đảm bảo sẽ không truyền hết được data..vì khi bạn gửi 1 byte đi thì byte đo sẽ được đưa vào bộ đệm rồi CPU sẽ tự động đẩy đi..còn viết như trên thì data chưa được đẩy đi hết thì ta đã đảo hưởng max485 như vậy data sẽ bị mất..nên theo mình phải viết :
daohuong=1;
printf("abcdef");
delay_ms(....); //thời gian này để đảm bảo data được đẩy đi hết....
daohuong=0;

Hay có thể mình hiểu sai lệnh printf()...
printf(.....)
lệnh a;
truyền data xong thì mới thực hiện lệnh a....

nhuythuy
21-05-2011, 10:56 PM
Ý của bạn đúng đấy. Mình đã hiểu nhầm ý bạn.

Mình làm như vậy và chưa gặp lỗi bao h nên chủ quan. Có thể phải kiểm tra bộ đệm truyền sau đó mới reset bit điều khiển, như vây mới chắc được.

Ko biết các a e khác đã từng làm hoặc có chiêu gì chia sẻ với nhỉ

stupid11
21-05-2011, 11:03 PM
Đúng đấy theo mình chắc phải kiểm tra cờ trong bộ đệm gửi..nếu đã rỗng thì mới đảo hướng IC driver..còn delay chỉ là giải pháp tình thế thôi :D

gửi "nhuythuy" :mình gửi tin nhắn vào trong hộp thư của cậu rồi đấy...hjjj

stupid11
21-05-2011, 11:14 PM
Bạn thử xem mình vẽ cấu trúc mạng RS485 như vậy có được không.
Mình đang phân vân chỗ điện trở chặn đầu cuối..bạn xem qua rồi cho ý kiến nhé..

http://i1090.photobucket.com/albums/i375/dungdt08b/CutrcmngRS485-1.jpg

nhuythuy
21-05-2011, 11:25 PM
Theo mình, bạn không cần dây Ground chung chắc chắn vẫn OK. Mình đoán bạn đưa vào cho chắc :D. Ngoài ra, mình thấy cấu hình vậy là Ok rồi.

Về điện trở đầu cuối theo mình cũng vẫn OK, nếu khoảng cách ngắn ko cần vẫn chạy tốt (cty mình đang thử với khoảng 200 m, ko cần nó chạy vẫn ngon).
Good luck

stupid11
21-05-2011, 11:39 PM
Vậy bạn đi làm rồi à..vậy chắc mình phải gọi là anh rồi !!!
Vậy anh cho em hỏi trạm đầu em chặn với 3 điện trở,còn trạm cuối em chặn có 1 thôi..cũng được phải không anh..tại em cứ nghĩ trạm đầu chặn sao thì trạm cuối cũng như vậy..
Anh cho em email để em tiện liên lạc,học hỏi thêm kinh nghiệm được không anh ?

nhuythuy
22-05-2011, 12:00 AM
Bạn có thể gôgle để tham khảo thêm gợi ý về R120 Ohm này. Thậm chí ko cần R120Ohm cung ok mà :)

Mình sẽ nhắn email bạn sau nhé

tanbka
22-05-2011, 01:11 AM
Hnay vào diễn đàn thấy mọi người đang trao đổi về mạng 485, mình cũng đã làm về nó để chạy trong công nghiệp, có một số kinh nghiệm chia sẻ cùng các bạn.
+ Thứ nhất là dây nối mass chung, ở trong công nghiệp điện thế từ vị trí này sang vị trí khác, đặc biệt là từ xưởng này sang xưởng khác, sự chênh áp tự nhiên là rất cao, thực tế có thể lên tới trên 30V..., vậy nên để cho điện áp so sánh AB luôn nằm trong vùng hoạt động của chip, ta nên nối mass chung.
+ Thứ 2 về về mạch chuyển đổi, mình sử dụng max485 và max232, đã làm, đã thử, và chạy trong công nghiệp, mình post mạch nguyên lý để các bạn tham khảo và làm. Đảm bảo cắm là chạy.

stupid11
22-05-2011, 01:21 AM
Bạn tanbka vẽ mạch bằng phần mềm gì vậy..mình mở không được..!

tanbka
22-05-2011, 01:30 AM
Oh, mình dùng protel DXP, mạch này mình dùng cách đây 3 năm roài.

stupid11
22-05-2011, 01:31 AM
Oh, mình dùng protel DXP, mạch này mình dùng cách đây 3 năm roài.

Mình xài Orcad nên ko mở được rồi..bạn có thể chụp hình hoặc in ra file .pdf được không ?

tanbka
22-05-2011, 01:40 AM
Oh, cái này chắc các bạn đều đọc được.

stupid11
22-05-2011, 01:46 AM
Mạch này tự động chuyển mạch hay sao vậy bạn ? Mình không thấy chân điều khiển hướng
...

tanbka
22-05-2011, 01:48 AM
Đúng rồi, nó lấy tín hiệu chuyển mạch khi có dữ liệu từ đầu 232 xuống.

stupid11
22-05-2011, 01:54 AM
-Nếu như vậy thì mình chỉ việc lập trình giống chuẩn RS232 thôi..không cần nghĩ ngợi gì đến chân đk hướng đúng không cậu ?
-Mà hình như mạch này chưa có trở chặn thì phải...

Đây là mạch bạn tanbka đã chia sẻ :
http://i1090.photobucket.com/albums/i375/dungdt08b/465.jpg
http://i1090.photobucket.com/albums/i375/dungdt08b/3.jpg

stupid11
22-05-2011, 09:53 AM
Bạn tanbka cho mình hỏi mạch trên chỉ truyền data thôi hay sao vậy...có thể nhận data về được không ?

nguyen_de89
22-05-2011, 10:07 AM
Đúng rồi, nó lấy tín hiệu chuyển mạch khi có dữ liệu từ đầu 232 xuống.
Theo như tanbka nói thì lấy tín hiệu chuyển mạch khi có dữ liệu từ đầu 232 xuống,còn nếu muốn chuyển mạch theo hướng ngược lại thì có được k bạn(tức là nhận data về),mình có cần tác động vào chân điều khiển hướng của 485 k?hay là mạch tự động hả bạn

tanbka
22-05-2011, 05:40 PM
Mạch này tự động chuyển hướng, truyền dữ liệu 2 chiều, các bạn chỉ cần bơm dữ liệu vào 1 đầu, đầu kia sẽ có dữ liệu.

nguyen_de89
22-05-2011, 06:01 PM
Mạch này tự động chuyển hướng, truyền dữ liệu 2 chiều, các bạn chỉ cần bơm dữ liệu vào 1 đầu, đầu kia sẽ có dữ liệu.
Bạn có thể giải thích sơ về nguyên lý tự động chuyển hướng này 1 tí dc k?mình cũng chưa rõ lắm,vì mình chưa thấy cái gì tác động vào chân chuyển hướng để mạch tự động chuyển hướng.Cái này là cho PC còn cho MCU thì sao bạn,có cần điện trở chặn đầu cuối k bạn

tanbka
23-05-2011, 12:09 AM
Trên chân chọn hướng của 485 nối với chân data của đầu rs232 qua con diot giảm áp xuống 5V mà. Khi nào có tín hiệu từ máy tính xuống, thì mạch truyền dữ liệu đi xa, còn bình thường nó nhận dữ liệu từ xa về.
Mạch này chuyển 232-485 mà, kết nối đơn giản không cần tín hiệu chuyển hướng, còn nếu bạn dùng MCU thì khỏi cần con 232, dùng mỗi con 485 thôi, tín hiệu chuyển hướng lấy từ 1 chân điều khiển ra của MCU.

nguyen_de89
23-05-2011, 12:51 AM
Trên chân chọn hướng của 485 nối với chân data của đầu rs232 qua con diot giảm áp xuống 5V mà. Khi nào có tín hiệu từ máy tính xuống, thì mạch truyền dữ liệu đi xa, còn bình thường nó nhận dữ liệu từ xa về.
Mạch này chuyển 232-485 mà, kết nối đơn giản không cần tín hiệu chuyển hướng, còn nếu bạn dùng MCU thì khỏi cần con 232, dùng mỗi con 485 thôi, tín hiệu chuyển hướng lấy từ 1 chân điều khiển ra của MCU.
Mạch trên dùng để connect với PC thì cần 232,còn đối với MCU như bạn nói thì chỉ cần mỗi con 485 như vậy tín hiệu control bằng tay phải k bạn?
Nếu MCU thì mình chỉ cần mỗi 485 bỏ 232 vậy mình có cần 4 điện trở ở đầu vào k bạn

tanbka
23-05-2011, 09:53 AM
điện trở đầu vào là bên phía 485, vẫn phải có chứ bạn.

nguyen_de89
23-05-2011, 10:46 AM
Còn ở chân số 3 của cổng COM đó bạn,có nối với điện trở 1k2 xong nối qua 485,và 2 diode,sau đó nối với chân chọn hướng của 485 theo bạn nói diode zener ghim 5v,mình k biết tác dụng làm gì vậy bạn,bạn có thể giải thích kĩ chỗ đó giùm mình dc k?

longdv
10-06-2012, 11:32 PM
mình nghĩ thế này ko biêt đúng ko.
bình thương nhận data tư VDK về thì chân TXD của công COM ở mức 0. cho phép max485 nhận data. \
còn khi gửi data đi thì chân TXD của công COM Khác mức 0 (có khi lên mức 1 tùy data), khi nó ở mức 1 (khoảng 12V) thì có con zener5V ghim 5V làm cho mức 1 xuống con 5V==> đưa vô Max485 nó hiểu là đang cho phép truyền data ,. thế là truyền thôi,
Bình thường thì nó ở chế độ nhận data

chuotdientu
14-06-2012, 12:41 PM
Mạch của bạn tanbka:

Ở chế độ RS232 không truyền data :
-->Tx_RS232 (chân số 3) ở mức 1: tương ứng -12V-->bị D4 ghim áp 0V (thực tế khoảng .6~.7V)-->tín hiệu chân 2,3 max485 mức 0 (0V)-->max485 nhận data.
-->vậy: nếu RS232 không truyền data thì max485 sẽ ở chế độ nhận data

Ở chế độ RS232 truyền data:
-->Tx_RS232 (chân số 3) ở mức 0: tương ứng +12V-->bị D3 zener ghim áp 5V(lúc này D4 không hoạt động)-->tín hiệu chân 2,3 max485 mức 1 (5V)-->max485 truyền data. (disable nhận data)
-->Vậy: nếu RS232 truyền data thì max 485 chuyển sang chế độ truyền data.(và không nhận data).

D4: ghim áp 0V-->tạo logic0 cho max485
D3: ghim áp 5V-->nếu không có D3 thì điện áp 12 đưa thẳng vào max485-->max485 sẽ theo ông bà liền

mạch này là haft duplex.

mrtddiep
14-06-2012, 01:09 PM
help help me.cac huynh oi co ai biet con ic tc74a0-5.0 o cho nao ban khong minh kiem o cho nhat tao ma khong thay.chi cho minh voi hay ai co thi de lai cho minh voi. cam on moi nguoi truoc nhe !

mrtddiep
15-06-2012, 11:53 AM
cac huynh oi sao khong ai chi cho minh cho mua voi .help help gan bao ve roi.
hic hic !