Thursday, December 3, 2015

Modul display 0 - 100% input 4-20ma

Modul display 0 - 100% input 4-20ma


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