MCP3424, làm thế nào để đọc các kênh song song?


9

Về câu hỏi này

Tôi không có nền tảng kỹ thuật điện tử và đây là một trong những thách thức đầu tiên của tôi khi giao tiếp qua I2C, và bằng cách viết vào sổ đăng ký, vì vậy xin đừng thừa nhận quá nhiều kiến ​​thức từ phía tôi. Tôi đang lập trình một Arduino.

Khi hỏi về một thành phần / chip điện tử cụ thể, tôi cho rằng mọi người không thể thử nghiệm / kiểm tra để cho tôi một câu trả lời chính xác. Tôi cũng mong rằng mọi người thậm chí sẽ không biết thành phần này. Vì vậy tôi sẽ cố gắng thêm nhiều thông tin trong câu hỏi này.

Xin hãy để tôi biết nếu bạn cần nhiều thông tin hơn.

Thành phần này có bốn ADC

Tôi đang sử dụng thành phần 4 kênh, MCP3424 (biểu dữ liệu ). Nó có hai gói. Tôi đang sử dụng MCP3424 E / SL, phiên bản SOIC 4 kênh, không phải phiên bản 2 kênh MCP3422 hoặc MCP3423.

Tôi tin rằng nó có bốn ADC. Trên RS-Online, có vẻ như phiên bản E / SL có 4 ADC ( liên kết trực tiếp ), trong khi E / ST chỉ có một ( liên kết trực tiếp ). nhập mô tả hình ảnh ở đây

Tôi cho rằng điều này phải có nghĩa là nó có thể lấy mẫu trên một số kênh cùng một lúc. Tôi không thấy bất kỳ lý do nào khác để đặt nhiều hơn một ADC vào thành phần.

Tôi có đúng không

Giao tiếp qua I2C

Giao tiếp xảy ra bằng cách gửi một byte cấu hình, sau đó chờ lấy mẫu kết thúc và đọc kết quả.

Định dạng của Cấu hình byte

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

Những điều thú vị là:

  • bit ba từ trái, đếm từ 1: Lấy mẫu liên tục
  • bit một và hai từ trái, đếm từ 1: Địa chỉ

Thông tin thêm về byte cấu hình có thể được tìm thấy trên trang dữ liệu 18, cũng được mô tả ở đây .

Định dạng kết quả đọc

Các ví dụ của tôi sẽ chỉ có độ phân giải 18 bit (bit 5 và 6 được đặt thành 1). Kết quả đọc lại sẽ là bốn byte: ba byte đầu tiên chứa giá trị và thứ tư chứa byte cấu hình.

Tuy nhiên, bit ngoài cùng bên trái ,! RDY, cho biết nếu giá trị là "mới", tức là nếu đó là lần đọc mới, kể từ lần đọc cuối cùng. Lần đầu tiên đọc một kết quả, giá trị là 0 và đối với các kết quả tiếp theo là 1, cho đến khi ADC sẵn sàng với một giá trị mẫu mới.

Cách sử dụng mà không cần lấy mẫu song song

Tôi biết rất rõ làm thế nào để làm điều này. Và tất cả các ví dụ tôi đã tìm thấy trực tuyến, cũng đơn giản du này. Chỉ cần viết một byte cấu hình cho thành phần, sau đó đọc lại một giá trị.

Cách đặt từng kênh để lấy mẫu tự động và đọc song song các kênh

Mã giả có thể là smth như

setup():
    start sampling channel 1, 18bit, 0gain, continuously
    start sampling channel 2, 18bit, 0gain, continuously
    start sampling channel 3, 18bit, 4gain, continuously
    start sampling channel 1, 18bit, 2gain, continuously

readADCs():
    // Run every 500ms
    // 18 bit samples take 375ms, so must happen in parallel 
    // to get a new sample for all every 500ms
    read channel 1
    read channel 2
    read channel 3
    read channel 4

Nỗ lực tốt nhất của tôi

Vì vậy, tôi hy vọng rằng các điều sau đây sẽ đặt từng ADC để lấy mẫu liên tục. Đây là mã Arduino.

void setup() {

    Wire.write(0b00011100);
    Wire.write(0b01011100);
    Wire.write(0b10011110);
    Wire.write(0b11011101);
}

Sau đó, làm thế nào để tôi đọc một kênh cụ thể. Nếu tôi chỉ hỏi thành phần cho kết quả, nó sẽ trả về kết quả của kênh trên thanh ghi. Với thiết lập ở trên, tôi sẽ có được cách đọc cho kênh 4. Nhưng hãy nói rằng tôi muốn đọc từ kênh 2. Theo một cách nào đó tôi chỉ cần nói với nó, rằng tôi muốn kết quả của kênh 2. Tôi không muốn yêu cầu nó lấy mẫu bất cứ thứ gì, nó chỉ nên tiếp tục lấy mẫu liên tục và tôi chỉ muốn mẫu bực bội nhất mà nó tạo ra trong khi tự động lấy mẫu.

Dưới đây là dự đoán tốt nhất của tôi

void readADCs() {

    // Channel 1
    // ...

    // Channel 2
    Wire.beginTransmission(104);
    Wire.write(0b01011100); // I hope not to affect, just to select
    Wire.endTransmission();
    Wire.requestFrom(104);
    Wire.read(); // val byte 1
    Wire.read(); // val byte 2
    Wire.read(); // val byte 3
    Wire.read(); // config byte
}

Vì vậy, dự đoán tốt nhất của tôi là. Nếu tôi muốn đọc kênh 2, tôi viết một byte cấu hình hoàn toàn giống với kênh tôi đã sử dụng để bắt đầu lấy mẫu kênh 2.

Tuy nhiên, điều này không hoạt động. Không có mẫu nào sẵn sàng, ngay cả khi nó đã có nhiều hơn 375ms cần thiết.

Làm thế nào để tôi đạt được điều này?

Tôi đã cố gắng làm hết sức mình với việc mô tả kết quả mong muốn và những gì tôi đã cố gắng, nhưng tôi biết nó không dễ đọc.

Bạn có thể cho tôi lời khuyên về cách để cho tất cả các mẫu ADC song song, sau đó đọc từ chúng mà không can thiệp không?


Khởi đầu tốt. Điều duy nhất còn thiếu là một liên kết đến bảng dữ liệu cho MCP3424 mà tôi đã thêm.
JRE

MCP3424 có hai gói, không phải phiên bản và cả hai đều là 4 kênh. ST là TSSOP, SL là Soic. Có MCP3422 2 kênh, địa chỉ cố định, MCP3423, 2 kênh, địa chỉ điều chỉnh và MCP3424 4 kênh.
Người qua đường

+1 Câu hỏi rất kỹ lưỡng, được viết tốt. Đáng buồn thay, con chip đó là một ADC. Điều đó được minh họa trong biểu dữ liệu của nó trong "Sơ đồ khối chức năng". Bạn đã đọc các kênh đầu vào có nghĩa là ADC. Có nhiều kênh đầu vào cho phép một ADC được sử dụng để lấy mẫu nhiều tín hiệu khác nhau (tuần tự). ADC đắt hơn nhiều so với bộ ghép kênh tương tự (chọn kênh) và lấy mẫu nhiều tín hiệu là một yêu cầu phổ biến. Do đó các chip ADC thường hoạt động theo cách này. Andy aka đã trả lời câu hỏi của bạn, nhưng có thể đợi trước khi chấp nhận, vì bạn có thể nhận thêm thông tin.
xe cứu thương

Tôi tin rằng nó có 4 ADC, vì RS-Online nói rằng E / SL có 4 và E / ST có 1. Tôi đã thêm vào mô tả
Mads Skjern

2
@MadsSkjern bỏ qua RS, Microchip và bảng dữ liệu của họ là vua. Đó là một sai lầm trên RS. Sai lầm trên các trang web phân phối là khá phổ biến.
Người qua đường

Câu trả lời:


11

Tôi có cái sau với bốn ADC. Tôi cho rằng điều này phải có nghĩa là nó có thể lấy mẫu trên một số kênh cùng một lúc.

Không may măn. Chỉ có một ADC và để chuyển đổi nhiều hơn một kênh, điều này phải được thực hiện tuần tự bằng cách giải quyết bộ ghép kênh bên trong do đó "đọc" một kênh khác. Không may lấy mẫu đồng thời: -

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

Lưu ý bộ ghép kênh đầu vào CHỈ chọn một trong bốn kênh bất kỳ lúc nào. Đây là một phương pháp khá phổ biến được sử dụng để đọc nhiều kênh nhưng có các ADC lấy mẫu đồng thời ngoài kia. Hãy thử nhìn vào danh mục công nghệ tuyến tính, TI của hoặc ADI.


+1, ya đánh bại tôi :-) Có thể đáng để đánh vần sự thật rằng nó khá phổ biến đối với một kênh ADC mẫu, bởi vì nó có thể lấy mẫu các tín hiệu tương tự khác nhau, đây là trường hợp phổ biến.
xe cứu thương

Ngoài ra, nếu tỷ lệ lấy mẫu thấp được yêu cầu, ghép kênh / xen kẽ thường đủ tốt
Scott Seidman

Cải thiện spiffing, thưa ông.
xe cứu thương

@gbulmer bạn thật tốt bụng ạ !!
Andy aka

5

Các MCP3424 là một ADC duy nhất với một bộ đa trên kết thúc trước.

Sơ đồ này từ biểu dữ liệu cho thấy điều này khá rõ ràng

Kiến trúc MCP3424

Bảng dữ liệu sao lưu điều này với phần giới thiệu:

4.1 Tổng quan chung

Các thiết bị MCP3422 / 3/4 là bộ chuyển đổi A / D Delta-Sigma A / D công suất thấp đa kênh với giao diện nối tiếp I2C. Các thiết bị chứa bộ ghép kênh chọn kênh đầu vào (mux), bộ khuếch đại khuếch đại có thể lập trình (PGA), tham chiếu điện áp trên bo mạch (2.048V) và bộ tạo dao động bên trong.

Do đó, bạn không thể chuyển đổi các kênh khác nhau thực sự đồng thời, nhưng bạn có thể lấy mẫu các kênh liên tục với độ trễ tương đối ngắn giữa chúng.

Khi sử dụng thiết bị, bạn cần đảm bảo rằng các bit địa chỉ I2C ổn định; một lần nữa, từ biểu dữ liệu:

MCP3423 và MCP3424 có hai chân địa chỉ thiết bị bên ngoài (Adr1, Adr0). Các chân này có thể được đặt ở mức logic cao (hoặc được gắn với VDD), thấp (hoặc được gắn với VSS) hoặc thả nổi (không được kết nối với bất kỳ thứ gì hoặc được gắn với VDD / 2), Các kết hợp mức logic này sử dụng hai chân cho phép tám địa chỉ có thể. Bảng 5-3 hiển thị địa chỉ thiết bị tùy thuộc vào trạng thái logic của các chân chọn địa chỉ. Thiết bị lấy mẫu trạng thái logic của các chân Adr0 và Adr1 trong các sự kiện sau:

a. Thiết bị bật nguồn.

b. Đặt lại cuộc gọi chung

(Xem Phần 5.4 Gọi điện thoại chung).

c. Chốt cuộc gọi chung

(Xem Phần 5.4 Gọi điện thoại chung).

Thiết bị lấy mẫu trạng thái logic (chân địa chỉ) trong các sự kiện trên và chốt các giá trị cho đến khi xảy ra sự kiện chốt mới. Trong quá trình hoạt động bình thường (sau khi chốt địa chỉ được chốt), các chân địa chỉ bị vô hiệu hóa bên trong khỏi phần còn lại của mạch bên trong.

Bạn nên đưa ra lệnh Đặt lại cuộc gọi chung hoặc Lệnh gọi chung chung một lần sau khi thiết bị đã bật nguồn. Điều này sẽ đảm bảo rằng thiết bị đọc các chân địa chỉ trong điều kiện ổn định và tránh chốt các bit địa chỉ trong khi nguồn điện được tăng cường. Điều này có thể gây ra phát hiện pin địa chỉ không chính xác.

Tôi sẽ đề nghị bạn làm theo khuyến nghị này để đảm bảo bạn thực sự đang liên lạc với thiết bị.

Để đọc một kênh cụ thể, bạn phải chọn kênh trong thanh ghi Cấu hình và bắt đầu chuyển đổi. Bit RDY sẽ xuống thấp khi kết quả của chuyển đổi đó có sẵn trong thanh ghi đầu ra.

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.