Frekuensi DAC MCP4725 pada ESP32 C3

Pengukuran Frekuensi DAC MCP4725 pada ESP32

Foto perangkat

Kode Pengujian


#include <Wire.h>
#include <Adafruit_MCP4725.h>
#include <Wire.h>

#define I2C_SDA 15
#define I2C_SCL 13

Adafruit_MCP4725 dac;

void setup(void) {
  int address = 0;
  int hasil;
  uint32_t speed = 400000L;
  int status;
  status = Wire.begin(I2C_SDA, I2C_SCL, speed);
  Serial.begin(115200);
  Serial.print("Hello! Wire Init status:");
  Serial.println(status);
  Serial.println(speed);

  address = 0x62;
  dac.begin(address);
  Serial.println("Search I2C");
  SearchI2C();
  Serial.println("benchmark");
}
int start_sawtooth = 0;
int current_time;
int duration;
int time_begin;
int time_now;
uint32_t counter;
void loop(void) {
  dac.setVoltage(0, false);
  dac.setVoltage(4095, false);
  counter = counter + 1;
  if (counter >= 10000) {
    float period;
    int time_now = millis();
    counter = 0;
    duration = time_now - time_begin;
    period = duration / 10000.0 / 2;
    Serial.print("period (ms): ");
    Serial.println(period);
    //  prepare next round
    time_begin = time_now;
  }
}

void SearchI2C() {
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for (address = 1; address < 127; address++) {
    //    Serial.println(address, HEX);
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println("  !");

      nDevices++;
    } else if (error == 4) {
      Serial.print("Unknown error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
}

Pengukuran

Hasil pengukuran perioda

benchmark
period (ms): 0.18
period (ms): 0.17
period (ms): 0.17

Hasil pengukuran sinyal output DAC

Frekuensi DAC adalah 2,867 kHz x 2 = 5,734 kHz

Kesimpulan

Perioda : 0.17 ms

Frekuensi: 5,734 kHz

Referensi

Frekuensi DAC MCP4725 pada ESP32 C3

Pada percobaan ini diukur frekuensi & perioda konversi DAC tipe MCP4725 pada modul ESP32 C3 Luatos.

Rangkaian yang diuji

 

Kode Program

#include <Wire.h>
#include <Adafruit_MCP4725.h>
#include <Wire.h>

#define I2C_SDA 2
#define I2C_SCL 3

Adafruit_MCP4725 dac;

void setup(void) {
  int address = 0;
  int hasil;
  uint32_t speed = 1000000L;
  int status;
  speed = 3000000L;
  status = Wire.begin(I2C_SDA, I2C_SCL, speed);
  Serial.begin(115200);
  Serial.print("Hello! Wire Init status:");
  Serial.println(status);
  Serial.println(speed);

  address = 0x60;
  dac.begin(address);
  Serial.println("Search I2C");
  SearchI2C();
  Serial.println("Generating a triangle wave");
}
int start_sawtooth = 0;
int current_time;
int duration;
int time_begin;
int time_now;
uint32_t counter;

void loop(void) {
  dac.setVoltage(0, false);
  dac.setVoltage(4095, false);
  counter = counter + 1;
  if (counter >= 10000) {
    float period;
    int time_now = millis();
    counter = 0;
    duration = time_now - time_begin;
    period = duration / 10000.0 / 2;
    Serial.print("period (ms): ");
    Serial.println(period);
    //  prepare next round
    time_begin = time_now;
  }
}

void SearchI2C() {
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for (address = 1; address < 127; address++) {
    //    Serial.println(address, HEX);
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println("  !");

      nDevices++;
    } else if (error == 4) {
      Serial.print("Unknown error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
}

Kode ada di https://github.com/waskita/embedded/tree/master/esp32-c3-mcp4725

Pengukuran

Pengukuran dilakukan dengan frekuensi clock I2C dari 100 kHz sampai 3 Mhz. Semua menghasilkan angka yang sama.

Sinyal keluaran MCP4725 diukur dengan osiloskop.

Didapat frekuensi sinyal output adalah 3,080 kHz. Jadi frekuensi update DAC adalah 6,16 kHz

period (ms): 0.17
period (ms): 0.16
period (ms): 0.16
period (ms): 0.16

Pengukuran perioda menghasilkan angka 0,16 ms

Kesimpulan

Frekuensi update DAC adalah 6,16 kHz

Perioda 0,16 ms

Referensi

Frekuensi DAC MCP4725 pada Arduino Nano ATmega328

Pada percobaan ini diukur frekuensi & perioda konversi DAC (Digital to Analog Converter) tipe MCP4725  pada modul Arduino Nano dengan prosesor ATmega328.

Rangkaian sistem adalah sebagai berikut

 

Kode yang dipakai untuk pengujian adalah sebagai berikut:

// idea from https://learn.sparkfun.com/tutorials/mcp4725-digital-to-analog-converter-hookup-guide/all
#define MCP4725_ADDR 0x60
#include <Wire.h>  //Include the Wire library to talk I2C

int counter;  // how many iterations
int time_begin = 0;
int time_end = 0;
int duration;
void setup() {
  Wire.begin();
  Serial.begin(115200);
  counter = 0;
  Serial.println("start benchmark");
}
//---------------------------------------------------
void loop() {
  int value;  // angka yang ditulis
  value = 0;  // minimum value
  Wire.beginTransmission(MCP4725_ADDR);
  Wire.write(64);                 // cmd to update the DAC
  Wire.write(value >> 4);         // the 8 most significant bits...
  Wire.write((value & 15) << 4);  // the 4 least significant bits...
  Wire.endTransmission();

  value = 4095;  // maximum value
  Wire.beginTransmission(MCP4725_ADDR);
  Wire.write(64);                 // cmd to update the DAC
  Wire.write(value >> 4);         // the 8 most significant bits...
  Wire.write((value & 15) << 4);  // the 4 least significant bits...
  Wire.endTransmission();

  counter = counter + 1;
  if (counter >= 10000) {
    float  period;
    int time_now = millis();
      counter = 0;
    duration = time_now - time_begin;
    period = duration / 10000.0 / 2.0 ;
    Serial.print("period (ms): ");
    Serial.println(period);
    //  prepare next round
    time_begin = time_now;
  }
}

I2C 100 kHz

ATmega328 menggunakan 2 frekuensi I2C: 100 kHz dan 400 kHz. Percoban pertama menggunakan kecepatan default adalah 100 kHz.

Sinyal yang dihasilkan pada output MCP4725 adalah sebagai berikut:

Tampilan pada serial monitor adalah sebagai berikut:

start benchmark
period (ms): 0.43
period (ms): 0.43
period (ms): 0.43
period (ms): 0.43
period (ms): 0.43
period (ms): 0.43

Pengukuran dengan osiloskop menunjukkan sinyal persegi dengan frekuensi 1,166 kHz

Jumlah transisi adalah 2x frekuensi ini, jadi frekuensi konversi adalah 1,166 x 2 = 2,332 kHz

I2C 400 kHz

Pada pengukuran ini, kecepatan I2C dinaikkan menjadi 400 kHz. Caranya menggunakan fungsi Wire.setClock()

Perioda menjadi 0,15 ms

start benchmark
period (ms): 0.15
period (ms): 0.15
period (ms): 0.15
period (ms): 0.15
period (ms): 0.15

Output DAC diukur dengan osiloskop, dengan hasil sebagai berikut

Frekuensi output adalah 3,41733 kHz, sehingga frekuensi DAC adalah 2x 3,417 = 6,834 kHz

Kesimpulan

Dengan clock I2C 100 kHz, didapatkan

  • Perioda konversi ADC adalah 0,43 ms
  • frekuensi konversi ADC adalah 2,332 kHz

Dengan clock I2C 400 kHz, didapatkan

  • Perioda konversi ADC adalah 0,15 ms
  • frekuensi konversi ADC adalah 6,384 kHz

Referensi

Membuat Gelombang Sinus Dengan Arduino Nano Dan DAC MCP4725

Gelombang sinus dapat dibuat dengan Arduino Nano, dengan bantuan DAC (Digital to Analog Converter).

Arduino Nano dan UNO di dalamnya menggunakan mikrokontroler  ATmega328. ATmega328 ini tidak memiliki DAC, sehingga sebenarnya tidak mampu membuat tegangan analog secara langsung. Untuk aplikasi yang sederhana, hal ini dapat diakali dengan menggunakan fitur PWM (Pulse Width Modulation). Librarynya di Arduino menggunakan AnalogWrite() . Namun untuk menghasilkan tegangan analog yang lebih baik, diperlukan komponen DAC seperti MCP4725.

Berikut ini contoh pembangkitan gelombang sinusoidal dengan Arduino Nano dan DAC MCP4725.

Pertama rakit hubungkan MCP4725 ke Arduino. Koneksinya menggunakan protokol I2C.

Daftar pin yang dihubungkan adalah sebagai berikut:

Pin Arduino Pin MCP4725 Keterangan
A4 (SDA) SDA pin data untuk I2C
A5 (SCL) SCL pin clock untuk I2C
GND GND ground 0 volt
VCC 5V supply 5 volt

Protokol I2C menggunakan 2 kabel, yaitu SDA (data) dan SCL (clock). Kedua jalur ini sebenarnya perlu disambungkan dengan pull up menggunakan resistor, namun pada Arduino sudah ada pull up internal 10 kilo ohm, sehingga tidak perlu ditambah lagi.

MCP4725 perlu supply 5 volt, yang dapat diambil dari pin 5V dari Arduino. Namun perlu diperhatikan pada Arduino clone/KW, tegangan 5V ini biasanya kurang dari 5 volt, terutama jika menggunakan power supply dari USB.

Rangkaian Arduino Nano dan MCP4725 di breadboard
Rangkaian Arduino Nano dan MCP4725 di breadboard

Tahap selanjutnya adalah instalasi library “Adafruit MCP4725”. Ada beberapa cara instalasi:

  • Download langsung filenya dari  https://github.com/adafruit/Adafruit_MCP4725/archive/master.zip, kemudian instalasi dengan cara copy ke direktori library Arduino secara manual
  • Instalasi dari menu Arduino

Untuk melakujkan instalasi dari Arduino, lakukan tahap berikut ini:

  • Klik di menu “Tools” -> “Manage Libraries”, atau Ctrl -Shift – I
  • Cari library “Adafruit MCP4725”, kemudian klik install
  • Proses download akan dilakukan. Tunggu sampai selesai

 

Alamat MCP4725 mungkin perlu dicoba-coba, antara 0x60, 0x61, 0x62, 0x63, 0x64, 0x65. Jika ingin dicari dengan cepat, dapat menggunakan program kecil I2C Scanner untuk Arduino UNO/Nano

Berikut ini contoh software pembangkit sinusoidal. Kode ini diadaptasi dari situs https://learn.sparkfun.com/tutorials/mcp4725-digital-to-analog-converter-hookup-guide/all

Pada contoh di bawah ini, alamat MCP4725 adalah 0x63, namun mungkin perlu diubah-ubah.

/******************************************************************************
MCP4725 Example Waveform Sketch
Joel Bartlett
SparkFun Electronics
Sept. 11, 2014
https://github.com/sparkfun/MCP4725_Breakout

This sketch takes data from a lookup table to provide
waveforms to be generated by the MCP4725 DAC.

Development environment specifics:
Arduino 1.0+
Hardware Version V14

This code is beerware; if you see me (or any other SparkFun employee) at the local,
and you've found our code helpful, please buy us a round!

Distributed as-is; no warranty is given.

This code builds off the sketch written by Mark VandeWettering, which can be found here:
http://brainwagon.org/2011/02/24/arduino-mcp4725-breakout-board/
*/

#include <Wire.h>//Include the Wire library to talk I2C

//This is the I2C Address of the MCP4725, by default (A0 pulled to GND).
//Please note that this breakout is for the MCP4725A0.
#define MCP4725_ADDR 0x63
//For devices with A0 pulled HIGH, use 0x61

//Sinewave Tables were generated using this calculator:
//http://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml


int lookup = 0;//varaible for navigating through the tables

int sintab2[512] =
{
2048, 2073, 2098, 2123, 2148, 2174, 2199, 2224,
2249, 2274, 2299, 2324, 2349, 2373, 2398, 2423,
2448, 2472, 2497, 2521, 2546, 2570, 2594, 2618,
2643, 2667, 2690, 2714, 2738, 2762, 2785, 2808,
2832, 2855, 2878, 2901, 2924, 2946, 2969, 2991,
3013, 3036, 3057, 3079, 3101, 3122, 3144, 3165,
3186, 3207, 3227, 3248, 3268, 3288, 3308, 3328,
3347, 3367, 3386, 3405, 3423, 3442, 3460, 3478,
3496, 3514, 3531, 3548, 3565, 3582, 3599, 3615,
3631, 3647, 3663, 3678, 3693, 3708, 3722, 3737,
3751, 3765, 3778, 3792, 3805, 3817, 3830, 3842,
3854, 3866, 3877, 3888, 3899, 3910, 3920, 3930,
3940, 3950, 3959, 3968, 3976, 3985, 3993, 4000,
4008, 4015, 4022, 4028, 4035, 4041, 4046, 4052,
4057, 4061, 4066, 4070, 4074, 4077, 4081, 4084,
4086, 4088, 4090, 4092, 4094, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4094, 4092, 4090, 4088,
4086, 4084, 4081, 4077, 4074, 4070, 4066, 4061,
4057, 4052, 4046, 4041, 4035, 4028, 4022, 4015,
4008, 4000, 3993, 3985, 3976, 3968, 3959, 3950,
3940, 3930, 3920, 3910, 3899, 3888, 3877, 3866,
3854, 3842, 3830, 3817, 3805, 3792, 3778, 3765,
3751, 3737, 3722, 3708, 3693, 3678, 3663, 3647,
3631, 3615, 3599, 3582, 3565, 3548, 3531, 3514,
3496, 3478, 3460, 3442, 3423, 3405, 3386, 3367,
3347, 3328, 3308, 3288, 3268, 3248, 3227, 3207,
3186, 3165, 3144, 3122, 3101, 3079, 3057, 3036,
3013, 2991, 2969, 2946, 2924, 2901, 2878, 2855,
2832, 2808, 2785, 2762, 2738, 2714, 2690, 2667,
2643, 2618, 2594, 2570, 2546, 2521, 2497, 2472,
2448, 2423, 2398, 2373, 2349, 2324, 2299, 2274,
2249, 2224, 2199, 2174, 2148, 2123, 2098, 2073,
2048, 2023, 1998, 1973, 1948, 1922, 1897, 1872,
1847, 1822, 1797, 1772, 1747, 1723, 1698, 1673,
1648, 1624, 1599, 1575, 1550, 1526, 1502, 1478,
1453, 1429, 1406, 1382, 1358, 1334, 1311, 1288,
1264, 1241, 1218, 1195, 1172, 1150, 1127, 1105,
1083, 1060, 1039, 1017, 995, 974, 952, 931,
910, 889, 869, 848, 828, 808, 788, 768,
749, 729, 710, 691, 673, 654, 636, 618,
600, 582, 565, 548, 531, 514, 497, 481,
465, 449, 433, 418, 403, 388, 374, 359,
345, 331, 318, 304, 291, 279, 266, 254,
242, 230, 219, 208, 197, 186, 176, 166,
156, 146, 137, 128, 120, 111, 103, 96,
88, 81, 74, 68, 61, 55, 50, 44,
39, 35, 30, 26, 22, 19, 15, 12,
10, 8, 6, 4, 2, 1, 1, 0,
0, 0, 1, 1, 2, 4, 6, 8,
10, 12, 15, 19, 22, 26, 30, 35,
39, 44, 50, 55, 61, 68, 74, 81,
88, 96, 103, 111, 120, 128, 137, 146,
156, 166, 176, 186, 197, 208, 219, 230,
242, 254, 266, 279, 291, 304, 318, 331,
345, 359, 374, 388, 403, 418, 433, 449,
465, 481, 497, 514, 531, 548, 565, 582,
600, 618, 636, 654, 673, 691, 710, 729,
749, 768, 788, 808, 828, 848, 869, 889,
910, 931, 952, 974, 995, 1017, 1039, 1060,
1083, 1105, 1127, 1150, 1172, 1195, 1218, 1241,
1264, 1288, 1311, 1334, 1358, 1382, 1406, 1429,
1453, 1478, 1502, 1526, 1550, 1575, 1599, 1624,
1648, 1673, 1698, 1723, 1747, 1772, 1797, 1822,
1847, 1872, 1897, 1922, 1948, 1973, 1998, 2023
};


void setup()
{
Wire.begin();

// Set A2 and A3 as Outputs to make them our GND and Vcc,
//which will power the MCP4725
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);

digitalWrite(A2, LOW);//Set A2 as GND
digitalWrite(A3, HIGH);//Set A3 as Vcc
}
//---------------------------------------------------
void loop()
{
Wire.beginTransmission(MCP4725_ADDR);
Wire.write(64); // cmd to update the DAC
Wire.write(sintab2[lookup] >> 4); // the 8 most significant bits...
Wire.write((sintab2[lookup] & 15) << 4); // the 4 least significant bits...
Wire.endTransmission();
lookup = (lookup + 1) & 511;
}

Definisi alamat MCP4725 ada di baris berikut ini:

#define MCP4725_ADDR 0x63

Versi lain software pembangkit sinusoidal dapat dilihat di https://github.com/adafruit/Adafruit_MCP4725/blob/master/examples/sinewave/sinewave.ino

Tegangan output sinusoidal dapat diukur di pin OUT pada MCP4725.

Berikut ini contoh output yang diukur dengan osiloskop.

Tegangan sinusoidal dari MCP4725 dan Arduino Nano
Tegangan sinusoidal dari MCP4725 dan Arduino Nano

Frekuensi gelombang sinusoidal adalah 4,5039 Hz . Jumlah sampel dalam 1 periode adalah 512. Periode sampling adalah 1/4,5039/512 = 0,434 milidetik. Frekuensi sampling adalah 2306 Hz.

Demikianlah cara sederhana membuat gelombang sinusoidal pada Arduino Nano dengan menggunakan DAC MCP4725. Namun demikian rangkaian ini masih mempunyai kelemahan:

  • Tegangan referensi DAC menggunakan tegangan 5V dari Arduino Nano yang kalau diukur tegangannya kurang dari 5 volt (sekitar 4,6 volt), dan ada ripple / noise di situ. Solusinya adalah menambahkan filter atau regulator supaya tegangan VCC untuk MCP4725 lebih stabil.
  • Tegangan keluaran masih terbatas dari 0 sampai 5 volt, sesuai tegangan VCC pada MCP4725. Jika perlu jangkauan tegangan lain maka perlu ditambah rangkaian penguat / pengubah level, yang mudahnya dapat dibuat dengan rangkaian op-amp
  • Belum ada filter rekonstruksi (reconstruction filter), untuk menghilangkan efek tangga pada tegangan output DAC. Sistem DAC yang lebih lengkap dapat dilihat di artikel https://elektrologi.iptek.web.id/sistem-filter-digital/

Referensi

Digital to Analog Converter MCP4725

Breakout board MCP4725 tampak atas
Breakout board MCP4725 tampak bawah

MCP4725 adalah Digital to Analog Converter 12 bit dengan antarmuka digital dengan protokol I2C. Komponen ini sangat bermanfaat jika kita ingin menambahkan kemampuan output analog pada suatu sistem mikroprosesor/mikrokontroler yang belum memiliki kemampuan DAC di dalamnya. Mikrokontroler tanpa DAC misalnya adalah Arduino Nano (ATMega328) dan STM32F103C8T (Blue Pill).

Modul MCP4725 yang banyak nampaknya adalah hasil kloning dari modul MCP4725 buatan Sparkfun, mengingat penampilannya sangat mirip.

Modul MCP4725 buatan Sparkfun
Skema modul MCP4725 versi Sparkfun

Pada modul MCP4725 tersebut ada jumper yang dapat dikonfigurasi:

  • SJ1 untuk mengaktifkan atau menonaktifkan pull up resistor I2C berukuran 4k7. Defaultnya adalah pull up resistor terhubung. Jika ingin diganti/ditiadakan, maka jalur pada PCB mesti dipotong dengan cutter.
  • SJ2 untuk memilih alamat I2C dari modul MCP4725 pada pin 0. Defaultnya adalah terhubung ke GND , sehingga alamat pada I2C adalah 1100000 (4 bit ‘1100’ adalah 4 bit device code, 2 bit berikutnya ’00’ adalah A2 dan A1, 0 terakhir sesuai dengan input A0)

Percobaan MCP4725 Dengan Arduino Nano

Tahap pertama, aktifkan library MCP4725 dari Adafruit. Penjelasan library ini terdapat di https://github.com/adafruit/Adafruit_MCP4725

Referensi

dfd


Komponen Pendukung Sistem Mikroprosesor

 

Saat ini mikroprosesor sudah tersedia dalam bentuk mikrokontroler seperti ATmega328 yang sudah mengintegrasikan CPU, memori dan periferal input output di dalamnya. Akibatnya untuk membuat suatu sistem mikroprosesor tidak lagi diperlukan banyak komponen pendukung lain. Mikrokontroler ini masih memerlukan kristal, power supply dan beberapa komponen lain.

Selain itu juga banyak yang sudah tersedia dalam bentuk modul, seperti Arduino UNO, Arduino Nano, Blue Pill dan sebagainya. Pada modul seperti ini, kita dapat menjalankan sistem mikroprosesor tersebut cukup hanya dengan menambahkan catu daya USB saja.

Namun demikian, kadang-kadang fasilitas yang disediakan oleh mikrokontroler ataupun modul tersebut masih kurang, sehingga masih diperlukan tambahan komponen pendukung. Berikut ini beberapa komponen pendukung yang sering dipakai.

Mikroprosesor / CPU

Komponen utama suatu sistem mikroprosesor adalah sebuah  CPU (Central Processing Unit). CPU ini belum dilengkapi dengan memori, sehingga untuk dapat dijalankan sebagai sistem minimum, CPU ini masih perlu ditambah memori RAM dan EEPROM. Berikut ini keluarga CPU yang (dulu) populer di Indonesia:

  • Keluarga Z80 buatan Zilog
  • Keluarga 6800 buatan Motorola
Zilog Z0840004PSC
Zilog Z0840004PSC

Pada saat ini penggunaan CPU sudah jarang, biasanya kita menggunakan mikrokontroler yang lebih praktis.

Berikut ini contoh rangkaian mikroprosesor berbasis CPU tipe 6802, dari keluarga 6800 buatan Motorola. (https://www.sbprojects.net/projects/nano6802/index.php)

Sistem minimum 6802
Sistem minimum 6802

Pada rangkaian tersebut, komponen utamanya adalah sebagai berikut:

  • 6802 sebagai CPU
  • 2732A sebagai EPROM
  • 6821 sebagai antar muka digital

Pada rangkaian tersebut tidak ada SRAM, karena di dalam 6802 sudah ada RAM sebanyak 128 byte.

Sumber Clock

Mikroprosesor yang kita pakai sekarang umumnya termasuk ke dalam sistem digital sinkron sekuensial, sehingga suatu mikroprosesor memerlukan clock. Sumber clock yang umum digunakan adalah osilator internal menggunakan resistor dan kapasitor, serta bisa juga menggunakan kristal. Rangkaian osilator dengan resistor dan kapasitor sangat sederhana, namun kurang teliti. Kristal menghasilkan clock yang lebih teliti. Jika diperlukan ketelitian waktu yang lebih tinggi, dapat dilihat di artikel “Sumber Clock pada Rangkaian Elektronik

Kristal 12 MHz dan resonator 18.083 MHz

RAM

RAM (Random Access Memori) fungsinya sebagai memori yang dapat dibaca dan ditulis oleh mikroprosesor.

Salah satu jenis static RAM yang populer dipakai adalah tipe 6264. RAM ini berkapasitas 8 kilobyte (8192 byte).

Static Random Access Memori 6264
Static Random Access Memori 6264

Mikrokontroler versi terbaru umumnya sudah dilengkapi RAM di dalamnya, sehingga kita tidak perlu menambahkan RAM lagi.

Selain static RAM (SRAM), ada juga dynamic RAM (DRAM). DRAM lebih murah dibandingkan SRAM, namun rangkaiannya lebih kompleks. DRAM populer digunakan pada mikroprosesor yang memerlukan RAM besar.

Lebih jauh tentang RAM dan memori sejenisnya dapat dilihat di artikel “Memori pada Sistem Mikroprosesor

EPROM

EPROM atau Erasable Programmable Read Only Memory, adalah memori yang dapat diprogram dengan menggunakan perangkat programmer, dan dapat dihapus dengan menggunakan cahaya ultraviolet.

EPROM yang populer digunakan adalah tipe 27C64. EPROM ini berkapasitas 8 kilobyte (8192 byte)

EPROM 27C64
EPROM 27C64

Input Output Digital Mikroprosesor

Untuk antar muka digital dari bus di dalam sistem mikroprosesor ke luar, diperlukan komponen antar muka digital. Komponen yang populer dipakai adalah IC PPI (Programmable Peripheral Interface) tipe 8255 buatan Intel dan 6821 dari Motorola.

Berikut ini PPI 8255 yang sering dipakai bersama mikroprosesor keluaran Intel, seperti 8088 dan 8086

Intel PPI 8255
Intel PPI 8255

Berikut ini IC Peripheral Interface Adapter (PIA) model MC6820 dan MC6821. Keduanya sering dipakai bersama mikroprosesor keluaran Motorola, seperti 6802 dan 6805.

Motorola MC6820 dan MC6821
Motorola MC6820 dan MC6821

Fungsi input output digital dari bus mikroprosesor juga dapat dilakukan dengan komponen IC digital berikut ini

  • 74HC373 latch 8 bit
  • 74HC573 latch 8 bit

Referensi:

Bus Mikroprosesor

Pada mikroprosesor model lama seperti Z80 dan Motorola 6800, masih diperlukan komponen register pada bus mikroprosesor. Pada mikrokontroler model baru seperti ATmega328 dan ESP32, bus mikroprosesor sudah built-in, jadi tidak perlu diutak atik lagi oleh pendesain sistem.

Komponen yang dipakai pada bus antara lain sebagai berikut:

  • 74HC138 Multiplexer, sebagai address decoder
  • 74HC245 buffer 2 arah 8 bit, sebagai input output digital , ataupun bus driver
  • 74HC573 latch 8 bit, sebagai bus multiplexer

Input Digital

Mikrokontroler zaman sekarang sudah memiliki input output digital built-in, sehingga tidak memerlukan tambahan PPI atau PIA. Namun kadang perlu komponen tambahan untuk menambah jumlah port, ataupun untuk konversi tegangan.

Berikut ini beberapa komponen yang umum dipakai pada sistem mikroprosesor untuk menambah kemampuan input digital:

  • 74HC164 serial input parallel output shift register tanpa output latch, dipakai untuk menambah jumlah port output
  • 74HC165 parallel input serial output shift register, dipakai untuk menambah jumlah port input
  • PCF8574 untuk menambah jumlah port input output , antar muka ke mikrokontroler menggunakan protokol I2C
  • Level Converter jika tegangan input dari sensor/transduser tidak sama dengan tegangan input mikrokontroler. Detail dibahas di artikel “Teknik Input Digital“. Salah satu cara yang praktis dengan menggunakan bidirectional logic level converter.

Output Digital

Berikut ini beberapa komponen yang umum dipakai pada sistem mikroprosesor untuk menambah output digital:

  • 74HC595 serial input parallel output shift register dengan output latch, dipakai untuk menambah jumlah port output
  • PCF8574 untuk menambah jumlah port input output , antar muka ke mikrokontroler menggunakan protokol I2C

Output digital dari mikrokontroler juga kadang-kadang perlu diperkuat arusnya, ataupun diubah tegangannya. Berikut ini beberapa komponen yang sering dipakai:

  • ULN2803 Darlington driver, untuk memperkuat arus dari port mikroprosesor, dapat menangani arus sampai 500 mA
  • Digital Level Converter jika tegangan output mikrokontroler tidak sama dengan tegangan perangkat yang dikendalikan.  Salah satu cara yang praktis dengan menggunakan modul bidirectional logic level converter.
  • Transistor NPN, PNP, MOSFET kanal N, kanal P sebagai penguat arus. Dibahas detail di artikel “Teknik Output Digital
3.3V 5V Bi Directional Level Converter
3.3V 5V Bi Directional Level Converter

Referensi

  • https://www.ti.com/product/PCF8574

Penguat Output  Dengan H-Bridge

H-Bridge adalah rangkaian output khusus untuk menggerakkan motor DC dengan 2 arah. Pada umumnya komponen utamanya adalah 4 buah transistor BJT/MOSFET yang dapat dikonfigurasikan sehingga polaritas output dapat dibalik.

Contoh komponen H-Bridge:

Motor driver TB6612FNG
Motor driver TB6612FNG

Input Analog

Untuk input analog diperlukan ADC (Analog to Digital Converter). Pada mikrokontroler seperti ATmega328 sudah dilengkapi ADC. Jika ADC ini tidak cukup , atau mikrokontroler tidak ada ADC, maka kita perlu menambah ADC eksternal.

Contoh ADC yang mudah dipakai untuk mikrokontroler:

  • MCP3008: 8 kanal 10 bit, antar muka SPI
  • ADS1115: 4 kanal 16 bit, antar muka I2C
  • HX711: 2 kanal 24 bit, antar muka serial digital. Umumnya dipakai untuk timbangan digital.
  • AD7705
  • MAX174
  • ADS1256
  • ADC0804
  • PCF8591
  • ADS1232

ADC dibahas secara lebih detail di artikel “ADC untuk Arduino

MCP3008

Output Analog

Untuk output analog diperlukan DAC (Digital to Analog to Converter). Mikrokontroler seperti ESP32 sudah dilengkapi DAC 8 bit, namun umumnya mikrokontroler tidak dilengkapi DAC.

Contoh DAC yang sering dipakai:

MCP4725
MCP4725

Komunikasi Digital

Komunikasi digital ke periferal sering menggunakan protokol I2C ataupun SPI. Namun jika level tegangan dengan periferal berbeda, maka perlu tambahan komponen bidirectional logic converter.

Mikrokontroler umumnya memiliki port komunikasi serial asinkron dengan level tegangan 3,3 volt ataupun 5 volt, sesuai dengan tegangan kerja mikrokontroler tersebut. Supaya dapat dihubungkan dengan perangkat lain yang menggunakan level tegangan RS232, perlu ada konverter TTL ke RS232, seperti MAX232

Jika komunikasi menggunakan RS-485, maka perlu mengubah level tegangan TTL menjadi RS-485 dengan komponen seperti MAX485.

Jika ingin menghubungkan port komunikasi asinkron dengan port USB di komputer, maka perlu menggunakan modul USB to Serial. Modul USB to serial yang populer adalah yang berbasis chipset FTDI dan chipset CH340

Modul USB to Serial TTL CH340
Modul USB to Serial TTL CH340

Regulator DC

Jika tegangan dari power supply/baterai tidak sama dengan tegangan kerja mikrokontroler, maka perlu ditambahkan regulator yang sesuai.

Regulator yang umum dipakai adalah dari tipe linear dan tipe switching.

Contoh regulator linear yang umum:

  • LM7805
  • LM317
Regulator LM7805
Regulator LM7805

Contol regulator step down DC to DC converter adalah LM2596. IC ini sudah tersedia dalam bentuk modul, sehingga tidak perlu dirakit lagi dari komponen diskrit.

DC to DC Converter step down LM2596
DC to DC Converter step down LM2596

Jika diinginkan konversi energi yang lebih efisien, lebih baik menggunakan DC to DC converter. Saat ini sudah banyak dijual berbagai macam modul DC to DC converter.

Contoh komponen DC to DC konverter dibahas di artikel “Cara menurunkan tegangan aki 12 volt ke 6 volt

Power Supply

Power supply / adaptor diperlukan untuk mengubah tegangan jala-jala listrik 220 volt menjadi tegangan rendah yang dapat dipakai untuk mikroprosesor. Umumnya mikroproser memerlukan tegangan 5 volt DC, namun kadang ada juga perangkat seperti motor DC yang memerlukan tegangan 12 volt DC.

Jika memerlukan beberapa tegangan, dapat dipakai beberapa power supply, atau 1 power supply ditambah dengan regulator untuk mengubah tegangan output ke tegangan lain yang diinginkan. Misal jika diperlukan tegangan 12 volt dan 5 volt, bisa saja dipakai 1 power supply dengan output 12 volt DC dan ditambah regulator DC to DC converter step down 12 volt ke 5 volt DC.

Power Supply 12 volt 5 ampere
Power Supply 12 volt 5 ampere

Power supply yang hemat energi adalah dari tipe switching power supply, misal power supply 12 volt berikut ini.

Perbandingan power supply omron 12 volt
Beberapa macam power supply 12 volt

Baterai

Jika perangkat dirancang untuk mobile atau tidak ada akses ke jala-jala listrik, maka perlu sumber daya internal berupa baterai. Alternatif lain menggunakan sel surya plus baterai.

Baterai 18650 4200 mWh
Baterai 18650 4200 mWh

Tegangan baterai jarang yang sesuai dengan tegangan kerja mikroprosesor. Tegangan baterai juga berubah (menurun) tergantung kapasitas baterai yang terpakai. Untuk menjaga tegangan supply yang konstan, biasanya output dari baterai ini perlu disambungkan ke regulator  atau DC to DC converter.

Komponen lain yang diperlukan namun belum dibahas di artikel ini:

Referensi