Pengukuran Frekuensi ADC internal pada Arduino Nano ATmega328
berikut ini kode yang dipakai untuk pengukuran
int counter; // how many iterations
int time_begin = 0;
int time_end = 0;
int duration;
int sensorPin = A0; // select the input pin for the potentiometer
int ledPin = 13; // select the pin for the LED
void setup() {
Serial.begin(115200);
counter = 0;
pinMode(2, OUTPUT);
Serial.println("start benchmark");
}
//---------------------------------------------------
void loop() {
int value; // angka yang ditulis
value = 0; // minimum value
analogRead(sensorPin);
PORTD=0; // langsung akses port supaya lebih cepat
analogRead(sensorPin);
PORTD=255;
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;
}
}
Hasil Pengukuran
Pengukuran output pada pin D2 dengan osiloskop menghasilkan sinyal berikut
Dari data port serial, didapatkan angka perioda 0,11 ms
start benchmark
period (ms): 0.11
period (ms): 0.11
period (ms): 0.11
period (ms): 0.11
period (ms): 0.11
Dengan osiloskop didapatkan sinyal kotak dengan frekuensi 4,45532 kHz . Artinya frekuensi ADC adalah dua kalinya, yaitu 8,91064 kHz
Angka 8900 Hz ini sesuai dengan pengukuran di artikel lain: https://chisight.wordpress.com/2016/03/25/speeding-up-the-adc-on-an-arduino-atmega-328p/
Kesimpulan
Frekuensi ADC adalah 8,91064 kHz
Frekuensi ini jauh di bawah kecepatan teoritis. Kemungkinan kelambatan karena library yang dipakai.
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
alternatif motor driver https://www.micros.com.pl/mediaserver/UITA6586_0001.pdf https://www.micros.com.pl/mediaserver/UITA6586_0001.pdf Motor Driver RZ7889 http://www.rz-mic.com/uploadfile/fj/2011122615211.pdf
# Applying the filter to a signal s can be as simple as writing # s = np.convolve(s, h)
x = np.linspace(0,1, 20001)
# filter digital signal_frequency=8000 # diubah-ubah sesuai keperluan y=np.sin(x*2*math.pi * signal_frequency) # Applying the filter to a signal s can be as simple as writing y_out = np.convolve(y, h) plt.figure(figsize=(16,6)) plt.plot(x, y_out[0:20001],label="output") plt.plot(x, y[0:20001],label="input") plt.title("signal:{} Hz".format(signal_frequency)) plt.legend() plt.axis('tight') plt.xlim([0, 0.01]) plt.savefig("simulasi-signal-{}.jpg".format(signal_frequency))
Hasil simulasi untuk frekuensi 8 Hz
Hasil simulasi untuk frekuensi 80 HzHasil simulasi untuk frekuensi 800 Hz
Hasil simulasi untuk frekuensi 8000 Hz
Simulasi dengan C di Desktop
Pada percobaan ini filter disimulasikan di Desktop PC untuk mengecek ketepatan perhitungan dibandingkan dengan versi Python.
// zeros y_history for (i=0; i<orde_filter; i++) { y_history[i]=0; } for (i=0; i<20000; i++) { printf("."); float t,y; t=(float)i/(float)20000; // time axis y=sin(2 * M_PI *signal_frequency* t); // fprintf(fp,"%f,%f\n",t,y);
// hitung history signal for (j=orde_filter-1; j>=1; j--) { int src=j-1; int dst=j; y_history[dst]=y_history[src]; // printf("%d %d\n",src,dst); } y_history[0]=y;
sinyal 80 Hz nampak teredam sedikit sekali dan ada lag
Tampilan Visualisasi untuk sinyal 800 Hz
nampak sinyal 800 Hz teredam sekitar 50%
Tampilan Visualisasi untuk sinyal 8000 Hz
nampak sinyal 8000 Hz teredam hampir semuanya
Simulasi dengan C di ESP32
pada percobaan ini kode dijalankan di ESP32 namun input adalah simulasi bukan dari generator sinyal. Output direkam ke port serial, bukan ke osiloskop.
Kode ESP32 adalah sebagai berikut
#define ORDE_FILTER 53
void setup() {
Serial.begin(115200);
//
int i, j, k;
char filename[100];
// simulasi 1 detik saja
float signal_frequency = 8; // frekuensi input signal
Saya mau kontrol variabel dari tegangan negatif (-10) hingga (+10) DC menggunakan mikrokontroler (0 ~ 3,3 VDC). Rangkaian apa yang saya butuhkan?
Jawaban:
Untuk membangkitkan tegangan analog anda bisa pakai DAC (Digital to Analog Converter). Ada mikrokontroler yang sudah ada DACnya, misal ESP32. Kalau belum ada, bisa pakai DAC tambahan seperti MCP4725 . Jadi di sini kita sudah dapat tegangan analog 0 ~ 3,3 volt. Kemudian tegangan ini dikurangi dengan 1,65 volt dengan rangkaian penjumlah op-amp dan sumber tegangan -1,65 volt. Di sini kita dapat tegangan analog -1,65 V ~ 1,65V. Tegangan ini kemudian dikalikan dengan op-amp non inverting supaya menghasilkan rentang -10V ~ +10V.
3500 VA artinya 3500 volt-ampere, yang mengindikasikan ukuran daya aparent (volt-ampere) dari perangkat atau sistem. Volt-ampere (VA) adalah hasil kali dari tegangan (volt) dan arus (ampere) yang mengalir dalam suatu rangkaian listrik.
Namun, penting untuk memahami bahwa daya tampak (VA) tidak sama dengan daya aktif (watt) yang sebenarnya digunakan oleh perangkat atau sistem. Faktor daya (power factor) digunakan untuk menggambarkan perbandingan antara daya aktif (watt) dan daya aparent (VA). Faktor daya dapat berkisar antara 0 hingga 1.
Jika kita asumsikan faktor daya adalah 1 (cos φ = 1), maka 3500 VA juga setara dengan 3500 watt (W), artinya perangkat atau sistem menggunakan atau menghasilkan daya sebesar 3500 watt. Namun, jika faktor daya lebih rendah dari 1, daya yang sebenarnya akan lebih rendah dari 3500 watt.
Jadi, 3500 VA berarti ukuran daya aparent (volt-ampere) dari perangkat atau sistem, tetapi untuk mengetahui daya aktif (watt) yang sebenarnya, Anda perlu mengetahui berapa sebenarnya faktor daya yang berlaku pada sistem anda.
Rumah dengan kapasitas daya 3500 VA biasanya menggunakan MCB (mini circuit breaker) dengan batas arus 16 ampere. Jadi sebenarnya dayanya adalah 2200 x 16 = 3520 VA, namun untuk mudahnya dibulatkan ke 3500 VA.
Untuk mengkonversi volt-ampere (VA) menjadi watt (W), Anda perlu mengetahui faktor daya (power factor) dari perangkat atau sistem yang sedang Anda ukur. Faktor daya menggambarkan sejauh mana daya yang disalurkan oleh perangkat berkontribusi pada melakukan kerja yang berguna.
Faktor daya dapat bernilai 0 (minimum) sampai 1 (maksimum)
Jika di rumah/pabrik banyak menggunakan motor AC, maka faktor daya dapat turun sampai ke 0,7
Jika di rumah/pabrik banyak menggunakan komputer, biasanya faktor daya di sekitar 0,9
Angka 7700 VA ini biasanya hasil kali dari 220 volt x 35 ampere, artinya rumah dengan listrik 1 fasa dan MCB (mini circuit breaker) berkapasitas 35 ampere.
Namun, jika asumsi kita adalah faktor daya 1 (cos φ = 1), maka 7700 VA juga setara dengan 7700 watt (W). Ini berarti daya yang dikonsumsi atau dihasilkan oleh perangkat atau sistem adalah 7700 watt. Namun, jika faktor daya kurang dari 1, daya sebenarnya akan lebih rendah daripada VA tersebut.
Perlu diperhatikan bahwa faktor daya pada umumnya berbeda untuk berbagai perangkat dan sistem.