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 ).
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
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?