Làm thế nào tôi có thể đọc một đầu ra tristate với vi điều khiển?


7

Tôi muốn giao tiếp dòng STAT của IC quản lý sạc ion lithium MCP73831 cho vi điều khiển để đọc trạng thái sạc hiện tại của nó.

Bảng dữ liệu giải thích, trong phần 5.2.1, dòng STAT là đầu ra xoắn và có trạng thái sau:

  • Cao
  • Thấp
  • Trở kháng cao

và một bảng được cung cấp giải thích cách mỗi cấp biểu thị từng trạng thái sạc của pin.

Làm thế nào tôi có thể kết nối pin này với I / O của vi điều khiển và đọc ba trạng thái riêng biệt này?

Đọc Cao và Thấp khá đơn giản, nhưng việc phát hiện đầu vào là trở kháng cao mà tôi chưa từng làm trước đây.

Câu trả lời:


11

Bạn có thể buộc nó xuống đất và Vcc bằng hai điện trở 10k và sử dụng đầu vào A / D để đọc mức.

Nếu bạn không có A / D để dự phòng, hãy kết nối nó với một pin khác của uC bằng điện trở 10k. Nếu pin là cao hoặc thấp, tất nhiên nó sẽ đọc là độ cao cao. thấp (giả sử nó có thể lái xe tải 10k). Nếu nó có trở kháng cao, nó sẽ đọc bằng với những gì bạn xuất ra trên chân kia.


+ Tôi thích ý tưởng thứ 2. Đọc với đầu ra cao và đầu ra thấp, bốn khả năng, trong đó chỉ có ba khả năng hợp lý.
Spehro Pefhany

Ý tưởng tốt đẹp sử dụng các pin khác. Trong trường hợp này, đầu vào có thể / sẽ vượt quá bộ xử lý Vcc. Đã thêm một bài viết thay vì một bình luận mở rộng.
khắc

8

Nhiều vi điều khiển cho phép bạn chọn giữa một trong hai yếu pullup và yếu điện trở kéo xuống trên một đầu vào GPIO - theo thứ tự khoảng 50k-100k Ohm. Nếu đầu vào ở mức z cao, thì một lần đọc có bật kéo xuống yếu sẽ đọc ở mức thấp và lần đọc sau với pullup yếu sẽ ở mức cao.

Hãy nhớ đợi một vài góc giữa chuyển đổi điện trở và đọc GPIO để cho phép điện áp trên chân ổn định.

Lưu ý rằng các máy AVR và 8051 cũ hơn có thể chỉ có lực kéo yếu nhưng không có điện trở kéo xuống yếu.


2
+1 ... Đối với các MPU không có khả năng kéo xuống yếu và khả năng kéo xuống yếu, bạn có thể thêm một điện trở bên ngoài vào một chân GPIO khác và sử dụng nó để điều khiển điện trở cao hay thấp.
Tut

4

Nếu bạn đọc những tài liệu - phần 3.3 bạn sẽ thấy rằng nó được thiết kế để được sử dụng với một điện trở kéo lên.

Trong thực tế với bất kỳ tín hiệu mở hoặc trạng thái ba trạng thái nào bạn không có ý định đọc nó khi ở chế độ ba trạng thái, nó được thiết kế theo cách đó để tín hiệu có thể được chia sẻ trên nhiều thiết bị. Điều khó hiểu là nếu bạn đang đọc tín hiệu và nó ở chế độ ba trạng thái (và bạn không biết điều đó), bạn có thể nhận được các bài đọc giả. Cách tốt nhất là sau đó áp dụng một lực kéo yếu lên để nếu tín hiệu ở trạng thái mơ hồ, thì tín hiệu được đọc một cách thích hợp. Vì tín hiệu này có nghĩa là đang lái một đèn LED để chỉ trạng thái sạc (tức là đang sạc), sau đó kéo lên và nó đọc cao, có nghĩa là nó không sạc.

nhập mô tả hình ảnh ở đây


1
Bảng trong mục 5.2.1 chỉ ra rằng (đối với MCP73831) rằng đầu ra "CAO Z" biểu thị "Tắt máy" hoặc "Không có pin", trong khi đầu ra "H" (cao) cho biết "Hoàn thành sạc - Chờ". Một điện trở kéo lên một mình sẽ không cho phép MCU cho biết sự khác biệt.
Tut

Khi kéo lên, các chế độ "tắt máy", "không có pin" và "Sạc đầy - chờ" tất cả các bản đồ đều có cùng mức đọc Cao. Đây là tất cả các bản đồ cho hành động "không làm gì cả" có vẻ như biểu dữ liệu là nhất quán.
giữ chỗ

@placeholder rằng ánh xạ có thể không được mong muốn - sạc cạnh tranh và không có pin là những trường hợp cực kỳ khác nhau.
Chris Stratton

0

Nếu tôi có thể thêm một cảnh báo cho bài viết này. MCP73831 là chip sạc pin và do đó Vdd của nó cao hơn Vbat.

nhập mô tả hình ảnh ở đây

Giả sử vi điều khiển của bạn được kết nối với Vbat và Vdd được cung cấp từ USB, thì Vdd có thể cao hơn ít nhất 1,5V so với V ucontler .

Điều hấp dẫn là, trên 73831 có đầu ra cực totem, STAT được gọi là Vdd . Vì vậy, đừng kết nối STAT trực tiếp với đầu vào uC. Sử dụng một cái gì đó như một điện trở 10k ở giữa. Đối với micro PIC, các kẹp diode đầu vào sẽ kẹp vào Vcc của nó (kiểm tra biểu dữ liệu để biết dòng điện tối đa trước khi chốt)

Là một phụ lục - năm ngoái tôi đã bắt gặp một bản hack để đọc các đầu vào hi / low / z dành cho PIC nhưng có thể (hoặc có thể không) hoạt động cho bạn. Một cái gì đó như (mã giả):

STAT ----[10k]------ PIC
PIN starts as input

set PIN low
set PIN to output
set PIN to input
set PIN high
value = read PIN  (assuming 1 for high, 0 for low)
value = value << 1
set PIN to output
set PIN to input
value |= read PIN

Sau đó, bạn nhận được 0 cho mức thấp, 1 cho Hi-Z và 3 cho mức cao. YMMV.


Tôi có cùng một vấn đề. Điều tôi không hiểu là tại sao nó lại hoạt động với 10k và không phá hủy AVR? Đó là dòng giới hạn, nhưng điện áp vẫn là 5V, vượt quá điện áp I / O tối đa VCC + 0,5V.
da_petcu21

Điện áp ở một bên của điện trở nằm ngoài thông số kỹ thuật, nhưng tại chân micro, các điốt bảo vệ đầu vào đang kẹp điện áp tối đa vào VCC + một diode rơi, nằm trong spec. Nếu dòng điện quá cao mặc dù bạn vẫn sẽ phá hủy điốt. Vì vậy, nếu bạn có điện trở 200V -> 10Mohm -> Pin, dòng điện sẽ là 20uA. Bây giờ tôi sẽ không làm điều đó mà không có điốt Schottky bên ngoài nhưng bạn hiểu ý.
carveone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.