BISMILLAHIRRAHMANIRRAHIM
pada Industri saya sering bertemu dengan alat semacam ini, inputnya 4-20ma dan output displaynya 0 - 100% atau 0 - 10MPa dan sebagainya. kalau di perhatikan masukkannya sama saja hanya 4 - 20ma yang di konversi dengan ke nilai outputnya dengan nilai perbandingan saja.
misal 4ma menjadi 0%
12ma menjadi 50%
20ma menjadi 100%
inputnya selalu sama 4 - 20ma hanya outputnya yang berbeda. inilah kata kuncinya
sebelum membaca ini ada baiknya anda membaca artikle mengapa 4 - 20ma sebagai referensi dasar
dalam rangkaian proteus yang saya ikutkan pada blog ini, menggunakan masukkan tegangan 1 - 5V untuk mengkonversinya menjadi arus maka digunakannya resistor 250ohm yang juga di bahas pada artikle "mengapa 4-20ma".
untuk singkatnya silahkan lihat gambar berikut :
rangkaian Modulnya
Tentunya modul ini harus bisa di kalibrasi agar akurat, berikut adalah cara kalibrasinya
1. tekan tombol menu selama minimal 5 detik sampai display berubah dengan tulisan 1- V artinya anda sudah masuk mode kalibrasi.
2. lalu setting titik zeronya dengan tegangan 1V lalu tekan cal_zero
3. lalu setting tegangan 5V lalu tekan cal_range
4. dan selesai tekan exit agar keluar mode kalibrasi dan kembali pada mode operasi
berikut adalah videonya :
baiklah begitulah penjelasan ringkasnya, karena ini bersifat opensource maka akan saya sertakan semua file, saya menggunakan mikropascal sebagai kompilernya dan proteus sebagai simulasinya jika mau test ada folder "file test" jika tidak memiliki mikropascal jadi bisa langsung di coba
download di link ini "ilmu jika tidak di amalkan bagai pohon yang tak berbuah" semoga bermanfaat dan salam innovasi
listing mikropascalnya :
bagian utamanya :
program lib_7seg;
uses display, tambahan;
{ Declarations section }
var adc_rd : word;
txt : array[10] of char;
txt_dis : array[4] of char;
ulv : byte;
llv : byte;
cal_zero : word;
cal_range : word;
nilai : real;
range : word;
hasil : real;
count : byte;
test : byte;
var
oldstate_menu : bit;
oldstate_exit : bit;
oldstate_calrange : bit;
oldstate_calzero : bit;
label
awal,loop1;
begin
awal:
//UART1_Init(9600); // initialize UART1 module
//Delay_ms(100);
DDB1_bit := 0;
DDB2_bit := 0;
DDD2_bit := 1;
DDD3_bit := 1;
DDD4_bit := 1;
DDB3_bit := 0;
DDB4_bit := 0;
PORTB1_bit := 1;
PORTB2_bit := 1;
PORTB3_bit := 1;
PORTB4_bit := 1;
{mr := true;} ds := false; st := false; sh := false;
DDC0_bit := 0;
ADC_Init();
test := EEPROM_Read(0x10);
if test = '@' then
begin
hi(cal_zero) := EEPROM_Read(0x20);
lo(cal_zero) := EEPROM_Read(0x21);
hi(cal_range) := EEPROM_Read(0x30);
lo(cal_range) := EEPROM_Read(0x31);
end
else
begin
cal_zero := 0;
cal_range := 1023;
end;
//cal_zero := 0;
//cal_range := 1023;
ulv := 100;
llv := 0;
range := cal_range - cal_zero;
// reset nilai oldstate
oldstate_menu := 0;
oldstate_exit := 0;
oldstate_calrange := 0;
oldstate_calzero := 0;
count := 0;
while true do
begin
adc_rd := ADC_Read(0);
adc_rd := ADC_Read(0);
adc_rd := ADC_Read(0);
adc_rd := sarat(adc_rd);
nilai := adc_rd - cal_zero;
hasil := (nilai/range)*100;
delay_ms (300);
FloatToStr(hasil, txt);
txt_dis[0]:= txt[0];
txt_dis[1]:= txt[1];
txt_dis[2]:= txt[2];
txt_dis[3]:= txt[3];
if hasil < 100 then
begin
txt_dis[0]:= txt[0];
txt_dis[1]:= txt[1];
txt_dis[2]:= txt[3];
txt_dis[3]:= ' ';
end;
if hasil < 10 then
begin
txt_dis[0]:= ' ';
txt_dis[1]:= txt[0];
txt_dis[2]:= txt[2];
txt_dis[3]:= ' ';
end;
dis_nilai(txt_dis,4);
if (Button(PINB, 1, 10, 0)) then
begin
oldstate_menu := 1;
inc(count);
if count > 18 then dis_nilai('1-V ',4); // tunggu 5 detik
end;
if (oldstate_menu and Button(PINB, 1, 10, 1)) then
begin
oldstate_menu := 0;
if count > 18 then // tunggu 5 detik
begin
dis_nilai('1-V ',4);
//UART1_Write_text('masuk menu');
goto loop1;
end;
count := 0;
end;
end;
loop1:
// reset nilai oldstate
//UART1_Write_text('masuk loop');
oldstate_menu := 0;
oldstate_exit := 0;
oldstate_calrange := 0;
oldstate_calzero := 0;
while true do
begin
if (Button(PINB, 1, 10, 0)) then
oldstate_menu := 1;
if (oldstate_menu and Button(PINB, 1, 10, 1)) then
begin
// listingnya
oldstate_menu := 0;
dis_nilai('1-V ',4);
//UART1_Write_text('menu');
end;
if (Button(PINB, 2, 10, 0)) then
oldstate_exit := 1;
if (oldstate_exit and Button(PINB, 2, 10, 1)) then
begin
// listingnya
oldstate_exit := 0;
//UART1_Write_text('exit');
goto awal;
end;
if (Button(PINB, 3, 10, 0)) then
oldstate_calrange := 1;
if (oldstate_calrange and Button(PINB, 3, 10, 1)) then
begin
// listingnya
oldstate_calrange := 0;
adc_rd := ADC_Read(0);
adc_rd := ADC_Read(0);
adc_rd := ADC_Read(0);
adc_rd := ADC_Read(0);
cal_range := adc_rd;
EEPROM_Write(0x10, '@');
EEPROM_Write(0x30, hi(adc_rd));
EEPROM_Write(0x31, lo(adc_rd));
//UART1_Write_text('calrange');
dis_nilai('0-- ',4);
end;
if (Button(PINB, 4, 10, 0)) then
oldstate_calzero := 1;
if (oldstate_calzero and Button(PINB, 4, 10, 1)) then
begin
// listingnya
oldstate_calzero := 0;
adc_rd := ADC_Read(0);
adc_rd := ADC_Read(0);
adc_rd := ADC_Read(0);
adc_rd := ADC_Read(0);
cal_zero := adc_rd;
EEPROM_Write(0x10, '@');
EEPROM_Write(0x20, hi(adc_rd));
EEPROM_Write(0x21, lo(adc_rd));
dis_nilai('5-V ',4);
//UART1_Write_text('calzero');
end;
end;
end.
Library displaynya :
unit display;
{
// contant 7segment
const
angka_0 : byte = %01110111;
angka_1 : byte = %00010100;
angka_2 : byte = %10110011;
angka_3 : byte = %10110110;
angka_4 : byte = %11010100;
angka_5 : byte = %11100110;
angka_6 : byte = %11100111;
angka_7 : byte = %00110100;
angka_8 : byte = %11110111;
angka_9 : byte = %11110110;
angka_spc : byte = %00000000;
grs : byte = %10000000;
volt : byte = %01010111;
// contant 7segment }
// contant 7segment
const
angka_0 : byte = 0x40;
angka_1 : byte = 0XF9;
angka_2 : byte = 0X24;
angka_3 : byte = 0X30;
angka_4 : byte = 0X19;
angka_5 : byte = 0X12;
angka_6 : byte = 0X03;
angka_7 : byte = 0X78;
angka_8 : byte = 0X00;
angka_9 : byte = 0X10;
angka_spc : byte = 0xFF;
grs : byte = %10111111;
volt : byte = %01000001;
// contant 7segment
var
//######JAM###############
ds : sbit at PORTD2_bit;
st : sbit at PORTD3_bit;
sh : sbit at PORTD4_bit;
var
dat_7 : byte;
dat_segA : sbit at dat_7.0;
dat_segB : sbit at dat_7.1;
dat_segC : sbit at dat_7.2;
dat_segD : sbit at dat_7.3;
dat_segE : sbit at dat_7.4;
dat_segF : sbit at dat_7.5;
dat_segG : sbit at dat_7.6;
dat_segH : sbit at dat_7.7;
var
dly : byte; external;
jadwal : string[24]; data; external;
jadwalku : string[24]; data; external;
procedure dis_nilai (var text: string[10]; segment: byte;);
implementation
//-------------------- convert 7segment
function ubah (temp :byte): byte ;
begin
if temp = 48 then result := angka_0;
if temp = 49 then result := angka_1;
if temp = 50 then result := angka_2;
if temp = 51 then result := angka_3;
if temp = 52 then result := angka_4;
if temp = 53 then result := angka_5;
if temp = 54 then result := angka_6;
if temp = 55 then result := angka_7;
if temp = 56 then result := angka_8;
if temp = 57 then result := angka_9;
if temp = 32 then result := angka_spc;
if temp = 45 then result := grs;
if temp = 86 then result := volt;
end;
//-------------------- convert 7segment
procedure dis_nilai(var text: string[10]; segment: byte;);
var
i,j : byte;
begin
for j := 1 to segment do
begin
dat_7 := text[segment - j];
dat_7 := ubah(dat_7);
for i := 1 to 8 do
begin
if i = 1 then ds := dat_segH;
if i = 2 then ds := dat_segG;
if i = 3 then ds := dat_segF;
if i = 4 then ds := dat_segE;
if i = 5 then ds := dat_segD;
if i = 6 then ds := dat_segC;
if i = 7 then ds := dat_segB;
if i = 8 then ds := dat_segA;
sh := true;
delay_ms (5);
sh := false;
end;
end;
st := true;
delay_ms (5);
st := false;
end;
end.
Library tambahan :
unit tambahan;
var
ulv : byte; external;
llv : byte; external;
cal_zero : word; external;
cal_range : word; external;
function sarat(dat_ : real) :real;
implementation
function sarat(dat_ : real) :real;
begin
if dat_ < cal_zero then result := cal_zero;
if dat_ > cal_range then result := cal_range;
if (dat_ >= cal_zero) and (dat_ <= cal_range) then result := dat_;
end;
end.
No comments:
Post a Comment