Daftar Isi:

Arduino dan PCF8591 ADC DAC IC: 7 Langkah
Arduino dan PCF8591 ADC DAC IC: 7 Langkah

Video: Arduino dan PCF8591 ADC DAC IC: 7 Langkah

Video: Arduino dan PCF8591 ADC DAC IC: 7 Langkah
Video: Step-by-Step ARDUINO Step#7 Analog to Digital Converter (ADC) | Arduino Uno & coding 2024, Juli
Anonim
Arduino dan PCF8591 ADC DAC IC
Arduino dan PCF8591 ADC DAC IC

Pernahkah Anda menginginkan lebih banyak pin input analog pada proyek Arduino Anda, tetapi tidak ingin membayar untuk Mega? Atau apakah Anda ingin menghasilkan sinyal analog? Kemudian lihat subjek tutorial kami – IC NXP PCF8591.

Ini memecahkan kedua masalah ini karena memiliki konverter DAC (digital ke analog) tunggal serta empat ADC (konverter analog ke digital) - semuanya dapat diakses melalui bus I2C. PCF8591 tersedia dalam DIP, pemasangan di permukaan, dan bentuk modul, yang membuatnya mudah untuk bereksperimen.

Sebelum melanjutkan, unduh lembar data. PCF8591 dapat beroperasi pada 5V dan 3.3V, jadi jika Anda menggunakan Arduino Due, Raspberry Pi, atau papan pengembangan 3.3 V lainnya, Anda baik-baik saja. Sekarang pertama-tama kita akan menjelaskan DAC, lalu ADC.

Langkah 1: Menggunakan DAC (digital-to-analogue Converter)

Menggunakan DAC (Konverter digital-ke-analog)
Menggunakan DAC (Konverter digital-ke-analog)

DAC pada PCF8591 memiliki resolusi 8-bit – sehingga dapat menghasilkan sinyal teoritis antara nol volt dan tegangan referensi (Vref) dalam 255 langkah. Untuk tujuan demonstrasi, kami akan menggunakan Vref 5V, dan Anda dapat menggunakan Vref yang lebih rendah seperti 3.3V atau berapa pun nilai maksimum yang Anda inginkan … namun harus kurang dari tegangan suplai.

Perhatikan bahwa ketika ada beban pada output analog (situasi dunia nyata), tegangan output maksimum akan turun – lembar data (yang Anda unduh) menunjukkan penurunan 10% untuk beban 10kΩ. Sekarang untuk sirkuit demonstrasi kami.

Perhatikan penggunaan resistor pull-up 10kΩ pada bus I2C, dan kapasitor 10μF antara 5V dan GND. Alamat bus I2C diatur oleh kombinasi pin A0~A2, dan dengan semuanya ke GND alamatnya adalah 0x90. Output analog dapat diambil dari pin 15 (dan ada analog terpisah GND pada pin 13. Juga, hubungkan pin 13 ke GND, dan rangkaian GND ke Arduino GND.

Untuk mengontrol DAC kita perlu mengirim dua byte data. Yang pertama adalah byte kontrol, yang hanya mengaktifkan DAC dan 1000000 (atau 0x40) dan byte berikutnya adalah nilai antara 0 dan 255 (tingkat output). Hal ini ditunjukkan dalam sketsa berikut:

// Contoh demo 52.1 PCF8591 DAC

#include "Wire.h" #define PCF8591 (0x90 >> 1) // alamat bus I2C void setup() { Wire.begin(); } void loop() { for (int i=0; i<256; i++) { Wire.beginTransmission(PCF8591); // membangunkan PCF8591 Wire.write(0x40); // control byte - nyalakan DAC (biner 1000000) Wire.write(i); // nilai untuk dikirim ke DAC Wire.endTransmission(); // akhiri transmisi }

untuk (int i=255; i>=0; --i)

{ Wire.beginTransmission(PCF8591); // membangunkan PCF8591 Wire.write(0x40); // control byte - nyalakan DAC (biner 1000000) Wire.write(i); // nilai untuk dikirim ke DAC Wire.endTransmission(); // akhiri transmisi } }

Apakah Anda memperhatikan pergeseran bit alamat bus dalam pernyataan #define? Arduino mengirimkan alamat 7-bit tetapi PCF8591 menginginkan alamat 8-bit, jadi kami menggeser byte satu per satu.

Langkah 2:

Gambar
Gambar

Hasil sketsa ditunjukkan pada gambar, kami telah menghubungkan Vref ke 5V dan probe osiloskop dan GND ke output analog dan GND masing-masing.

Langkah 3:

Gambar
Gambar

Jika Anda menyukai kurva, Anda dapat menghasilkan gelombang sinus dengan sketsa di bawah ini. Ini menggunakan tabel pencarian dalam array yang berisi poin data yang telah dihitung sebelumnya:

// Contoh 52.2 Demo PCF8591 DAC - gelombang sinus

#include "Wire.h" #define PCF8591 (0x90 >> 1) // alamat bus I2C uint8_t sine_wave[256] = { 0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, 0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE, 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4, 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xDA, 0xDC, 0xDA, 0xDC 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF5, 0xF4, 0xF3, 0xFxEF 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4, 0xC1, 0xBF, 01xBC, 0xBF 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x74 0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52, 0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x 3C, 0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18, 0x16, 0x15, 0x13, 0x11, 0x10, 0x0F 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24, 0x22 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64, 0x61, 0x64 0x70, 0x74, 0x77, 0x7A, 0x7D }; void setup() { Wire.begin(); } void loop() { for (int i=0; i<256; i++) { Wire.beginTransmission(PCF8591); // membangunkan PCF8591 Wire.write(0x40); // control byte - nyalakan DAC (biner 1000000) Wire.write(sine_wave); // nilai untuk dikirim ke DAC Wire.endTransmission(); // akhiri transmisi } }

Langkah 4:

Gambar
Gambar

Untuk dump gambar DSO berikut, kami mengubah Vref menjadi 3.3V – perhatikan perubahan maxima pada gelombang sinus.

Sekarang Anda dapat bereksperimen dengan DAC untuk membuat efek suara, sinyal, atau mengontrol sirkuit analog lainnya.

Langkah 5: Menggunakan ADC (Konverter analog-ke-digital)

Jika Anda telah menggunakan fungsi analogRead() di Arduino Anda (kembali ke Bab Satu), maka Anda sudah terbiasa dengan ADC. Tanpa PCF8591 kita dapat membaca tegangan antara nol dan Vref dan akan mengembalikan nilai antara nol dan 255 yang berbanding lurus dengan nol dan Vref.

Misalnya, mengukur 3.3V harus mengembalikan 168. Resolusi (8-bit) ADC lebih rendah dari Arduino onboard (10-bit) namun PCF8591 dapat melakukan sesuatu yang tidak dapat dilakukan oleh ADC Arduino. Tapi kita akan membahasnya sebentar lagi. Pertama, untuk sekadar membaca nilai setiap pin ADC, kami mengirim byte kontrol untuk memberi tahu PCF8591 ADC mana yang ingin kami baca. Untuk ADC nol sampai tiga byte kontrol masing-masing adalah 0x00, 0x01, ox02 dan 0x03.

Kemudian kami meminta dua byte data kembali dari ADC, dan menyimpan byte kedua untuk digunakan. Mengapa dua byte? PCF8591 mengembalikan nilai yang diukur sebelumnya terlebih dahulu – lalu byte saat ini. (Lihat Gambar 8 di lembar data). Terakhir, jika Anda tidak menggunakan semua pin ADC, sambungkan pin ADC yang tidak digunakan ke GND. Contoh sketsa berikut hanya mengambil nilai dari setiap pin ADC satu per satu, kemudian menampilkannya di monitor serial:

#sertakan "Wire.h"

#define PCF8591 (0x90 >> 1) // alamat bus I2C #define ADC0 0x00 // kontrol byte untuk membaca ADC individu #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 nilai byte0, nilai1, nilai2, nilai3; void setup() { Wire.begin(); Serial.begin(9600); } void loop() { Wire.beginTransmission(PCF8591); // membangunkan PCF8591 Wire.write(ADC0); // control byte - baca ADC0 Wire.endTransmission(); // akhiri transmisi Wire.requestFrom(PCF8591, 2); nilai0=Kabel.baca(); nilai0=Kabel.baca(); Wire.beginTransmission(PCF8591); // membangunkan PCF8591 Wire.write(ADC1); // control byte - baca ADC1 Wire.endTransmission(); // akhiri transmisi Wire.requestFrom(PCF8591, 2); nilai1=Kabel.baca(); nilai1=Kabel.baca(); Wire.beginTransmission(PCF8591); // membangunkan PCF8591 Wire.write(ADC2); // control byte - baca ADC2 Wire.endTransmission(); // akhiri transmisi Wire.requestFrom(PCF8591, 2); nilai2=Kabel.baca(); nilai2=Kabel.baca(); Wire.beginTransmission(PCF8591); // membangunkan PCF8591 Wire.write(ADC3); // control byte - baca ADC3 Wire.endTransmission(); // akhiri transmisi Wire.requestFrom(PCF8591, 2); nilai3=Kabel.baca(); nilai3=Kabel.baca(); Serial.print(nilai0); Serial.print(""); Serial.print(nilai1); Serial.print(""); Serial.print(nilai2); Serial.print(""); Serial.print(nilai3); Serial.print(""); Serial.println(); }

Saat menjalankan sketsa, Anda akan disajikan dengan nilai setiap ADC di monitor serial. Meskipun demonstrasi sederhana untuk menunjukkan kepada Anda bagaimana membaca setiap ADC secara individual, ini adalah metode yang rumit untuk mendapatkan lebih dari satu byte pada satu waktu dari ADC tertentu.

Langkah 6:

Untuk melakukan ini, ubah byte kontrol untuk meminta kenaikan otomatis, yang dilakukan dengan mengatur bit 2 dari byte kontrol ke 1. Jadi untuk memulai dari ADC0 kami menggunakan byte kontrol baru biner 00000100 atau heksadesimal 0x04. Kemudian minta lima byte data (sekali lagi kita abaikan byte pertama) yang akan menyebabkan PCF8591 mengembalikan semua nilai dalam satu rantai byte. Proses ini ditunjukkan dalam sketsa berikut:

#sertakan "Wire.h"

#define PCF8591 (0x90 >> 1) // alamat bus I2C nilai byte0, nilai1, nilai2, nilai3; void setup() { Wire.begin(); Serial.begin(9600); } void loop() { Wire.beginTransmission(PCF8591); // membangunkan PCF8591 Wire.write(0x04); // control byte - baca ADC0 lalu auto-increment Wire.endTransmission(); // akhiri transmisi Wire.requestFrom(PCF8591, 5); nilai0=Kabel.baca(); nilai0=Kabel.baca(); nilai1=Kabel.baca(); nilai2=Kabel.baca(); nilai3=Kabel.baca(); Serial.print(nilai0); Serial.print(""); Serial.print(nilai1); Serial.print(""); Serial.print(nilai2); Serial.print(""); Serial.print(nilai3); Serial.print(""); Serial.println(); }

Sebelumnya kami menyebutkan bahwa PCF8591 dapat melakukan sesuatu yang tidak dapat dilakukan oleh ADC Arduino, dan ini menawarkan ADC diferensial. Berbeda dengan Arduino yang berujung tunggal (yaitu mengembalikan perbedaan antara tegangan sinyal positif dan GND, ADC diferensial menerima dua sinyal (yang tidak harus direferensikan ke ground), dan mengembalikan perbedaan antara dua sinyal Ini dapat memudahkan untuk mengukur perubahan kecil pada voltase untuk sel beban dan sebagainya.

Langkah 7:

Gambar
Gambar

Menyiapkan PCF8591 untuk ADC diferensial adalah masalah sederhana mengubah byte kontrol. Jika Anda membuka halaman tujuh lembar data, maka pertimbangkan berbagai jenis pemrograman input analog. Sebelumnya kami menggunakan mode '00' untuk empat input, namun Anda dapat memilih yang lain yang diilustrasikan dengan jelas, misalnya gambar.

Jadi untuk mengatur byte kontrol untuk dua input diferensial, gunakan biner 00110000 atau 0x30. Maka itu masalah sederhana untuk meminta byte data dan bekerja dengannya. Seperti yang Anda lihat, ada juga kombinasi input tunggal/diferensial dan tiga diferensial kompleks. Namun kami akan meninggalkan mereka untuk sementara waktu.

Semoga Anda menemukan ini menarik, apakah menambahkan DAC ke eksperimen Anda atau belajar lebih banyak tentang ADC. Harap pertimbangkan untuk memesan PCF8591 Anda dari PMD Way.

Posting ini dipersembahkan oleh pmdway.com – semuanya untuk pembuat dan penggemar elektronik, dengan pengiriman gratis ke seluruh dunia.

Direkomendasikan: