Minggu, 09 September 2018

Revisi Library Modul ADC MCP3424 pada Arduino

Late post, seharusnya sekitar bulan September 2017. 


Pada postingan kali ini Saya akan membahas mengenai library untuk modul ADC MCP3424. Library untuk Arduino ini awalnya Saya download dari https://github.com/battosai30/MCP3424. (Kalau tidak salah Saya download sekitar bulan Juli atau Agustus 2017)

Oiya sebelumnya perlu Saya infokan bahwa modul ADC MCP3424 ini merupakan IC untuk mengkonversi sinyal analog menjadi sinyal digital. IC ini memiliki resolusi 18 bits. Untuk berkomunikasi dengan mikrokontroler, IC ini menggunakan protokol I2C. IC ini juga sudah memiliki PGA (Programmable Gain Amplifier - sebesar 1x, 2x, 4x dan 8x) didalamnya, sehingga sinyal yang kecil bisa langsung dikuatkan dengan cara memprogram IC ini. Range kerja IC ini adalah -2,048 V sampai +2,048 V (setelah dikuatkan melalui PGA). Untuk lebih detil silahkan cek di datasheet MCP3424.

Cara mudah menggunakan IC ini adalah dengan mencari dan menggunakan library yang sudah tersedia (jika ada hehehe). Dan Alhamdulillah sudah ada yang membuat dan membagikan library tersebut. Library untuk Arduino ini awalnya Saya download dari https://github.com/battosai30/MCP3424. Saya download sekitar bulan juli 2017 kalo tidak salah.

Yang akan Saya share disini adalah adanya sedikit kesalahan pada saat pembacaan. Perbaikan ini juga sudah Saya sampaikan ke pembuat library awal (batto@hotmail.fr). Kira-kira begini ceritanya.hehe Mohon maaf jika bahasa inggrisnya kacau.


##the first problem dealed with negative number
in the previous version, the conversion (for example from 18 to 32 bits format)
is just by using adding ('or' logic) the magnitute value 0x xxxxxxxx xxxxxxxx with 10000000 00000000 00000000 00000000
this will give result 10000000 0000000x xxxxxxxx xxxxxxxx
the problem is 10000000 0000000x xxxxxxxx xxxxxxxx (32 bits format) is not the same number with 1x xxxxxxxx xxxxxxxx (18 bits format)
lets take an example if we have 11 11111111 11111110 (18 bits format) = -2 (decimal)
conversion --> 01 11111111 11111110 (magnitute only) + 10000000 00000000 00000000 00000000 = 10000000 00000001 11111111 11111110 (32 bits format) = -2147352578 (decimal)
and it is big different number (that the problem)

considering two's complement concept for negative number (it was mention in datasheet that negative number format deal with two's complement concept).
so the conversion should be done by using:
adding ('or' logic) the magnitute value 00000000 0000000x xxxxxxxx xxxxxxxx with 11111111 11111110 00000000 00000000
with the same example if we have 11 11111111 11111110 (18 bits format) = -2
conversion --> 01 11111111 11111110 (magnitute only) + 11111111 11111110 00000000 00000000 = 11111111 11111111 11111111 11111110 (32 bits format) = -2 (decimal)
and the problem solved.

considering datasheet again for 18 bits format, the data will take 3 bytes or 24 bits. and for negative number the data format is
1111111x xxxxxxxx xxxxxxxx (without extract the magnitute value) and we just need to add ('or' logic) with 11111111 00000000 00000000 00000000 (0xFF000000 in hex)
so the conversion will result 11111111 1111111x xxxxxxxx xxxxxxxx

considering datasheet again for 16, 14, 12 bits format, the data will take 2 bytes or 16 bits, so for negative conversion
we just need to add ('or' logic) with 11111111 11111111 00000000 00000000 (0xFFFF0000 in hex)


##the second problem dealed with positive magnitute extraction on 14 and 12 bits format
in previous version, for 14 bits:
_resultat = (((long)_buffer[0] & 0xBF) << 8) | ((long)_buffer[1] & 0xFF);
it should be:
_resultat = (((long)_buffer[0] & 0x1F) << 8) | ((long)_buffer[1] & 0xFF);    
//0x1F (0b00011111) because in 14 bits, the magnitute started from 13rd bit (or from 5th bit in first byte)


in previous version, for 12 bits:
_resultat = (((long)_buffer[0] & 0x0F) << 8) | ((long)_buffer[1] & 0xFF);
it should be:
_resultat = (((long)_buffer[0] & 0x07) << 8) | ((long)_buffer[1] & 0xFF);    
//0x07 (0b00000111) because in 12 bits, the magnitute started from 11st bit (or from 3rd bit in first byte)

Berikut adalah link untuk download Library MCP3424 Revisi


Sebagai catatan, pada saat Saya mencoba dengan simulasi proteus ISIS terdapat masalah pada range nilai negatif. Oiya ini hanya saat simulasi di proteus ISIS (mudah-mudahan saat ini sudah diperbaiki oleh Proteus ISIS)

##the third problem dealed with the range for negative number
after trial updated library in Proteus ISIS simulation, i found the problem again.
now is about the negative range, in datasheet i found the range should be -1 LSB to -VRef
but in simulation the range is inverted (from -VRef to -1 LSB)
so i use this formula (for 18 bits):
_resultat = (-1) - _resultat + (-131071) ;
the negative range should be -1 to -131072 for 18 bit
because there is bit for 0 (zero) number in bitween negative and positive number, i choose -131071 instead

for 16 bits:
_resultat = (-1) - _resultat + (-32767) ;
for 14 bits:
_resultat = (-1) - _resultat + (-8191) ;
for 12 bits:
_resultat = (-1) - _resultat + (-2047) ;

Berikut adalah link untuk download Library MCP3424 Revisi (untuk simulasi Proteus ISIS)


Screenshoot saat simulasi Proteus ISIS

Revised by: 
Muhammad Nurul Puji
to support Project-G

Tidak ada komentar:

Posting Komentar

Selamat berinovasi :D Salam berbagi..

Cara mengetahui ip address raspberry atau perangkat lain yg terhubung pada wifi yg sama

1. Install nmap [jika belum ada]: sudo apt install nmap 2. Cek ip address komputer (yg akses ke wifi yang sama): ip addr misal hasilnya 192....