Seperti yang telah dijelaskan pada artikel terdahulu mengenai pemilihan sensor posisi dan mengenai sensor posisi AS5311 dari Austrian Microsystem (AMS), sensor posisi AS5311 merupakan sensor posisi yang paling menjanjikan untuk digunakan pada proyek ini. Selain harganya relatif murah dibanding sensor posisi sejenis (i.e. LVDT, Capacitive Sensor), penggunaannya sangat mudah.
Pada artikel sebelumnya, rel CNC yang akan digunakan sebagai rel kamera mampu mencapai resolusi pergerakan linear sebesar 1,25um untuk setiap step motor. Untuk memanfaatkan hal ini, diperlukan sensor posisi yang memiliki resolusi lebih kecil dibanding resolusi pergerakan linear rel tersebut. Sensor posisi AS5311 ini memiliki resolusi sebesar 488nm (hampir setengah resolusi minimum pergerakan rel). Hal ini tentu sangat menjanjikan.
Sebagai tahap awal prototyping, saya menggunakan Arduino Uno (ATmega328) dan AS5311-AB (Adapter Board). Apabila prototyping memuaskan, maka desain PCB akan dilakukan dengan menyesuaikan dimensi sistem yang ada. Berikut ini adalah AS5311-AB yang digunakan.
AS5311 Adapter Board
Sebelum melangkah lebih jauh, mari kita lihat bagaimana indahnya AS5311 ini.
AS5311 Block Diagram
Seperti yang terlihat pada diagram blok, AS5311 memiliki sensor magnet hall effect yang terintegrasi di dalamnya dengan Digital Signal Processing yang juga terintegrasi di dalamnya. AS5311 memiliki tiga buah interface yang dapat digunakan yaitu PWM (Pulse-Width Modulation) Interface, Absolute Interface berupa Synchronous Serial Interface, dan Incremental Interface berupa counter.
AS5311 Timing Diagram untuk PWM (Pulse Width Modulation) Interface
AS5311 Timing Diagram untuk Incremental Output Interface
Pada kesempatan ini, kita akan menggunakan Synchronous Serial Interface yang kemudian dihubungkan ke interface SPI (Serial Peripheral Interface) pada ATmega di Arduino. SPI merupakan interface yang paling mudah digunakan pada AS5311. Pembacaan sinyal PWM akan lebih sulit dilakukan sedangkan pembacaan incremental output memerlukan counter khusus yang juga akan lebih rumit dilakukan. Timing diagram untuk interface SPI adalah sebagai berikut. Kemampuan kecepatan SPI AS5311 ini adalah 1 MHz.
1. Mode 0
2. Mode 1
Perbedaan Mode 0 dan Mode 1 adalah dari data yang dikirimkan.
Mode 0
D11…D0 : Nilai posisi absolut (0…4095) sensor AS5311 terhadap sepasang pole magnet (2 mm).
OCF : Offset Compensation Finished. D11…D0 valid apabila OCF bernilai 1.
COF: CORDIC Overflow. D11…D0 akan invalid apabila COF bernilai 1.
LIN: Linearity Indicator. LIN bernilai HIGH menandakan ada masalah pada posisi magnet yang menyebabkan pembacaan berpotensi tidak linear. D11…D0 kemungkinan invalid.
MagINC: Magnetic Increase, mendeteksi perubahan medan magnet yang mendekat ke sensor.
MagDEC: Magnetic Decrease, mendeteksi perubahan medan magnet yang menjauh dari sensor.
EvenPAR: Even Parity, untuk melakukan error detection pada transmisi.
Mode 1
M11…M0 : Nilai kekuatan absolut (0…4095) medan magnet terhadap sensor. Nilai 0 atau dekat dengan 0 menandakan magnet tidak tersedia. Hanya M11…M4 yang digunakan.
OCF : Offset Compensation Finished. M11…M0 valid apabila OCF bernilai 1.
COF: CORDIC Overflow. D11…D0 akan invalid apabila COF bernilai 1.
LIN: Linearity Indicator. LIN bernilai HIGH menandakan ada masalah pada posisi magnet yang menyebabkan pembacaan berpotensi tidak linear. M11…M0 kemungkinan invalid.
MagINC: Magnetic Increase, mendeteksi perubahan medan magnet yang mendekat ke sensor.
MagDEC: Magnetic Decrease, mendeteksi perubahan medan magnet yang menjauh dari sensor.
EvenPAR: Even Parity, untuk melakukan error detection pada transmisi.
Untuk mengubah Mode transmisi dilakukan hal berikut.
Untuk Mode 0, Clock pada SCK harus bernilai HIGH saat CSn (Enable) berubah dari HIGH ke LOW.
Untuk Mode 1, Clock pada SCK harus bernilai LOW saat CSn (Enable) berubah dari LOW ke HIGH.
Data hanya valid bila memenuhi kondisi berikut ini.![]()
Informasi yang tergantung pada M11…M4 dapat dikombinasikan dengan informasi yang terdapat pada MagINC dan MagDEC untuk mengukur kekuatan medan magnet.
Sekarang saatnya kita melakukan interfacing AS5311 dengan ATMega. Setelah beberapa percobaan, diperoleh timing diagram pengiriman data SPI yang tidak terambil sempurna. Setiap siklus pembacaan data dari SPI diperlukan pembacaan 3 byte data. Struktur pembacaan ketiga byte data tersebut diberikan sebagai berikut. (X = Data Sampah / Junk data)
Byte-0 : X – D11 – D10 – D9 – D8 – D7 – D6 – D5 atau X – M11 – M10 – M9 – M8 – M7 – M6 – M5
Byte-1 : D4 – D3 – D2 – D1 – D0 – OCF – COF – LIN atau M4 – M3 – M2 – M1 – M0 – OCF – COF – LIN
Byte-2 : MagINC – MagDEC – EvenPAR – X – X – X – X – X
Clock SPI harus diset maksimum 1 MHz. Sedangkan mode data pada SPI adalah MSB First. Selain itu, Clock Polarity dan Clock Edge diatur sebagai berikut.
Untuk Data Mode 0 : SPI MODE 3 (CPOL=1, CPHA = 1)
Untuk Data Mode 1 : SPI MODE 1 (CPOL=0, CPHA = 1)
Berikut ini adalah kode Arduino untuk pembacaan AS5311
#include <SPI.h>
#define MOSI 11 // MOSI
#define MISO 12 // MISO
#define SCK 13 //SCK
#define SS 10 // SSint SPI_FirstByte;
int SPI_SecondByte;
int SPI_ThirdByte;
int POSITION_LOW;
int POSITION_HIGH;
int POSITION;
int MAGNITUDE_LOW;
int MAGNITUDE_HIGH;
int MAGNITUDE;
int OCF;
int COF;
int LIN;
int MagINC;
int MagDEC;
int EvenPAR;void setup()
{
Serial.begin(9600);
pinMode(SS, OUTPUT);
digitalWrite(SS,HIGH);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE2);
SPI.setClockDivider(SPI_CLOCK_DIV16);
}
void loop()
{
// Acquiring Mode 0
SPI.setDataMode(SPI_MODE3);
digitalWrite(SS,LOW);
SPI_FirstByte=SPI.transfer(0xEF);
SPI_SecondByte=SPI.transfer(0xFE);
SPI_ThirdByte=SPI.transfer(0xFF);
digitalWrite(SS,HIGH);
POSITION_HIGH = SPI_FirstByte;
POSITION_LOW = (SPI_SecondByte>>3)&(0x1F);
POSITION = (POSITION_HIGH<<5) | POSITION_LOW;
OCF = (SPI_SecondByte & 0x04) >> 2;
COF = (SPI_SecondByte & 0x02) >> 1;
LIN = (SPI_SecondByte & 0x01);
MagINC = (SPI_ThirdByte & 0x80) >>7;
MagDEC = (SPI_ThirdByte & 0x40) >>6;
EvenPAR = (SPI_ThirdByte & 0x20) >>5;
Serial.print(“Position: “);
Serial.println(POSITION,DEC);
Serial.print(“OCF: “);
Serial.println(OCF,BIN);
Serial.print(“COF: “);
Serial.println(COF,BIN);
Serial.print(“LIN: “);
Serial.println(LIN,BIN);
Serial.print(“MagINC: “);
Serial.println(MagINC,BIN);
Serial.print(“MagDEC: “);
Serial.println(MagDEC,BIN);
Serial.print(“EvenPAR: “);
Serial.println(EvenPAR,BIN);
// Acquiring Mode 1
SPI.setDataMode(SPI_MODE0);
digitalWrite(SS,LOW);
SPI_FirstByte=SPI.transfer(0xEF);
SPI_SecondByte=SPI.transfer(0xFE);
SPI_ThirdByte=SPI.transfer(0xFF);
digitalWrite(SS,HIGH);
MAGNITUDE_HIGH = SPI_FirstByte;
MAGNITUDE_LOW = (SPI_SecondByte>>3)&(0x1F);
MAGNITUDE = ((MAGNITUDE_HIGH<<5) | MAGNITUDE_LOW)>>4;
OCF = (SPI_SecondByte & 0x04) >> 2;
COF = (SPI_SecondByte & 0x02) >> 1;
LIN = (SPI_SecondByte & 0x01);
MagINC = (SPI_ThirdByte & 0x80) >>7;
MagDEC = (SPI_ThirdByte & 0x40) >>6;
EvenPAR = (SPI_ThirdByte & 0x20) >>5;
Serial.print(“Magnitude: “);
Serial.println(MAGNITUDE,HEX);
Serial.print(“OCF: “);
Serial.println(OCF,BIN);
Serial.print(“COF: “);
Serial.println(COF,BIN);
Serial.print(“LIN: “);
Serial.println(LIN,BIN);
Serial.print(“MagINC: “);
Serial.println(MagINC,BIN);
Serial.print(“MagDEC: “);
Serial.println(MagDEC,BIN);
Serial.print(“EvenPAR: “);
Serial.println(EvenPAR,BIN);
Serial.print(“\n”);
delay(500);
}
Hasil pembacaan sensor tersebut sebagai berikut.
Sementara, pengamatan di osiloskop.
Dari pengamatan tersebut kita dapat menyimpulkan sensor bekerja dengan baik dan cukup stabil. Pembacaan valid ditunjukkan oleh bit-bit status OCF, COF, LIN, MAGInc, MAGDec, dan MAG yang baik dan sesuai dengan spesifikasi.
Recent Comments