Kabel female DC untuk catu daya.
Komponen ini penting untuk menghubungkan catu daya DC ke rangkaian.
Kabel pada foto berikut ini adalah bagian dari kit praktikum motor DC berbasisi mikroprosesor.
Ada banyak cara untuk membuat aplikasi pada sistem mikroprosesor.
Untuk persoalan-persoalan sederhana, dapat langsung dibuat flowchart (diagram alir) berdasarkan algoritma tertentu.
Untuk kasus-kasus spesifik, kita bisa pakai model matematis yang powerful.
Dasar-dasar matematika untuk membangun suatu perangkat lunak mikroprosesor di antaranya:
Teknologi di bidang elektro yang dapat dipakai:
Contoh model matematis untuk kasus khusus:
Beberapa mikroprosesor dan mikrokontroler populer zaman sekarang. Dari kiri: Arduino Nano, ESP32, Raspberry Pi 4, Jetson Nano. Arduino Nano dengan clock 16 MHz, mikrokontroler yang sangat populer di kalangan hobi elektronika. ESP32 punya 2 prosesor dengan clock 240 MHz. ESP32 ini komputasinya lebih powerful dibandingkan Arduino Nano, plus ada kemampuan WiFi. Populer untuk membuat aplikasi IoT (Internet of Things). Raspberry Pi prosesornya dari keluarga ARM sebanyak 4 core, clock 1 GHz, sistem operasinya Linux. Dapat dipakai menjalankan aplikasi Linux yang tidak terlalu besar. Jetson Nano berisi prosesor ARM dan dilengkapi dengan GPU (Graphical Processing Unit). Cocok untuk menjalankan aplikasi AI (Artificial Intelligence) dari jenis Deep Neural Network / Deep Learning.
Mikroprosesor/mikrokontroler ini perubahannya cepat sekali. Zaman 1990an ketika saya kuliah, benda-benda ini belum ada. Mikroprosesor yang diajarkan di kuliah masih pakai Z80 / 8051. Sekarang tiap tahun mesti ngintip-ngintip perkembangan terbaru. Kalau kuliah dasar seperti rangkaian listrik & medan elektromagnetik isinya praktis tidak berubah
Saya baru saja mendapatkan modul Jetson Nano 2GB. Rencananya board ini akan dipakai untuk percobaan dengan machine learning / artificial intelligence.
Berikut ini perbandingan ukuran fisik antara Arduino Nano, ESP32 Lolin Lite, Raspberry Pi dan Jetson Nano.
Fitur utama dari Jetson Nano ini adalah memiliki CUDA core, seperti yang dipakai di GPU (Graphical Processing Unit) untuk komputer desktop/laptop, hanya saja di Jetson Nano jumlah dan kemampuannya lebih kecil.
Saya baru saja mendapatkan power supply merek Taffware tipe GS-551. Fitur utama power supply ini adalah kemampuan tegangan outputnya dapat bervariasi:
Arus besar ini diperlukan untuk modul mikroprosesor dengan kemampuan tinggi seperti catu daya Raspbery Pi 4, atau Jetson Nano.
Spesifikasi adapter ini tercantum di bodynya sebagai berikut:
Spesifikasi
Pengolahan sinyal digital dapat diimplementasikan dengan mikroprosesor. Berikut ini blok diagram pengolahan sinyal digital minimalis:
sinyal analog masuk ke pengkondisi sinyal.
Sensor ketinggian air (water level sensor) yang menggunakan tekanan air untuk mengetahui ketinggian air. Prinsip fisika yang dipakai adalah hidrostatika, di mana tekanan dalam suatu wadah berisi cairan sebanding dengan kedalaman dan massa jenis cairan tersebut.
Berikut ini contoh pinout sensor ketinggian air yang sudah dilengkapi dengan antar muka RS-485
Sensor ini sudah dilengkapi dengan kompensasi tekanan udara. Caranya adalah dengan adanya selang udara kecil di dalam kabel penghubung ke sensor tersebut. Dengan demikian maka dapat diketahui perbedaan tekanan di dalam air dan tekanan udara di luar tangki. Dari perbedaan tekanan tersebut dapat dihitung ketinggian air pada tangki atau wadah air.
Sensor Winsen MH-Z19B berfungsi mengukur kadar CO2 di udara. Prinsip pengukuran menggunakan NDIR (Non Dispersive Infrared). Fitur utama: selektivitas tinggi, tidak tergantung oksigen, masa pakai panjang. Di dalamnya sudah ada kompensasi temperatur. Outputnya tersedia 3 macam, berupa sinyal digital serial asinkron, sinyal digital PWM (pulse width modulation) dan tegangan analog.
Kadar CO2 di udara dapat dipakai untuk indikator kualitas ventilasi di suatu ruangan. Ventilasi yang baik ini penting untuk mengurangi penularan COVID-19.
Product Model | MH-Z19B |
Target Gas | CO2 |
Working voltage | 4.5~ 5.5 V DC |
Average current | < 60mA(@5V) |
Peak current | 150mA (@5V) |
Interface level | 3.3 V(Compatible with 5V) |
Measuring range | refer to Table 2 |
Output signal | UART(TTL interface level 3.3V) |
PWM | |
DAC(default 0.4-2V) | |
Preheat time | 3 min |
Response Time | T90< 120 s |
Working temperature | 0 ~ 50 ℃ |
Working humidity | 0~ 90% RH (No condensation) |
Dimension | 33 mm×20 mm×9 mm (L×W×H) |
Weight | 5g |
Lifespan | > 5 years |
Berikut ini contoh sensor MH-Z19B yang dihubungkan ke prosesor ESP32 DevkitC. Pertimbangan menggunakan DevkitC adalah karena tegangan sinyal sensor adalah 3 volt namun juga memerlukan tegangan Vcc sebesar 5 volt. Board ESP32 Lolin32 Lite tidak memiliki output 5 volt, jadi agak sulit digunakan pada aplikasi ini.
Berikut ini contoh pembacaan sensor melalui port serial.
Konfigurasi port serial di ESP32 menggunakan pin 22 sebagai RXD dan pin 23 sebagai TXD. Jalur port serial dihubungkan melalui resistor 100 ohm untuk perlindungan kalau terjadi kesalahan polaritas pin TX dan RX.
// https://circuits4you.com/2018/12/31/esp32-hardware-serial2-example/
#define RXD2 22
#define TXD2 23
// These constants won't change. They're used to give names to the pins used:
int sensorValue = 0; // value read from the pot
int outputValue = 0; // value output to the PWM (analog out)
#define LED_BUILTIN 2
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
Serial.println("Start Devkit");
Serial.println("Start Devkit");
pinMode(LED_BUILTIN, OUTPUT);
pinMode(21, OUTPUT);
}
void loop() {
char cmd;
Serial2.print((char)0xff); // 0 : start byte
Serial2.print((char)0x01);
Serial2.print((char)0x86);
Serial2.print((char)0x00);
Serial2.print((char)0x00);
Serial2.print((char)0x00);
Serial2.print((char)0x00);
Serial2.print((char)0x00);
Serial2.print((char)0x79); // 8: checksum
int counter = 0;
int co2_high, co2_low;
int available;
available = Serial2.available();
while (available > 0) {
// read the incoming byte:
int incomingByte = Serial2.read();
// say what you got:
Serial.print(">>:");
Serial.println(incomingByte, DEC);
if (counter == 2) {
co2_high = incomingByte;
}
if (counter == 3) {
co2_low = incomingByte;
}
available = Serial2.available();
counter++;
}
Serial.print("CO2: ");
Serial.println(co2_high * 256 + co2_low);
// Serial.print("available: ");
// Serial.println(available);
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
digitalWrite(21, HIGH);
delay(500); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
digitalWrite(21, LOW); // turn the LED off by making the voltage LOW
delay(500);
}
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");
}
}
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
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.
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.
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.
TDA2050 dirancang untuk penguat audio amplifier, bukan untuk motor driver. Beberapa kelemahan yang akan terjadi pada rangkaian ini: