PERANCANGAN
PENGOLAHAN SINYAL DIGITAL BERBASIS MIKROKONTROLER: PULSE-OXYMETER SEDERHANA
Theo Gunawan (13215029)
Yoland Nababan (13215053)
EL3014-Sistem Mikroprosesor
Program Studi Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB
Abstrak
Setelah sebelumnya merancang serta membuat filter FIR dan rangkaian analog, pada percobaan ini dibuat rangkaian tahap akhir dari pulse-oxymeter sederhana ini. Rangkaian dibuat menggunakan printed circuit board (PCB) dan menjalani serangkaian simulasi menggunakan osiloskop untuk dilihat keberjalanannya.
Kata kunci: Pulse-oxymeter, printed circuit board, simulasi menggunakan osiloskop
1. Pendahuluan
Pulse-oxymeter adalah sebuah alat yang digunakan untuk memeriksa saturasi hemoglobin dalam tubuh dengan cara mendeteksi jari menggunakan phototransistor dan kemudian mengeluarkan sinyal berdasarkan bacaan masukan. Pulse-oxymeter terdiri dari rangkaian utama, ADC, filter FIR, dan DAC. Pada percobaan ini dibahas mengenai rangkaian akhir dari pulse-oxymeter ini dan simulasinya menggunakan osiloskop.
2.Studi Pustaka
Implementasi pulse-oxymeter
sederhana menggunakan tiga buah komponen, yaitu rangkaian preamplifier, low-pass filter,
dan final amplifier dengan low-pass filter. Sinyal input berasal
dari phototransistor.[1] Rangkaian lengkap dari pulse-oxymeter sederhana adalah sebagai berikut.
Gambar 2-1 Skema rangkaian lengkap pulse-oxymeter sederhana
Rangkaian pulse-oxymeter ini terhubung dengan analog-to-digital converter (ADC) sebelum melalui filter FIR pada Arduino. Output dari filter dihubungkan dengan digital-to-analog converter (DAC) untuk menghasilkan sinyal output akhir.
3. Metodologi
3.1 Komponen dan Alat
Komponen dan alat yang dipakai dalam percobaan ini adalah sebagai berikut.
- PCB dengan rangkaian pulse-oxymeter.
- Arduino.
- Osiloskop.
3.2 Langkah-langkah Percobaan
Langkah-langkah yang dilakukan pada percobaan ini adalah sebagai berikut.
- Merangkai pulse-oxymeter pada PCB sesuai dengan rancangan.
- Menyambungkan rangkaian dengan ADC dan Arduino (filter FIR) dan Arduino pada DAC dan osiloskop.
- Melakukan simulasi terhadap rangkaian menggunakan osiloskop.
4. Hasil dan Analisis
Pada percobaan ini dibuat rangkaian pulse-oxymeter menggunakan PCB. Pada rangkaian tersebut terdapat penguat 2-stage. Output dari penguat 2-stage tersebut adalah sebagai berikut.
Sedangkan output dari phototransistor adalah sebagai berikut.
Hasil percobaan lebih lanjut terdapat pada video.
5. Kesimpulan
Kesimpulan yang dapat ditarik dari percobaan ini adalah sebagai berikut.
Gambar 4-2 Output dari phototransistor
Rangkaian pulse-oxymeter memiliki output pada rangkaian analog sebagai berikut.
Gambar 4-3 Output AC pada rangkaian analog
Gambar 4-4 Output DC pada rangkaian analog
Output pada rangkaian analog melalui analog-to-digital converter (ADC) terlebih dahulu sebelum menjadi input pada Arduino. Input pada Arduino (output ADC) adalah sebagai berikut.
Gambar 4-5 Input Arduino
Arduino bekerja sebagai FIR pada rangkaian. Output dari filter FIR adalah sebagai berikut.
Gambar 4-6 Output filter FIR
Sinyal output FIR masuk ke dalam digital-to-analog converter (DAC) sehingga menjadi output akhir sebagai berikut.
Gambar 4-7 Output akhir
Dapat terlihat bahwa pada hasil percobaan rangkaian FIR tidak bekerja dengan baik (sinyal input dan output terlihat sama). Hal ini menyebabkan output akhir memiliki noise. Selain itu rangkaian pulse-oxymeter bekerja baik.Hasil percobaan lebih lanjut terdapat pada video.
5. Kesimpulan
Kesimpulan yang dapat ditarik dari percobaan ini adalah sebagai berikut.
- Rangkaian pulse-oxymeter dapat diimplementasikan dengan cukup baik menggunakan PCB.
Daftar Pustaka
[1]
Ihsan
Hariadi, Percobaan Awal Instrumen
Pulse-Oxymeter Sederhana – versi 0.0, https://www.youtube.com/watch?v=hD5Phpbus1o,
diakses 27 Maret 2018.
//#include <Wire.h>
//#include <Adafruit_MCP4725.h>
//
//#define BUFFERLENGTH 11
//#define LENGTH 100
//#define PI 3.14159265
//float koef_filter[BUFFERLENGTH] = {
// 0.0100, 0.0249 , 0.0668 , 0.1249,
// 0.1756 , 0.1957 , 0.1756 , 0.1249 ,
// 0.0668 , 0.0249 , 0.0100
//};
//float buffer[BUFFERLENGTH];
//float x[LENGTH];
//float y[LENGTH];
//float output;
//int i, j;
//Adafruit_MCP4725 dac;
//
//float filter(float input) {
// float hasil;
// //buffering
// for(j = BUFFERLENGTH -1; j > 0; j--) {
// buffer[j] = buffer[j-1];
// }
// //input disimpan di buffer 0
// int k=0;
// buffer[k] = input;
// // perhitungan filter
// hasil= 0;
// for(j = 0; j < BUFFERLENGTH; j++) {
// hasil = hasil + buffer[(j+k) %BUFFERLENGTH]* round(koef_filter[j]*pow(2,31));
// }
// if (k<=0){
// k=k+BUFFERLENGTH-1;
// }
// else{
// k--;
// };
//
// // kembalikan hasil pemfilteran
// return hasil;
//}
//
// // testing frequency (frequency sampling: 6.5ms, wn 0.1)
// unsigned long time = 0;
// unsigned long time1 = 0;
//
// //bacaan sensor
// float input = 0;
//
// //setelah melewati DSP
// float output_fir=0;
//
// float output_dac = 0;
// unsigned long norm = 1975396352;
//
//
//void setup() {
// Serial.begin(9600);
// // For Adafruit MCP4725A1 the address is 0x62 (default) or 0x63 (ADDR pin tied to VCC)
// dac.begin(0x60); // address
// DDRB |= (1<<0);
// PORTB |= (1<<0);
//}
//
//void loop() {
// //siapkan input
// input = (float(analogRead(A0)))/1023;
//
// //inisialisasi buffer dengan nol
// for(i=0; i < BUFFERLENGTH; i++) {
// buffer[i] = 0;
// }
//
// //menghitung output
// output_fir = filter(input);
//
// // menampilkan output
// Serial.println(output_fir/17000000);
//// Serial.println(input);
//
// // output ke dac
// output_dac = (int) (output/norm)*4095;
// dac.setVoltage(output_dac, false);
//
// PORTB ^= (1<<0);
//}
//====
//
//#include <Wire.h>
//#include <Adafruit_MCP4725.h>
//
//#define BUFFERLENGTH 21
//#define LENGTH 100
//#define PI 3.14159265
//float koef_filter[BUFFERLENGTH] = {
//
// 0.0050 , 0.0070 , 0.0125 , 0.0215 , 0.0336,
// 0.0478 , 0.0627 , 0.0768 , 0.0882 , 0.0957,
// 0.0983 , 0.0957 , 0.0882 , 0.0768 , 0.0627,
// 0.0478 , 0.0336 , 0.0215 , 0.0125 , 0.0070 ,
// 0.0050
//};
//float buffer[BUFFERLENGTH];
//float x[LENGTH];
//float y[LENGTH];
//float output;
//int i, j;
//Adafruit_MCP4725 dac;
//
//float filter(float input) {
// float hasil;
// //buffering
// for(j = BUFFERLENGTH -1; j > 0; j--) {
// buffer[j] = buffer[j-1];
// }
// //input disimpan di buffer 0
// int k=0;
// buffer[k] = input;
// // perhitungan filter
// hasil= 0;
// for(j = 0; j < BUFFERLENGTH; j++) {
// hasil = hasil + buffer[(j+k) %BUFFERLENGTH]* round(koef_filter[j]*pow(2,31));
// }
// if (k<=0){
// k=k+BUFFERLENGTH-1;
// }
// else{
// k--;
// };
//
// // kembalikan hasil pemfilteran
// return hasil;
//}
//
// // testing frequency (frequency sampling 675, wn = 0.12) 6.125ms
// unsigned long time = 0;
// unsigned long time1 = 0;
//
// //bacaan sensor
// float input = 0;
//
// //setelah melewati DSP
// float output_fir=0;
//
// float output_dac = 0;
// unsigned long norm = 3000000;
//;
//
//void setup() {
// Serial.begin(9600);
// // For Adafruit MCP4725A1 the address is 0x62 (default) or 0x63 (ADDR pin tied to VCC)
// dac.begin(0x60); // address
// DDRB |= (1<<0);
// PORTB |= (1<<0);
//}
//
//void loop() {
// //siapkan input
// input = ((float)(analogRead(A0)))/1023;
//
// //inisialisasi buffer dengan nol
// for(i=0; i < BUFFERLENGTH; i++) {
// buffer[i] = 0;
// }
//
// //menghitung output
// output_fir = filter(input);
//
// // menampilkan output
// Serial.println(output_fir/10000000);
//
// // output ke dac
// output_dac = (int) (output_fir/norm)*4095;
// dac.setVoltage(output_dac, false);
//
// PORTB ^= (1<<0);
//}
//////=====
#include <Wire.h>
#include <Adafruit_MCP4725.h>
#define BUFFERLENGTH 33
#define PI 3.14159265
float koef_filter[BUFFERLENGTH] = {
0.0015 , -0.0000 , -0.0025 ,
-0.0023 , 0.0033 , 0.0078,
-0.0000 , -0.0151 , -0.0126,
0.0168 , 0.0361 , -0.0000,
-0.0654 , -0.0575 , 0.0902,
0.2998 , 0.3997 , 0.2998 ,
0.0902 , -0.0575 , -0.0654 ,
-0.0000 , 0.0361 , 0.0168,
-0.0126 , -0.0151 , -0.0000 ,
0.0078 , 0.0033 , -0.0023 ,
-0.0025 , -0.0000 , 0.0015
};
float buffer[BUFFERLENGTH];
int i, j;
Adafruit_MCP4725 dac;
float filter(float input) {
float hasil;
//buffering
for(j = BUFFERLENGTH -1; j > 0; j--) {
buffer[j] = buffer[j-1];
}
//input disimpan di buffer 0
int k=0;
buffer[k] = input;
// perhitungan filter
hasil= 0;
for(j = 0; j < BUFFERLENGTH; j++) {
hasil = hasil + buffer[(j+k) %BUFFERLENGTH]* round(koef_filter[j]*pow(2,31));
}
if (k<=0){
k=k+BUFFERLENGTH-1;
}
else{
k--;
};
// kembalikan hasil pemfilteran
return hasil;
}
// testing frequency
// (frequency = 160, period = 6.25ms, wn = 0.125)
unsigned long time = 0;
unsigned long time1 = 0;
//bacaan sensor
float input = 0;
//setelah melewati DSP
float output_fir=0;
float output_dac = 0;
unsigned long norm = 8000000;
void setup() {
Serial.begin(9600);
// For Adafruit MCP4725A1 the address is 0x62 (default) or 0x63 (ADDR pin tied to VCC)
dac.begin(0x60); // address
DDRB |= (1<<0);
PORTB |= (1<<0);
}
void loop() {
//siapkan input
input = ((float)analogRead(A0))/1023;
//inisialisasi buffer dengan nol
for(i=0; i < BUFFERLENGTH; i++) {
buffer[i] = 0;
}
//menghitung output
output_fir = filter(input);
// menampilkan output
// Serial.println(output_fir/3000000);
// Serial.println(input);
Serial.println( ((int)((output_fir/3000000)*4095)) );
// output ke dac
output_dac = ((int) ((output_fir/3000000)*4095));
dac.setVoltage(output_dac, false);
PORTB ^= (1<<0);
}
Lampiran
Source code//#include <Wire.h>
//#include <Adafruit_MCP4725.h>
//
//#define BUFFERLENGTH 11
//#define LENGTH 100
//#define PI 3.14159265
//float koef_filter[BUFFERLENGTH] = {
// 0.0100, 0.0249 , 0.0668 , 0.1249,
// 0.1756 , 0.1957 , 0.1756 , 0.1249 ,
// 0.0668 , 0.0249 , 0.0100
//};
//float buffer[BUFFERLENGTH];
//float x[LENGTH];
//float y[LENGTH];
//float output;
//int i, j;
//Adafruit_MCP4725 dac;
//
//float filter(float input) {
// float hasil;
// //buffering
// for(j = BUFFERLENGTH -1; j > 0; j--) {
// buffer[j] = buffer[j-1];
// }
// //input disimpan di buffer 0
// int k=0;
// buffer[k] = input;
// // perhitungan filter
// hasil= 0;
// for(j = 0; j < BUFFERLENGTH; j++) {
// hasil = hasil + buffer[(j+k) %BUFFERLENGTH]* round(koef_filter[j]*pow(2,31));
// }
// if (k<=0){
// k=k+BUFFERLENGTH-1;
// }
// else{
// k--;
// };
//
// // kembalikan hasil pemfilteran
// return hasil;
//}
//
// // testing frequency (frequency sampling: 6.5ms, wn 0.1)
// unsigned long time = 0;
// unsigned long time1 = 0;
//
// //bacaan sensor
// float input = 0;
//
// //setelah melewati DSP
// float output_fir=0;
//
// float output_dac = 0;
// unsigned long norm = 1975396352;
//
//
//void setup() {
// Serial.begin(9600);
// // For Adafruit MCP4725A1 the address is 0x62 (default) or 0x63 (ADDR pin tied to VCC)
// dac.begin(0x60); // address
// DDRB |= (1<<0);
// PORTB |= (1<<0);
//}
//
//void loop() {
// //siapkan input
// input = (float(analogRead(A0)))/1023;
//
// //inisialisasi buffer dengan nol
// for(i=0; i < BUFFERLENGTH; i++) {
// buffer[i] = 0;
// }
//
// //menghitung output
// output_fir = filter(input);
//
// // menampilkan output
// Serial.println(output_fir/17000000);
//// Serial.println(input);
//
// // output ke dac
// output_dac = (int) (output/norm)*4095;
// dac.setVoltage(output_dac, false);
//
// PORTB ^= (1<<0);
//}
//====
//
//#include <Wire.h>
//#include <Adafruit_MCP4725.h>
//
//#define BUFFERLENGTH 21
//#define LENGTH 100
//#define PI 3.14159265
//float koef_filter[BUFFERLENGTH] = {
//
// 0.0050 , 0.0070 , 0.0125 , 0.0215 , 0.0336,
// 0.0478 , 0.0627 , 0.0768 , 0.0882 , 0.0957,
// 0.0983 , 0.0957 , 0.0882 , 0.0768 , 0.0627,
// 0.0478 , 0.0336 , 0.0215 , 0.0125 , 0.0070 ,
// 0.0050
//};
//float buffer[BUFFERLENGTH];
//float x[LENGTH];
//float y[LENGTH];
//float output;
//int i, j;
//Adafruit_MCP4725 dac;
//
//float filter(float input) {
// float hasil;
// //buffering
// for(j = BUFFERLENGTH -1; j > 0; j--) {
// buffer[j] = buffer[j-1];
// }
// //input disimpan di buffer 0
// int k=0;
// buffer[k] = input;
// // perhitungan filter
// hasil= 0;
// for(j = 0; j < BUFFERLENGTH; j++) {
// hasil = hasil + buffer[(j+k) %BUFFERLENGTH]* round(koef_filter[j]*pow(2,31));
// }
// if (k<=0){
// k=k+BUFFERLENGTH-1;
// }
// else{
// k--;
// };
//
// // kembalikan hasil pemfilteran
// return hasil;
//}
//
// // testing frequency (frequency sampling 675, wn = 0.12) 6.125ms
// unsigned long time = 0;
// unsigned long time1 = 0;
//
// //bacaan sensor
// float input = 0;
//
// //setelah melewati DSP
// float output_fir=0;
//
// float output_dac = 0;
// unsigned long norm = 3000000;
//;
//
//void setup() {
// Serial.begin(9600);
// // For Adafruit MCP4725A1 the address is 0x62 (default) or 0x63 (ADDR pin tied to VCC)
// dac.begin(0x60); // address
// DDRB |= (1<<0);
// PORTB |= (1<<0);
//}
//
//void loop() {
// //siapkan input
// input = ((float)(analogRead(A0)))/1023;
//
// //inisialisasi buffer dengan nol
// for(i=0; i < BUFFERLENGTH; i++) {
// buffer[i] = 0;
// }
//
// //menghitung output
// output_fir = filter(input);
//
// // menampilkan output
// Serial.println(output_fir/10000000);
//
// // output ke dac
// output_dac = (int) (output_fir/norm)*4095;
// dac.setVoltage(output_dac, false);
//
// PORTB ^= (1<<0);
//}
//////=====
#include <Wire.h>
#include <Adafruit_MCP4725.h>
#define BUFFERLENGTH 33
#define PI 3.14159265
float koef_filter[BUFFERLENGTH] = {
0.0015 , -0.0000 , -0.0025 ,
-0.0023 , 0.0033 , 0.0078,
-0.0000 , -0.0151 , -0.0126,
0.0168 , 0.0361 , -0.0000,
-0.0654 , -0.0575 , 0.0902,
0.2998 , 0.3997 , 0.2998 ,
0.0902 , -0.0575 , -0.0654 ,
-0.0000 , 0.0361 , 0.0168,
-0.0126 , -0.0151 , -0.0000 ,
0.0078 , 0.0033 , -0.0023 ,
-0.0025 , -0.0000 , 0.0015
};
float buffer[BUFFERLENGTH];
int i, j;
Adafruit_MCP4725 dac;
float filter(float input) {
float hasil;
//buffering
for(j = BUFFERLENGTH -1; j > 0; j--) {
buffer[j] = buffer[j-1];
}
//input disimpan di buffer 0
int k=0;
buffer[k] = input;
// perhitungan filter
hasil= 0;
for(j = 0; j < BUFFERLENGTH; j++) {
hasil = hasil + buffer[(j+k) %BUFFERLENGTH]* round(koef_filter[j]*pow(2,31));
}
if (k<=0){
k=k+BUFFERLENGTH-1;
}
else{
k--;
};
// kembalikan hasil pemfilteran
return hasil;
}
// testing frequency
// (frequency = 160, period = 6.25ms, wn = 0.125)
unsigned long time = 0;
unsigned long time1 = 0;
//bacaan sensor
float input = 0;
//setelah melewati DSP
float output_fir=0;
float output_dac = 0;
unsigned long norm = 8000000;
void setup() {
Serial.begin(9600);
// For Adafruit MCP4725A1 the address is 0x62 (default) or 0x63 (ADDR pin tied to VCC)
dac.begin(0x60); // address
DDRB |= (1<<0);
PORTB |= (1<<0);
}
void loop() {
//siapkan input
input = ((float)analogRead(A0))/1023;
//inisialisasi buffer dengan nol
for(i=0; i < BUFFERLENGTH; i++) {
buffer[i] = 0;
}
//menghitung output
output_fir = filter(input);
// menampilkan output
// Serial.println(output_fir/3000000);
// Serial.println(input);
Serial.println( ((int)((output_fir/3000000)*4095)) );
// output ke dac
output_dac = ((int) ((output_fir/3000000)*4095));
dac.setVoltage(output_dac, false);
PORTB ^= (1<<0);
}
No comments:
Post a Comment