MCP3424, bagaimana cara membaca saluran secara paralel?

9

Tentang pertanyaan ini

Saya tidak memiliki latar belakang teknik elektronik, dan ini adalah salah satu tantangan pertama saya untuk berkomunikasi melalui I2C, dan dengan menulis ke register, jadi tolong jangan menganggap terlalu banyak pengetahuan dari pihak saya. Saya memprogram Arduino.

Ketika bertanya tentang komponen / chip elektronik tertentu, saya berasumsi orang tidak dapat melakukan percobaan / pengujian untuk memberi saya jawaban yang benar. Saya juga berharap orang tidak akan tahu komponen ini. Karena itu saya akan mencoba menambahkan banyak informasi dalam pertanyaan ini.

Tolong beri tahu saya jika Anda memerlukan informasi lebih lanjut.

Komponen ini memiliki empat ADC

Saya menggunakan komponen 4-channel, MCP3424 ( lembar data ). Muncul dalam dua paket. Saya menggunakan MCP3424 E / SL, versi 4 channel SOIC, bukan versi MCP3422 atau MCP3423 2 channel.

Saya percaya ini memiliki empat ADC. Pada RS-Online, sepertinya versi E / SL memiliki 4 ADC ( tautan langsung ), sedangkan E / ST hanya memiliki satu ( tautan langsung ). masukkan deskripsi gambar di sini

Saya berasumsi ini harus berarti, bahwa ia dapat melakukan pengambilan sampel pada beberapa saluran secara bersamaan. Saya tidak melihat alasan lain untuk menempatkan lebih dari satu ADC pada komponen.

Apakah saya benar?

Komunikasi melalui I2C

Komunikasi terjadi dengan mengirimkan satu byte konfigurasi, kemudian menunggu sampel berakhir, dan membaca hasilnya.

Format Konfigurasi Byte

masukkan deskripsi gambar di sini

Yang menarik adalah:

  • bit tiga dari kiri, dihitung dari 1: Pengambilan sampel berkelanjutan
  • bit satu dan dua dari kiri, dihitung dari 1: Alamat

Lebih lanjut tentang byte konfigurasi dapat ditemukan di halaman lembar data 18, juga digambarkan di sini .

Format hasil baca

Contoh saya hanya akan dengan resolusi 18 bit (bit 5 dan 6 diatur ke 1). Hasil baca kembali akan empat byte: tiga pertama berisi nilai, dan keempat berisi byte konfigurasi.

Namun, bit paling kiri,! RDY, memberi tahu jika nilainya "baru", yaitu jika itu adalah bacaan baru, sejak bacaan terakhir. Pertama kali membaca satu hasil, nilainya 0, dan untuk yang berikutnya adalah 1, sampai ADC siap dengan nilai sampel baru.

Cara menggunakannya tanpa pengambilan sampel secara paralel

Saya tahu benar bagaimana melakukan ini. Dan semua contoh yang saya temukan online, juga sederhana ini. Cukup tulis byte konfigurasi ke komponen, lalu baca nilai kembali.

Cara mengatur setiap saluran untuk sampel secara otomatis secara contiously, dan membaca saluran secara paralel

Kode pseudo dapat berupa seperti

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

Usaha terbaik saya

Jadi saya berharap, bahwa berikut ini membuat setiap ADC untuk mengambil sampel secara terus menerus. Ini adalah kode Arduino.

void setup() {

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

Lalu, bagaimana cara membaca saluran tertentu. Jika saya hanya meminta komponen untuk hasil, itu akan mengembalikan hasil saluran pada register. Dengan pengaturan di atas, saya akan mendapatkan pembacaan untuk saluran 4. Tetapi katakanlah saya ingin membaca dari saluran 2. Dalam beberapa hal saya hanya perlu mengatakannya, bahwa saya ingin hasil dari saluran 2. Saya tidak ingin memintanya untuk mengambil sampel apa pun, harus terus melakukan pengambilan sampel berkelanjutan, dan saya hanya ingin sampel yang paling dibenci yang dibuat saat pengambilan sampel secara otomatis.

Di bawah ini adalah tebakan terbaik saya

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
}

Jadi tebakan terbaik saya adalah. Jika saya ingin membaca saluran 2, saya menulis byte konfigurasi yang persis sama, seperti apa yang saya gunakan untuk memulai pengambilan sampel saluran 2.

Namun, ini tidak berhasil. Tidak ada sampel yang siap, bahkan jika memiliki lebih dari 375ms yang diperlukan.

Bagaimana saya mencapai ini?

Saya telah mencoba melakukan yang terbaik dengan menggambarkan hasil yang diinginkan dan apa yang telah saya coba, tetapi saya tahu itu tidak mudah dibaca.

Bisakah Anda memberi saya saran tentang cara membiarkan semua sampel ADC paralel, dan kemudian membaca darinya, tanpa mengganggu?

Mads Skjern
sumber
Awal yang bagus. Satu-satunya hal yang hilang adalah tautan ke lembar data untuk MCP3424, yang telah saya tambahkan.
JRE
MCP3424 hadir dalam dua paket, bukan versi, dan keduanya 4 saluran. ST adalah TSSOP, SL adalah Soic. Ada saluran MCP3422 2, alamat tetap, MCP3423, 2 saluran, alamat yang dapat disesuaikan, dan saluran MCP3424 4.
Pejalan kaki
+1 Pertanyaan yang sangat menyeluruh, ditulis dengan baik. Sayangnya chip itu adalah ADC tunggal. Itu diilustrasikan dalam lembar datanya dalam "Diagram Blok Fungsional". Anda telah membaca saluran input sebagai ADC yang berarti. Memiliki banyak saluran input memungkinkan satu ADC digunakan untuk sampel berbagai sinyal (berurutan). ADC jauh lebih mahal untuk dibuat daripada multiplexer analog (yang memilih saluran), dan pengambilan sampel banyak sinyal adalah persyaratan umum. Karenanya chip ADC sering bekerja dengan cara ini. Andy alias telah menjawab pertanyaan Anda, tetapi mungkin menunggu sebelum menerima, karena Anda mungkin mendapatkan informasi lebih lanjut.
gbulmer
Saya percaya itu memiliki 4 ADC, karena RS-Online mengatakan bahwa E / SL memiliki 4, dan E / ST memiliki 1. Saya telah menambahkan ke deskripsi
Mads Skjern
2
@MadsSkjern mengabaikan RS, Microchip dan lembar data mereka adalah raja. Itu kesalahan di RS. Kesalahan pada situs distributor cukup umum.
Pejalan kaki

Jawaban:

11

Saya memiliki yang terakhir dengan empat ADC. Saya berasumsi ini harus berarti, bahwa ia dapat melakukan pengambilan sampel pada beberapa saluran secara bersamaan.

Sayangnya tidak. Hanya ada satu ADC dan, untuk mengkonversi lebih dari satu saluran, ini harus dilakukan secara berurutan dengan mengatasi internal multiplexer sehingga "membaca" saluran lain. Sayangnya tidak ada pengambilan sampel simultan: -

masukkan deskripsi gambar di sini

Perhatikan multiplekser input HANYA memilih satu dari empat saluran sekaligus. Ini adalah metode yang cukup umum digunakan untuk membaca beberapa saluran tetapi ada ADC pengambilan sampel simultan di luar sana. Coba lihat portofolio Linear tech, TI, atau ADI.

Andy alias
sumber
+1, ya ketuk saya :-) Mungkin perlu dieja fakta bahwa itu cukup umum untuk satu sampel beberapa saluran ADC, karena dapat mencicipi sinyal analog yang berbeda, yang merupakan kasus umum.
gbulmer
Juga, jika tingkat pengambilan sampel rendah diperlukan, multiplexing / interleaving seringkali cukup baik
Scott Seidman
Peningkatan spiffing, Pak.
gbulmer
@bulb Anda terlalu baik tuan !!
Andy alias
5

The MCP3424 adalah ADC tunggal dengan multiplexer di ujung depan.

Diagram ini dari lembar data menunjukkan ini dengan cukup jelas

Arsitektur MCP3424

Datasheet mendukung ini dengan pengantar:

4.1 Gambaran Umum

Perangkat MCP3422 / 3/4 adalah konverter multichannel low-power, 18-Bit Delta-Sigma A / D dengan antarmuka serial I2C. Perangkat tersebut berisi multiplexer pemilihan saluran input (mux), amplifier gain yang dapat diprogram (PGA), referensi tegangan terpasang (2.048V), dan osilator internal.

Oleh karena itu, Anda tidak dapat mengonversi saluran yang berbeda secara bersamaan, tetapi Anda dapat mengambil sampel saluran secara berurutan dengan penundaan yang relatif singkat di antara mereka.

Saat menggunakan perangkat, Anda perlu memastikan bahwa bit alamat I2C stabil; sekali lagi, dari lembar data:

MCP3423 dan MCP3424 memiliki dua pin alamat perangkat eksternal (Adr1, Adr0). Pin ini dapat diatur ke logika tinggi (atau diikat ke VDD), rendah (atau diikat ke VSS), atau dibiarkan mengambang (tidak terhubung ke apa pun, atau terikat ke VDD / 2), Kombinasi tingkat logika ini menggunakan dua pin izinkan delapan kemungkinan alamat. Tabel 5-3 menunjukkan alamat perangkat tergantung pada status logika pin pemilihan alamat. Perangkat sampel status logika pin Adr0 dan Adr1 dalam acara berikut:

Sebuah. Pengaktifan perangkat.

b. Reset Panggilan Umum

(Lihat Bagian 5.4 “Panggilan Umum”).

c. Kait Panggilan Umum

(Lihat Bagian 5.4 “Panggilan Umum”).

Perangkat sampel status logika (pin alamat) selama peristiwa di atas, dan mengunci nilai-nilai sampai peristiwa kait baru terjadi. Selama operasi normal (setelah pin alamat terkunci), pin alamat dinonaktifkan secara internal dari sisa rangkaian internal.

Dianjurkan untuk mengeluarkan perintah Atur Ulang Panggilan Umum atau Panggilan Panggilan Umum sekali setelah perangkat menyala. Ini akan memastikan bahwa perangkat membaca pin alamat dalam kondisi stabil, dan menghindari mengaitkan bit alamat saat catu daya meningkat. Ini dapat menyebabkan deteksi pin alamat yang tidak akurat.

Saya sarankan Anda mengikuti rekomendasi ini untuk memastikan Anda benar-benar berkomunikasi dengan perangkat.

Untuk membaca saluran tertentu, Anda harus memilih saluran di register Konfigurasi dan memulai konversi. Bit RDY akan rendah ketika hasil konversi itu tersedia di register output.

Peter Smith
sumber