Filter Analog yang dapat diprogram

Saya sedang mencari-cari ide rangkaian untuk membuat filter analog yang frekuensi cut-off nya dapat diprogram secara digital. Tujuannya jangka pendek adalah untuk filter anti aliasing dan reconstruction filter untuk suatu pengolahan sinyal digital.

Beberapa artikel berisi ide yang sudah didapat:

    Ide rangkaian dari “Application Note 269 Circuit Applications of Multiplying CMOS D to A Converters”

    Ide rangkaian dari Application Note: “Application Ideas for Multiplying DAC’s Digital Controlled Gain is Useful in Filter Circuits”

    Ide dari “”A Digitally Controllable Lowpass Filter Using a Digital Potentiometer”

     

    Ide dari Microchip: AN737 Using Digital Potentiometers to Design Low Pass Adjustable Filters.

    Rangkaian ini berisi 2 buah potensiometer digital (MCP42100) , opamp MCP601 (single supply, rail to rail). Konfigurasi filter yang dipakai adalah Sallen-key orde 2, low-pass filter.

    Referensi

    Analisis Rangkaian LED

    Berikut ini ada 2 skema rangkaian untuk menyalakan LED dengan baterai 10 volt.

    Permasalahan: mana yang menyala lebih terang.

    Jawaban:

    Kecerahan LED tergantung pada arus yang mengalir pada LED tersebut. Makin besar arusnya, makan makin terang LED tersebut.

    Rangkaian kita tandai dulu dengan arus dan tegangan yang akan dihitung.

    Analisis Rangkaian 1

    Pertama kita cek dulu apakah LED menyala atau tidak.

    Kita asumsikan LED merah dengan tegangan maju 2 volt, sehingga LED tersebut perlu tegangan sekurang-kurangnya 2 volt untuk dapat menyala.

    Jika LED kita anggap tidak ada, maka R1 dan R2 menjadi pembagi tegangan, dengan

    Vd= 6/(4+6) x 10 volt = 6 volt.

    Tegangan Vd lebih dari 6 volt, sehingga tegangan di Vd cukup untuk menyalakan LED.

    Karena LED menyala, maka tegangan pada titik Vd adalah sama dengan tegangan maju LED, yaitu 2 volt

    Selanjutnya dihitung arus i1 yang mengalir pada R1. Untuk ini perlu menggunakan KVL (Kirchoff Voltage Law)

    VB1 = VR1 + VD1

    10 volt = i1 x 400 + 2 volt

    i1 = (10 – 2)/400= 0,02 ampere

    i3 dihitung dengan hukum ohm:

    V = I x R

    i3 = Vd / R2 = 2 / 600 = 0,00333 ampere

    i2 dihitung dengan KCL (Kirchoff Current Law)

    i1 = i2 + i3

    i2 = i1 – i3 = 0,02 – 0,00333 = 0,01677 ampere

    Analisis Rangkaian 2

    Vd = tegangan maju LED = 2 volt

    Dari KVL:

    – VB1 + VR3 + VR4 + VD2 = 0

    – 10 + i4 x R3 + i4 x R4 + 2 =0

    i4 (R3+R4)= 10 -2

    i4=8 / (400+600) = 0,008 ampere

    i2 lebih besar dari i4, jadi kesimpulannya LED di rangkaian 1 menyala lebih terang.

    Sumber diskusi: https://www.facebook.com/groups/928410417191779

     

     

    Cara Kerja Rangkaian Penggerak Relay Dengan Transistor NPN

    Pada tulisan ini diuraikan cara kerja rangkaian penggerak relay dengan transistor NPN.

    Contoh rangkaian penggerak relay dengan transistor NPN adalah sebagai berikut:

     

    Penguat output untuk beban induktif
    Rangkaian penggerak relay dengan transistor NPN

    Komponen utama rangkaian adalah transistor NPN tipe BC337

    Input rangkaian adalah terminal dengan tanda OUT, yang merupakan output dari mikroprosesor seperti Arduino. Tegangan input rangkaian ini diasumsikan 0 volt (untuk logika LOW) dan 5 volt ( untuk logika HIGH)

    Tegangan supply relay diasumsikan 5 volt DC.

    Tipe relay diasumsikan adalah JQC-3F

    Emitter pada transistor terhubung ke GND

    Cara Kerja Rangkaian

    Jika pin OUT berada pada tegangan rendah (LOW) atau 0 volt, maka transistor akan berada pada keadaan OFF, jadi tidak ada arus mengalir antara kolektor (C) dan emiter (E). Dengan demikian maka kumparan relay tidak mendapat arus. Maka kontak pada relay akan berada pada kondisi normalnya.

    Jka pin OUT berapa pada tegangan tinggi (HIGH) atau 5 volt, maka transistor akan berada pada keadaan ON/saturasi. Transistor bertindak sebagai sakelar yang sedang ON. Pin kolektor dan emitter dapat dianggap terhubung dengan resistansi yang sangat rendah. Arus akan mengalir dari supply 5V, melalui kumparan relay, kemudian masuk ke terminal kolektor (C) pada transistor, dan keluar di terminal emitter (E) pada transistor, kemudian masuk ke GND.

    Fungsi dioda 1N4007 adalah untuk pada waktu transistor dimatikan. Pada waktu transistor dimatikan, masih ada energi yang tersimpan sebagai medan magnet di dalam kumparan relay. Energi ini berusaha mempertahankan arus pada kumparan. Jika tidak ada dioda, maka arus ini akan memaksa untuk mengalir melalui transistor, sehingga dapat merusak transistor. Dengan adanya dioda, arus ini akan mengalir melalui dioda, sehingga energi yang tersimpan pada kumparan relay dapat dibuang pada dioda tersebut.

    Perhitungan Arus dan Tegangan

    Pada waktu pin OUT pada tegangan rendah, maka praktis tidak ada arus mengalir pada transistor. Sebenarnya ada, namun kecil sekali sehingga dapat diabaikan.

    Pada waktu pin OUT pada tegangan tinggi (5 volt), maka akan ada arus mengalir melalui basis transistor. Tegangan antara basis dan emiter transistor antara 0,6 volt sampai dengan 1,2 volt, tergantung tegangan antara terminal C dan E.

    Arus pada relay diasumsikan sekitar 70 mA

    Tegangan Vbe pada kondisi itu dapat dilihat pada gambar berikut ini. Ambil kurva Vbe(sat)

    Tegangan Vbe dapat diasumsikan sekitar 0,8 volt.

    Persamaan arus basis:

    VOUT = ib x 2,2k + Vbe

    ib = (VOUT –  Vbe) / 2,2k = (5-0.8)/2.2k = 0.002 ampere = 2 mA

    Penguatan arus transistro BC337 sekitar 100 sampai 630. Untuk aplikasi ini dianggap penguatan arus = 100

    Arus pada kolektor (Ic) adalah:

    Ic=Ib x hfe = 2 mA x 100 = 200 mA

    Besar arus pada Ic maksimum adalah 200 mA , namun bisa kurang dari 200 mA jika transistor dalam keadaan saturasi. Untuk itu mesti melihat perilaku kumparan relay.

    Tegangan Vce saturasi dapat dilihat pada grafik berikut ini:

    BC337-saturasi

    Tegangan Vce saturasi adalah sekitar 0,2 volt

    Tegangan nominal relay adalah 5 volt . Daya pada kumparan relay adalah 0.36 watt. Maka resistansi kumparan relay adalah:

    P = V2/R

    R=V2/P = 5 x 5 / 0.36 = 69.44 ohm

    Perhitungan arus Ic:

    VCC = IC x Rrelay + 0,2 volt

    IC = (VCC – 0.2) / Rrelay = (5 – 0.2) / 69.44 = 0.069 ampere = 69 mili ampere

    Menurut perhitungan transistor, arus Ic max adalah 200 mA. Menurut perhitungan relay, arus Ic adalah 69 mA. Maka arus pada relay adalah 69 mA.

    Referensi

    Perangkat Keras Untuk Pengolahan Sinyal Digital Berbasis Mikroprosesor

    Pengolahan sinyal digital dapat diimplementasikan dengan mikroprosesor. Berikut ini blok diagram pengolahan sinyal digital minimalis:

    Komponen Sistem

    • Pengkondisi sinyal
    • Anti aliasing filter
    • ADC (Analog to Digital Converter)
    • Mikroprosesor
    • DAC (Digital to Analog Converter)
    • Filter rekonstruksi (reconstruction filter)
    • Catu daya untuk rangkaian analog
    • Catu daya untuk rangkaian digital

    Cara kerja sistem

    sinyal analog masuk ke pengkondisi sinyal.

    • Pengkondisi sinyal memperkuat atau memperlemah sinyal agar tegangannya sesuai dengan tegangan masukan Anti Aliasing Filter (AAF). AAF biasanya penguatannya 1, sehingga tegangan ini sesuai juga dengan tegangan masukan pada ADC (Analog to Digital Converter). Pengkondisi sinyal juga dapat menambah atau mengurangi tegangan sesuai keperluan.
    • Anti aliasing filter (AAF) menghillangkan sinyal frekuensi tinggi untuk mencegah terjadinya aliasing pada proses sampling
    • ADC (Analog to Digital Converter) mengubah tegangan analog menjadi angka digital dengan jumlah bit tertentu.
    • Mikroprosesor mengendalikan ADC dan DAC. Data dari ADC diterima oleh mikroprosesor. Proses pengolahan sinyal digital dilakukan di mikroprosesor. Proses perhitungan sinyal mesti dilakukan dengan kecepatan pencuplikan (sampling) tertentu, tidak terlalu cepat dan juga tidak terlalu lambat. Untuk membuat frekuensi pencuplikan yang konstan, umumnya dapat menggunakan interupsi timer pada mikroprosesor, atau dapat juga menggunakan Real Time Operating System (RTOS).
    • Mikroprosesor mengirimkan sinyal dalam bentuk angka digital ke DAC.
    • DAC (Digital to Analog Converter) mengubah sinyal digital menjadi sinyal analog. Sinyal ini masih berbentuk anak tangga.
    • Filter rekonstruksi (reconstruction Filter) mengubah sinyal analog yang berbentuk anak tangga dari DAC menjadi sinyal analog yang lebih mulus. Proses pengubahan digital ke analog mempunyai efek samping mengubah respon frekuensi sinyal. Ada sinyal frekuensi tertentu yang diperlemah, ada frekuensi tertentu yang diperkuat. Untuk mengembalikan respon frekuensi ini menjadi datar, maka diperlukan filter rekonstruksi dengan respon frekuensi tertentu. Filter rekonstruksi ini bertindak sebagai equalizer.
    • Output analog diambil dari output filter rekonstruksi
    • Catu daya (power supply) bertugas menyediakan daya dengan tegangan konstan sesuai keperluan.  Umumnya dipisahkan antara catu daya rangkaian analog dan rangkaian digital, supaya noise dari rangkaian digital tidak mengganggu rangkaian analog.

    Artikel Terkait

     

     

     

    Mengukur kadar Karbondioksida Dengan Sensor CJMCU-8118

    Kode

     

    // https://github.com/adafruit/Adafruit_CCS811/blob/master/examples/CCS811_test/CCS811_test.ino
    // https://github.com/closedcube/ClosedCube_HDC1080_Arduino
    // https://github.com/closedcube/ClosedCube_HDC1080_Arduino/blob/master/examples/hdc1080measurement/hdc1080measurement.ino
    
    #define I2C_SDA 15
    #define I2C_SCL 13
    #define LED_ONBOARD 22
    
    #include "Adafruit_CCS811.h"
    #include <Arduino.h>
    #include <Wire.h>
    #include "ClosedCube_HDC1080.h"
    
    Adafruit_CCS811 ccs;
    ClosedCube_HDC1080 hdc1080;
    
    void setup() {
      pinMode(LED_ONBOARD, OUTPUT);
      // put your setup code here, to run once:
      Serial.begin(9600);
      delay(1000);
    
      //wait for serial connection to open (only necessary on some boards)
      while (!Serial);
    
      Wire.begin(I2C_SDA, I2C_SCL);
    
      I2C_Scan() ; // just for verifying
    
      // check CCS811
      Serial.println("CCS811 test");
      if (!ccs.begin()) {
        Serial.println("Failed to start sensor! Please check your wiring.");
        while (1);
      } else {
        Serial.println("CCS811 ready");
      }
    
    
      hdc1080.begin(0x40);
      Serial.println("HDC1080");
      Serial.print("Manufacturer ID=0x");
      Serial.println(hdc1080.readManufacturerId(), HEX); // 0x5449 ID of Texas Instruments
      Serial.print("Device ID=0x");
      Serial.println(hdc1080.readDeviceId(), HEX); // 0x1050 ID of the device
    
      hdc1080.setResolution(HDC1080_RESOLUTION_11BIT, HDC1080_RESOLUTION_11BIT);
    
    }
    
    void loop() {
      float temperature = 25;
      float pressure = 0;
      float humidity = 60; // default humidity
      float co2 = 0;
      float tvoc = 0;
    
    
    
      temperature = hdc1080.readTemperature();
      humidity = hdc1080.readHumidity();
    
      ccs.setEnvironmentalData( humidity, temperature );
    
      if (ccs.available()) {
        if (!ccs.readData()) {
          //      Serial.print("CO2: ");
          //Serial.print(ccs.geteCO2());
          //Serial.print("ppm, TVOC: ");
          //Serial.println(ccs.getTVOC());
          co2 = ccs.geteCO2();
          tvoc =   ccs.getTVOC();
        }
      }
    
      Serial.print("Temp\t");
      Serial.print(temperature);
      Serial.print("\t");
    
      Serial.print("Humidity\t");
      Serial.print(humidity);
      Serial.print("\t");
    
      Serial.print("CO2\t");
      Serial.print(co2);
      Serial.print("\t");
      Serial.print("TVOC\t");
      Serial.print(tvoc);
      Serial.println("");
      delay(500);
      digitalWrite(LED_ONBOARD, HIGH);
      delay(500);
      digitalWrite(LED_ONBOARD, LOW);
    }
    
    void I2C_Scan() {
      byte error, address;
    
      int nDevices;
      Serial.println("I2C Scanning...");
      nDevices = 0;
      for (address = 1; address < 127; 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.println(address, HEX);
          nDevices++;
        }
        else if (error == 4) {
          Serial.print("Unknow 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");
      }
    }

    Referensi

     

    Mengukur Kadar Karbondioksida Dengan Sensor CCS811 dan Mikrokontroler ESP32

    Pada percobaan ini dilakukan pengukuran kadar gas CO2  (karbon dioksida) di udara dengan sensor CCS811.

    Mikrokontroler yang digunakan adalah modul ESP32 Lolin32 Lite

    Modul CJMCU-811 tidak dilengkapi sensor temperatur & kelembaban, sehingga perlu tambahan sensor BME280.

    Kompensasi temperatur dan kelembaban untuk sensor CCS811 menggunakan sensor BME280

    Berikut ini foto perangkat keras yang digunakan

    Berikut ini rangkaian sistem mikroprosesornya

    Berikut ini source code program yang dipakai (dengan Arduino)

    // https://bitbucket.org/christandlg/bmx280mi/src/master/examples/BMx280_I2C/BMx280_I2C.ino
    // BMx280_I2C.ino
    //
    // shows how to use the BMP280 / BMx280 library with the sensor connected using I2C.
    //
    // Copyright (c) 2018 Gregor Christandl
    //
    // connect the AS3935 to the Arduino like this:
    //
    // Arduino - BMP280 / BME280
    // 3.3V ---- VCC
    // GND ----- GND
    // SDA ----- SDA
    // SCL ----- SCL
    // some BMP280/BME280 modules break out the CSB and SDO pins as well:
    // 5V ------ CSB (enables the I2C interface)
    // GND ----- SDO (I2C Address 0x76)
    // 5V ------ SDO (I2C Address 0x77)
    // other pins can be left unconnected.
    
    
    // https://github.com/adafruit/Adafruit_CCS811
    // https://github.com/adafruit/Adafruit_CCS811/blob/master/examples/CCS811_test/CCS811_test.ino
    
    
    #include "Adafruit_CCS811.h"
    Adafruit_CCS811 ccs;
    
    #include <Arduino.h>
    #include <Wire.h>
    
    #define I2C_SDA 15
    #define I2C_SCL 13
    
    
    #include <BMx280I2C.h>
    
    #define I2C_ADDRESS 0x76
    
    //create a BMx280I2C object using the I2C interface with I2C Address 0x76
    BMx280I2C bmx280(I2C_ADDRESS);
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      delay(1000);
    
      //wait for serial connection to open (only necessary on some boards)
      while (!Serial);
    
      //  Wire.begin();
      Wire.begin(I2C_SDA, I2C_SCL);
    
      I2C_Scan() ; // just for verifying
    
      // check CCS811
      Serial.println("CCS811 test");
      if (!ccs.begin()) {
        Serial.println("Failed to start sensor! Please check your wiring.");
        while (1);
      } else {
        Serial.println("CCS811 ready");
      }
    
      //begin() checks the Interface, reads the sensor ID (to differentiate between BMP280 and BME280)
      //and reads compensation parameters.
      if (!bmx280.begin())
      {
        Serial.println("begin() failed. check your BMx280 Interface and I2C Address.");
        while (1);
      }
    
      if (bmx280.isBME280())
        Serial.println("sensor is a BME280");
      else
        Serial.println("sensor is a BMP280");
    
      //reset sensor to default parameters.
      bmx280.resetToDefaults();
    
      //by default sensing is disabled and must be enabled by setting a non-zero
      //oversampling setting.
      //set an oversampling setting for pressure and temperature measurements.
      bmx280.writeOversamplingPressure(BMx280MI::OSRS_P_x16);
      bmx280.writeOversamplingTemperature(BMx280MI::OSRS_T_x16);
    
      //if sensor is a BME280, set an oversampling setting for humidity measurements.
      if (bmx280.isBME280())
        bmx280.writeOversamplingHumidity(BMx280MI::OSRS_H_x16);
    }
    
    void loop() {
      float temperature = 0;
      float pressure = 0;
      float humidity = 60; // default humidity
      float co2 = 0;
      float tvoc = 0;
    
      delay(1000);
    
      //start a measurement
      if (!bmx280.measure())
      {
        Serial.println("could not start measurement, is a measurement already running?");
        return;
      }
    
      //wait for the measurement to finish
      do
      {
        delay(100);
      } while (!bmx280.hasValue());
    
      //  Serial.print("Pressure: "); Serial.println(bmx280.getPressure());
      //  Serial.print("Pressure (64 bit): "); Serial.println(bmx280.getPressure64());
      //  Serial.print("Temperature: "); Serial.println(bmx280.getTemperature());
    
      pressure = bmx280.getPressure();
      temperature = bmx280.getTemperature();
    
      //important: measurement data is read from the sensor in function hasValue() only.
      //make sure to call get*() functions only after hasValue() has returned true.
      if (bmx280.isBME280())
      {
        //    Serial.print("Humidity: ");
        //    Serial.println(bmx280.getHumidity());
        humidity = bmx280.getHumidity();
      }
    
      ccs.setEnvironmentalData( humidity, temperature );
    
      if (ccs.available()) {
        if (!ccs.readData()) {
          //      Serial.print("CO2: ");
          //Serial.print(ccs.geteCO2());
          //Serial.print("ppm, TVOC: ");
          //Serial.println(ccs.getTVOC());
    
    
    
          co2 = ccs.geteCO2();
          tvoc =   ccs.getTVOC();
        }
      }
    
      Serial.print("Temp\t");
      Serial.print(temperature);
      Serial.print("\t");
    
      Serial.print("Humidity\t");
      Serial.print(humidity);
      Serial.print("\t");
    
      Serial.print("Pressure\t");
      Serial.print(pressure);
      Serial.print("\t");
    
      Serial.print("CO2\t");
      Serial.print(co2);
      Serial.print("\t");
      Serial.print("TVOC\t");
      Serial.print(tvoc);
      Serial.println("");
    }
    
    void I2C_Scan() {
      byte error, address;
    
      int nDevices;
      Serial.println("I2C Scanning...");
      nDevices = 0;
      for (address = 1; address < 127; 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.println(address, HEX);
          nDevices++;
        }
        else if (error == 4) {
          Serial.print("Unknow 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");
      }
    }
    

    Berikut ini software versi lain

    // pengukuran CO2, tanpa wifi
    
    // https://bitbucket.org/christandlg/bmx280mi/src/master/examples/BMx280_I2C/BMx280_I2C.ino
    // BMx280_I2C.ino
    //
    // shows how to use the BMP280 / BMx280 library with the sensor connected using I2C.
    //
    // Copyright (c) 2018 Gregor Christandl
    //
    // connect the AS3935 to the Arduino like this:
    //
    // Arduino - BMP280 / BME280
    // 3.3V ---- VCC
    // GND ----- GND
    // SDA ----- SDA
    // SCL ----- SCL
    // some BMP280/BME280 modules break out the CSB and SDO pins as well:
    // 5V ------ CSB (enables the I2C interface)
    // GND ----- SDO (I2C Address 0x76)
    // 5V ------ SDO (I2C Address 0x77)
    // other pins can be left unconnected.
    
    
    // https://github.com/adafruit/Adafruit_CCS811
    // https://github.com/adafruit/Adafruit_CCS811/blob/master/examples/CCS811_test/CCS811_test.ino
    
    
    #include "Adafruit_CCS811.h"
    Adafruit_CCS811 ccs;
    
    #include <Arduino.h>
    #include <Wire.h>
    #include <BMx280I2C.h>
    #include "ClosedCube_HDC1080.h"
    
    #define I2C_SDA 15
    #define I2C_SCL 13
    #define I2C_ADDRESS 0x76
    #define LED_ONBOARD 22
    
    const char *ssid     = "First";
    const char *password = "satu2345";
    
    //create a BMx280I2C object using the I2C interface with I2C Address 0x76
    BMx280I2C bmx280(I2C_ADDRESS);
    ClosedCube_HDC1080 hdc1080;
    
    char mac_str[20];
    byte mac_byte[6];
    
    void setup() {
      pinMode(LED_ONBOARD, OUTPUT);
      // put your setup code here, to run once:
      Serial.begin(9600);
      delay(1000);
    
      //wait for serial connection to open (only necessary on some boards)
      while (!Serial);
    
      //  Wire.begin();
      Wire.begin(I2C_SDA, I2C_SCL);
    
      I2C_Scan() ; // just for verifying
    
      // check CCS811
      Serial.println("CCS811 test");
      if (!ccs.begin()) {
        Serial.println("Failed to start sensor! Please check your wiring.");
        while (1);
      } else {
        Serial.println("CCS811 ready");
      }
      SetupBME280();
      SetupHDC1080();
    }
    
    void SetupBME280() {
      //begin() checks the Interface, reads the sensor ID (to differentiate between BMP280 and BME280)
      //and reads compensation parameters.
      if (!bmx280.begin())
      {
        Serial.println("begin() failed. check your BMx280 Interface and I2C Address.");
        while (1);
      }
    
      if (bmx280.isBME280())
        Serial.println("sensor is a BME280");
      else
        Serial.println("sensor is a BMP280");
    
      //reset sensor to default parameters.
      bmx280.resetToDefaults();
    
      //by default sensing is disabled and must be enabled by setting a non-zero
      //oversampling setting.
      //set an oversampling setting for pressure and temperature measurements.
      bmx280.writeOversamplingPressure(BMx280MI::OSRS_P_x16);
      bmx280.writeOversamplingTemperature(BMx280MI::OSRS_T_x16);
    
      //if sensor is a BME280, set an oversampling setting for humidity measurements.
      if (bmx280.isBME280())
        bmx280.writeOversamplingHumidity(BMx280MI::OSRS_H_x16);
    }
    
    void SetupHDC1080() {
    
      hdc1080.begin(0x40);
      Serial.println("HDC1080");
      Serial.print("Manufacturer ID=0x");
      Serial.println(hdc1080.readManufacturerId(), HEX); // 0x5449 ID of Texas Instruments
      Serial.print("Device ID=0x");
      Serial.println(hdc1080.readDeviceId(), HEX); // 0x1050 ID of the device
      hdc1080.setResolution(HDC1080_RESOLUTION_11BIT, HDC1080_RESOLUTION_11BIT);
    }
    
    void loop() {
      float temperature = 0;
      float pressure = 0;
      float humidity = 60; // default humidity
      float co2 = 0;
      float tvoc = 0;
    
      if (1) {
        //start a measurement
        if (!bmx280.measure())
        {
          Serial.println("could not start measurement, is a measurement already running?");
        }
        do
        {
          delay(100);
        } while (!bmx280.hasValue());
    
        pressure = bmx280.getPressure();
        temperature = bmx280.getTemperature();
        //important: measurement data is read from the sensor in function hasValue() only.
        //make sure to call get*() functions only after hasValue() has returned true.
        if (bmx280.isBME280())
        {
          humidity = bmx280.getHumidity();
        }
      }
      ccs.setEnvironmentalData( humidity, temperature ); // kompensasi humidity & temperature
    
      if (ccs.available()) {
        if (!ccs.readData()) {
          //      Serial.print("CO2: ");
          //Serial.print(ccs.geteCO2());
          //Serial.print("ppm, TVOC: ");
          //Serial.println(ccs.getTVOC());
          co2 = ccs.geteCO2();
          tvoc =   ccs.getTVOC();
        }
      }
    
      Serial.print("Temp\t");
      Serial.print(temperature);
      Serial.print("\t");
    
      Serial.print("Humidity\t");
      Serial.print(humidity);
      Serial.print("\t");
    
      Serial.print("Pressure\t");
      Serial.print(pressure);
      Serial.print("\t");
    
      Serial.print("CO2\t");
      Serial.print(co2);
      Serial.print("\t");
      Serial.print("TVOC\t");
      Serial.print(tvoc);
      Serial.println("");
    
      delay(500);
      digitalWrite(LED_ONBOARD, HIGH);
      delay(500);
      digitalWrite(LED_ONBOARD, LOW);
    }
    
    void I2C_Scan() {
      byte error, address;
    
      int nDevices;
      Serial.println("I2C Scanning...");
      nDevices = 0;
      for (address = 1; address < 127; 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.println(address, HEX);
          nDevices++;
        }
        else if (error == 4) {
          Serial.print("Unknow 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");
      }
    }

    Berikut ini contoh tampilan outputnya

    13:08:18.861 -> I2C Scanning...
    13:08:18.861 -> I2C device found at address 0x5A
    13:08:18.896 -> I2C device found at address 0x76
    13:08:18.931 -> done
    13:08:18.931 -> 
    13:08:18.931 -> CCS811 test
    13:08:19.101 -> CCS811 ready
    13:08:19.101 -> sensor is a BME280
    13:08:19.135 -> HDC1080
    13:08:19.135 -> Manufacturer ID=0xFFFF
    13:08:19.135 -> Device ID=0xFFFF
    13:08:19.239 -> Temp	30.83	Humidity	50.10	Pressure	87156.00	CO2	0.00	TVOC	0.00
    13:08:20.368 -> Temp	30.83	Humidity	50.29	Pressure	91715.00	CO2	0.00	TVOC	0.00
    13:08:21.464 -> Temp	30.84	Humidity	50.37	Pressure	91714.00	CO2	0.00	TVOC	0.00
    

     

    Referensi

     

    Penguat Daya untuk Motor DC Analog Dengan TDA2050

    Berikut ini ide penguat daya untuk menggerakkan motor DC dengan sinyal analog

    TDA2050 dikonfigurasikan sebagai buffer op amp. Tegangan input akan sama dengan tegangan output, hanya arusnya saja yang diperkuat.

    TDA2050 ini normalnya dipakai untuk penguat audio. Namun bandwidthnya cukup untuk motor, motor DC perlu sinyal frekuensi 0 Hz (DC) sampai beberapa puluh Hz saja.

    TDA2050 akan menjadi panas, sehingga perlu dipasang di heatsink.

    Referensi

    TDA2050 Sebagai Driver PWM untuk Motor DC

    Berikut ini ide rangkaian driver motor DC  dengan menggunakan IC TDA2050

    TDA2050 sejatinya adalah penguat kelas AB untuk aplikasi audio. Komponen yang lebih tepat untuk driver motor DC misalnya adalah L293, DRV8833 dan TB6612FNG.

    Cara kerja

    Tegangan PWM dari mikroprosesor. HIGH = 5 volt, LOW = 0 volt.

    Tegangan 2,5 volt fungsinya sebagai referensi setengah tegangan Vcc digital. Jika menggunakan PWM dengan tegangan 3 volt, maka tegangan 2,5 volt perlu diganti dengan 1,5 volt.

    Jika tegangan PWM = 5 volt, maka tegangan ini akan dibandingkan oleh TDA2050 dengan input inverting (2,5 volt). Output akan saturasi mendekati V+, yaitu 5 volt.

    Jika tegangan PWM = 0 volt, maka tegangan ini akan dibandingkan oleh TDA2050 dengan input inverting (2,5 volt). Output akan saturasi mendekati V-, yaitu -5 volt.

    Dioda 1N5401 fungsinya melindungi TDA2050 dari arus balik motor. Motor menggunakan arus 3 ampere, sehingga perlu menggunakan 1N5401 yang punya rating arus 3 ampere. 1N4001 memiliki rating arus kontiyu 1 ampere. 1N4001 mungkin bisa dipakai juga, asal arus balik tidak terlalu lama. Kalau mau aman, langsung saja pakai 1N5401. Jika tidak ada 1N5401 bisa diganti dengan yang rating arusnya mirip, seperti 1N5402 sampai 1N5408.

    Perhatian

    TDA2050 dirancang untuk penguat audio amplifier, bukan untuk motor driver. Beberapa kelemahan yang akan terjadi pada rangkaian ini:

    • efisiensi rendah
    • kecepatan switching lambat dibandingkan motor driver betulan, seperti DRV8833 dan TB6612FNG

    Referensi

     

    Pengaruh Ampere Terlalu Besar pada Amplifier

    Pengaruh ampere terlalu besar pada amplifier tidak akan merusak amplifiernya, hanya jadinya power supply lebih besar, lebih mahal daripada yang diperlukan.

    Audio amplifier 100 watt stereo
    Audio amplifier 100 watt stereo

    Sumber gambar:  By Justin Davis – originally posted to Flickr as McIntosh MC2505, CC BY-SA 2.0, https://commons.wikimedia.org/w/index.php?curid=11571968

    Suatu penguat audio memerlukan sumber daya dengan tegangan dan arus tertentu.

    Tegangan yang diberikan oleh power supply harus tepat dengan yang diperlukan. Pada umumnya amplifier memiliki batas toleransi tegangan input tertentu, jadi tegangan supply tidak terlalu eksak. Power supply yang dipakai juga biasanya akan turun sedikit tegangannya ketika dibebani oleh amplifier.

    Arus yang diberikan oleh power supply harus sesuai dengan batas minimum. Kemampuan arus power supply harus sesuai dengan kebutuhan amplifier.  Jika arus kurang, maka suara akan cacat / mengalami distorsi. Biasanya jika arus kurang, hal ini tidak sampai merusak amplifier. Jika kemampuan arus power supply melebihi keperluan, hal ini tidak mengganggu amplifier. Hanya saja biasanya power supply dengan arus besar lebih berat dan lebih mahal daripada power supply dengan arus kecil.

    Audio amplifier 100 watt stereo

    Power supply untuk amplifier
    Power supply untuk amplifier

    Sumber gambar: https://id.aliexpress.com/item/32831354120.html

    Ringkasan

    • Pengaruh ampere power supply/adaptor/trafo terlalu besar pada amplifier:  tidak ada masalah. Power supply hanya akan memberikan arus sesuai keperluan pada amplifier sehingga tidak akan merusak amplifier.
    • Pengaruh ampere power supply/adaptor/trafo terlalu kecil pada amplifier: output amplifier tidak bisa terlalu besar. Kalau dipaksakan untuk output dengan volume besar, maka amplifier tidak kuat, sehingga sinyalnya akan cacat/ kecil suaranya.
    • Pengaruh voltase /tegangan power supply/adaptor/trafo terlalu besar pada amplifier: ada potensi merusak amplifier. Komponen pada amplifier memiliki batas tegangan tertentu yang tidak boleh dilampaui.
    • Pengaruh voltase / tegangan power supply/adaptor/trafo terlalu kecil pada amplifier: tidak akan merusak amplifier, namun output amplifier akan kecil. Suara tidak keras, ataupun akan ada distorsi / cacat pada suaranya.

    Referensi

    • https://en.wikipedia.org/wiki/Audio_power_amplifier
    • https://id.wikipedia.org/wiki/Penguat

    Rangkaian Pengkondisi Sinyal Untuk ADC

    Sinyal dari sensor dapat memiliki rentang tegangan besar, rentangan tegangan kecil ataupun tegangan negatif dan positif. ADC pada mikroprosesor umumnya hanya dapat menerima input tegangan positif dengan rentang tegangan terbatas. Untuk itu sinyal dari sensor perlu diperkuat/diperlemah, dan digeser supaya tepat dengan rentang tegangan ADC.

    Skema Rangkaian

    Berikut ini contoh rangkaian untuk melakukan pengkondisian sinyal tersebut.

    Rangkaian Pengkondisi Sinyal ADC dengan 3 buah op-amp
    Rangkaian Pengkondisi Sinyal ADC

    Dasar Teori

    Rangkaian ini terdiri dari 3 bagian:

    • inverting amplifier
    • buffer amplifier
    • summing amplifier

    Inverting amplifier

    Komponen IC1 berfungsi sebagai inverting amplifier. Menguatkan input dan membalik polaritasnya.

    Berikut ini bentuk dasar rangkaian inverting Inverting amplifier

     

    Buffer amplifier

    Detail dan rumus-rumus terkait dapat dipelajar di Inverting Amplifier

    Buffer amplifier

    Komponen IC2 berfungsi sebagai buffer

    Summing amplifier

    Detail dan rumus-rumus buffer amplifier dapat dipelajari di Buffer Amplifier

    Komponen IC3 berfungsi sebagai summing amplifier / adder  / penjumlah.

    Detail dan rumus-rumus summing amplifier dapat dipelajari di Summing Amplifier

    Cara Kerja

    Cara kerja rangkaian adalah sebagai berikut

    Rangkaian ini terdiri dari 3 buah op-amp. Op-amp yang digunakan adalah LM358. Power supply plus minus 12 volt, dari DC to DC converter.

    IC1 berfungsi sebagai penguat/peredam inverting.  Penguatan/peredaman dapat diatur dengan menggunakan potensiometer VR1. Total penguatan/redaman dapat dihitung berdasarkan nilai R1 dan VR1.

    Tegangan untuk menggeser naik-turun tegangan dihasilkan oleh VR2. Pada contoh ini sumber tegangan menggunakan power supply -12 volt. Jika diinginkan ketelitian lebih tinggi, sumber tegangan dapat menggukan dioda zener atau sumber tegangan referensi yang lebih baik. Pada contoh ini tegangan penggeser adalah negatif, karena hanya diperlukan penaikan tegangan  Jika diinginkan juga penurunan tegangan, maka tegangan referensi yang diperlukan adalah plus minus 12 volt.

    IC2 berfungsi sebagai buffer dari VR2. Jika tidak ada IC2, resistansi dari VR2 dapat mempengaruhi penguatan summing amplifier, karena resistansi dari VR2 akan diseri dengan R3.

    Sinyal hasil penguatan/peredaman dan sinyal penggeseran dijumlahkan dengan menggunakan IC3. IC3 dikonfigurasikan sebagai op-amp penjumlah inverting.

    Pada contoh ini semua resistor yang digunakan sama, 1k ohm untuk memudahkan pembuatan dan perhitungan.

    Untuk lebih amannya , pada bagian output perlu dipasang dioda clamp, supaya tegangan output tidak melebihi batas maksimum dan minimum ADC pada mikrokontroler.

    Foto Alat

    Pada percobaan ini, digunakan sinyal dengan frekuensi 50 Hz dan tegangan amplitudo 1 volt.

    Sumber sinyal dengan generator sinyal GW Instek AFG-2012.

    Pengukuran sinyal dengan Osiloskop GW Instek GDS-1152-U

    Sumber sinyal dari generator sinyal GW Instek AFG 2012
    Generator sinyal
     

    Implementasi rangkaian dengan breadboard, sebagai berikut:

    Percobaan rangkaian pengkondisi sinyal dengan breadboard
    Rangkaian dengan breadboard
    Suasana percobaan
    Suasana percobaan

    Foto Sinyal

    Berikut ini contoh sinyal yang dihasilkan.

    Pertama-tama sinyal dengan penggeseran tanpa penguatan.

    Contoh geser naik saja
    Contoh geser naik saja

    Sinyal input pada kanal 1, dengan warna kuning. Sinyal output pada kanal 2, dengan warna biru.

    Berikut ini sinyal yang diredam, dan digeser naik ke positif.

    Contoh redaman dan geser naik
    Contoh redaman dan geser naik

    Berikut ini sinyal dengan penguatan dan penggeseran naik.

    Contoh penguatan dan geser naik
    Contoh penguatan dan geser naik

     

    Arduino Nano memerlukan tegangan ADC antara 0~5 volt atau 0~1,1 volt, tergantung setting tegangan referensi ADC tersebut. Arduino Nano KW biasanya tegangan VCC nya adalah kurang dari 5 volt, sekitar 4,6 volt. Untuk itu perlu tegangan input ADC antara 0 ~ 4 volt. Berikut ini contoh sinyal (biru) yang sudah cocok untuk rentang tersebut.

    Contoh penguatan dan geser naik
    Contoh penguatan dan geser naik untuk Arduino

    Output dari op-amp dibatasi oleh tegangan supply. Percobaan berikut menunjukkan apa yang terjadi jika output mengalami saturasi. 

    Output saturasi
    Output saturasi

    Output (warna biru) mengalami saturasi di 7.12 volt. Tegangan supply positif yang dipakai adalah 9 volt. Datasheet LM358 menunjukkan bahwa LM358 memiliki ‘voltage output swing to rail’ sebesar 1.35 volt sampai 1,61 volt tergantung arus output. Hasil pengukuran menunjukkan jarak antara output ke VCC adalah 1,88 volt, masih di sekitar angka yang ditunjukkan di datasheet LM358.

    Referensi

     

    Percobaan Simulasi Sistem Kendali Dengan ESP32 dan op-amp LM358

    Berikut ini percobaan melakukan simulasi sistem kendali dengan mikroprosesor ESP32 dan rangkaian op-amp.

    Sistem yang dikendalikan adalah simulasi sistem kendali posisi. Kecepatan diasumsikan memiliki orde 1. Sistem disimulasikan dengan op-amp LM358.

    Berikut ini baru foto-foto dan gambarnya saja. source code dan diagram detail masih dalam pembuatan.

    Output dari port serial
    Output dari port serial
    Output di osiloskop
    Output di osiloskop
    Rangkaian kendali digital tampak atas di breadboard
    Rangkaian kendali digital tampak atas
    Rangkaian kendali digital dengan ESP32 dan op-amp LM358  tampak samping
    Rangkaian tampak samping

    Referensi

     

     

    Amplifier Operasional LM358 Dengan Input Negatif

    Apa yang terjadi jika op-amp LM358 diberi input negatif?

    Sebuah integrator dapat memberikan output tegangan negatif. Untuk itu perlu dikaji, apa yang terjadi jika sinyal tegangan negatif ini masuk ke op-amp di tahap selanjutnya.

    Batas Maksimum LM358

    Pada datasheet LM358, disebutkan bahwa input voltage Vi mempunyai nilai minimal -0,3 volt. Jika nilai input lebih kecil dari angka ini, perilaku sistem dapat tidak normal, bahkan bisa rusak dengan cepat maupun lambat.

    LM358 Absolute Maximum Ratings
    LM358 Absolute Maximum Ratings

    Percobaan

    Pada percobaan dibuat rangkaian buffer op-amp LM358, dengan input dari integrator dari tahap selanjutnya. Sinyal dari buffer ini mengandung tegangan negatif dan tegangan biasa.

    Buffer op-amp unity gain
    Buffer op-amp unity gain

     

    sinyal Input dan Ouput pada sebuah Buffer op-amp LM358
    Input dan Ouput Buffer LM358

    Input adalah sinyal warna biru  muda. Output adalah sinyal warna kuning.

    Sinyal input berasal dari output sebuah integrator dari tahap sebelumnya. Sinyal ini awalnya bernilai 0 volt, kemudian menuju negativ (- 0,56 volt), kemudian naik menuju saturasi maksimum.

    Output buffer adalah sinyal warna kuning. Ketika input negatif cukup besar, output menuju saturasi maksimum. Ketika tegangan input sudah lebih dari 0,3 volt ( di gambar cursor X2 menunjukkan tegangan -280 mV), output sudah mulai ‘normal’, yaitu menunjukkan 0 volt. Output LM358 tidak dapat negatif walaupun inputnya negatif. Setelah input lebih besar dari 0 volt, barulah buffer berfungsi sebagamana mestinya.

    Pada sebuah buffer op-amp, seharusnya tegangan output sama dengan tegangan input. Namun hal ini tidak berlaku jika inputnya negatif. Ternyata perilaku buffer ini ada 2 macam: ketika input negatif besar (lebih kecil dari – 0,3 volt), dan negatif kecil (antara – 0,3 volt dan 0 volt)

    Kesimpulan

    Jika tegangan input buffer kurang dari 0,3 volt, maka output akan menuju saturasi maksimum.

    Referensi

     

    Percobaan Integrator Dengan Op Amp LM358

    Pada tulisan ini disampaikan percobaan pembuatan integrator berbasis operational amplifier.

    Parameter Sistem

    • tipe op amp: LM358
    • Tegangan power supply: tunggal, 3,2 volt dari sebuah modul ESP32 Lolin32 Lite
    • Pengukuran dengan osiloskop GW Instek 1152A-U
    • Sinyal dari pembangkit sinyal GW Instek AFG-2012

    Berikut ini adalah rangkaian yang digunakan:

    Rangkaian buffer dan integrator berbasis LM358
    Rangkaian buffer dan integrator berbasis LM358

    Power supply tunggal dengan tegangan adalah 3,2 volt, berasal dari sebuah modul ESP32 Lolin32 Lite. Sebagai referensi ground, digunakan pembagi tegangan resistor 2k2 dan 1k, menghasilkan tegangan 1,02 volt.

    Operational amplifier menggunakan LM358. Pertimbangannya adalah op amp ini dapat bekerja dengan single supply, dengan tegangan supply dapat mencapai 3 volt. op-amp juga dapat menerima tegangan input yang sudah mendekati 0 volt. op-amp ini bukan jenis rail-to-rail, sehingga tetap akan terjadi clipping di output jika output mendekati tegangan supply.

    Op-amp lain yang sering dipakai untuk aplikasi single supply tegangan rendah adalah LM324. LM324 memiliki kemampuan output sampai VCC – 1,5 volt. Jadi kalau diberi VCC 5 volt, output op-amp dapat mulai dari 0 volt sampai 3,5 volt.

    Nilai resistor 100k dan kapasitor 10uF. Dari hasil pengukuran, nilai tepat dari resistor adalah 101,5 k dan kapasitor 9,1 uF. Tujuan pemilihan nilai ini adalah untuk mendapatkan parameter time-constant sekitar 1 detik.

    Percobaan

    Rangkaian dibuat dengan breadboard. Input dengan sinyal persegi dari generator sinyal GW Instek AFG-2012. Output diukur dengan osiloskop GW Instek GDS-1152A-U. Tegangan , nilai resistor dan nilai kapasitor diukur dengan osiloskop dan juga multimeter Kyoritsu KEW 1021R.

    Kapasitor pada integrator menggunakan kapasitor non-polar, supaya tegangan pada kapasitor tersebut dapat bernilai positif dan negatif. Jika dipakai kapasitor polar seperti elektrolit, maka kapasitor hanya berfungsi pada 1 polaritas saja.

    Set up rangkaian dengan breadboard, osiloskop GDS 1152A-U dan generator sinyal GwInstek AFG-2012
    Set up rangkaian dengan breadboard, osiloskop dan generator sinyal

    Berikut ini pengukuran sinyal input yang berasal dari sinyal generator.

    Sinyal input dari generator sinyal
    Sinyal input dari generator sinyal

    Sinyal diukur di channel 1 (sinyal kotak di bawah warna kuning). Frekuensi 0,1 Hz. Amplitudo 2 Vpp. Tegangan terukur adalah 40 mV di bagian low, dan 2,160 di bagian HIGH.

    Berikut ini sinyal output dari output integrator.

    sinyal output integrator di atas, sinyal dari generator sinyal di bagian bawah. pengukuran besar sinyal output.
    Sinyal output integrator

    Sinyal diukur di channel 2 (sinyal atas warna biru).

    Tegangan output integrator naik jika input LOW. Tegangan akan naik dengan kemiringan sesuai time constant, sampai mencapai saturasi. Tegangan maksimum output op amp adalah 1,84 volt, jadi ini adalah tegangan saturasi output op amp.

    Jika input HIGH, output integrator akan turun dengan kemiringan sesuai time constant. Tegangan terendah pada output integrator adalah 40 mV.

    Ketika input berubah dari HIGH ke LOW, output sejenak berubah menjadi negatif (diukur mencapai -0.6 volt). Tegangan negatif ini berasal dari tegangan yang tersimpan di kapasitor.

    Rangkaian Clamp Dioda

    Output integrator dapat negatif. Jika terlalu negatif dapat mengganggu/merusak komponen selanjutnya. Berikut ini hasil percobaan menambah diode clamp pada output integrator. Clamp pertama adalah rangkaian diode clamp konvensional.

    tanpa clamp dan dengan clamp dioda 1N4148
    Perbandingan tanpa clamp dan dengan clamp dioda 1N4148

    Tanpa clamp, tegangan minimum adalah -680 mV

    Dengan rangkaian clamp dioda 1N4148, tegangan minimum adalah 400 mV

     

    Berikut ini rangkaian clamp dengan perubahan sedikit. Pada rangkaian clamp biasa, anoda disambungkan ke 0 volt. Pada rangkaian ini, anoda disambungkan ke tegangan 0,7 volt supaya tegangan output tidak dapat negatif.

    Berikut ini hasil percobaan output integrator dengan diode clamp hasil modifikasi.

    Dioda clamp dan resistor 1k
    Dioda clamp dan resistor 1k

    Dengan dioda clamp 1N4148 dan resistor 1k, maka tegangan minimum integrator adalah 120 mV

    Dioda clamp dan resistor 10k
    Dioda clamp dan resistor 10k

    Dengan dioda clamp 1N4148 dan resistor 10k, maka tegangan minimum integrator adalah 0 mV

    Dari percobaan didapat rangkaian clamp terbaik adalah dengan dioda 1N4148 dan resistor 10k.

    Analisis

    • Tegangan supply 3,2 volt dari ESP32 dapat menjadi power supply untuk LM358.
    • Tegangan saturasi atas op-amp adalah 1,84 volt

    Referensi

     

     

    Menggunakan Op-Amp Dengan Catu Daya Tunggal

    Rangkaian yang menggunakan komponen op-amp umumnya perlu menggunakan power supply ganda, karena op-amp memerlukan catu daya tegangan positif dan negatif.

    Jika diinginkan rangkaian op-amp yang hanya menggunakan sebuah catu daya saja, maka perlu dibuat suatu tegangan sebagai ‘virtual ground’. Virtual ground ini berfungsi sebagai ground pada rangkaian op-amp, namun tegangannya tidak sama dengan 0 volt .

    Ground  buatan ini dikenal dengan berbagai nama:

    • Virtual ground
    • Phantom ground
    • Floating ground

    Ada beberapa cara membuat virtual ground untuk op-amp sebagai berikut:

    • Pembagi tegangan resistor
    • Pembagi tegangan resistor dengan decoupling
    • Dioda Zener
    • Regulator linear DC
    • Pembagi tegangan resistor dengan op-amp

    Virtual Ground Dengan Resistor Pembagi Tegangan

    Virtual Ground Dengan Resistor Pembagi Tegangan Dan Decoupling

    Virtual Ground Dengan Dioda Zener

    Virtual Ground Dengan Regulator Linear DC

    Virtual Ground Dengan Pembagi Tegangan Resistor Dengan Op-Amp

    Referensi