Issuu on Google+

 

 

    โมดูลเข็มทิศอิเล็กทรอนิกส CMPS03 เปนผลงานของ Devantech (www.radioelectronics. co.uk) ออกแบบมาเพือช ่ วยในการกําหนดทิศทางเคลื่อนที่ของหุนยนต  อัตโนมัติ และนํามาใชในการ สรางเครื่องมือวัดและตรวจสอบทิศระบบอิเล็กทรอนิกส โดยหัวใจสําคัญของโมดูล CMPS03 คือ ตัวตรวจจับสนามแมเหล็กเบอร KMZ51 ของ Philips จํานวน 2 ตัว เพื่อใหมีความไวเพียงพอในการ ตรวจจับสนามแมเหล็กโลก (Earth magnetic field) และไมโครคอนโทรลเลอรเพือรั ่ บสัญญาณจากตัว ตรวจจับมาประมวลผลเปนขอมูลดิจิตอลและสัญญาณพัลสสําหรับแจงผลการวัดทิศทาง

17.1 คุณสมบัติของโมดูลเข็มทิศอิเล็กทรอนิกส CMPS03  ใชไฟเลี้ยง +5V ตองการกระแสไฟฟา 20mA  ใชตัวตรวจจับสนามแมเหล็กเบอร KMZ51 ของ Philips จํานวน 2 ตัว  ความละเอียดของมุม 0.1 องศา  คาความผิดพลาด 3-4 องศา โดยประมาณ หลังจากการปรับแตง  เอาตพุตสัญญาณพัลส ความกวาง 1 ถึง 37 มิลลิวินาที โดยมีอัตราเพิ่มครังละ ้ 0.1 มิลลิวินาที

เอาตพุตขอมูลดิจิตอลผานการติดตอระบบบัส I2C รองรับสัญญาณนาฬิกาความถี่สูงถึง 1MHz โดยใหขอมูล 2 รูปแบบคือ 0 ถึง 255 และ 0 ถึง 3599 

 ขนาดเล็กเพียง 32 x 35 มิลลิเมตร  สื่อสารกับไมโครคอนโทรลเลอรยอดนิยมไดทุกตระกูล อาทิ เบสิกแสตมป 2SX/2P, PIC,

MCS-51, PSoC, 68HC11 ทั้งผานระบบบัส I2C และดวยการวัดสัญญาณพัลส


  

17.2 ตําแหนงขาและการตอใชงานโมดูลเข็มทิศอิเล็กทรอนิกส CMPS03 ในรูปที่ 17-1 แสดงรูปรางหนาตาและการจัดขาของ CMPS03 โมดูลเข็มทิศอิเล็กทรอนิกส จะเห็นวา เปนแผงวงจรทีมี่ คอนเน็กเตอรตอออกมาเพือให ่ เชือมต ่ อไปใชงาน อยางไรก็ตามเพืออํ ่ านวย ความสะดวกแกผูใช  งานกับบอรดทดลองของบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด (i-nex : เปนตัว แทนจําหนายสินคาของ Devantech ในประเทศไทยอยางเปนทางการ) จึงไดพัฒนาบอรดอะแด ปเตอรรุน ADX-CMPS03 เพื่อใหนําโมดูล CMPS03 มาติดตัง้ (โดยบอรด ADX-CMPS03 ตองจัดซื้อ แยก) บนบอรด ADX-CMPS03 ไดจัดเตรียมคอนเน็กเตอร PCB 3 ขาตัวผูสําหรับเชือมต ่ อกับบอรด ควบคุมหุนยนต  และคอนเน็กเตอร IDC ตัวเมียแถวเดียว ่ 4 ขาสําหรับเสียบสายตอวงจรเบอร AWG#22 เพือต ่ อกับแผงตอวงจรหรือเบรดบอรด นอกจากนันยั ้ งมีสวิตชกดสําหรับปรับตังค ้ า (calibration) เพือ่ กําหนดตําแหนงทิศอางอิง โดยวงจรของบอรด ADX-CMPS03 แสดงในรูปที่ 17-2

17.3. การอานคาสัญญาณเอาตพุตของโมดูล CMPS03 17.3.1 การอานคาทิศทางจากเอาตพุตสัญญาณพัลส การอานคาสัญญาณในโหมดนี้ เปนการนําคาความกวางพัลสที่ไดจากเอาตพุตสัญญาณพัลส ของโมดูล CMPS03 มาระบุตําแหนงองศา จาก 0 ถึง 359.9 องศา โดยมียานของคาความกวางสัญญาณ ตัวตรวจจับสนามแมเหล็ก KMZ51 ไมโครคอนโทรลเลอรหลักสําหรับประมวลผล กราวด ไมตอใชงาน ความถี่ 50/60Hz ปรับตังค ้ าการวัด ไมตอใชงาน เอาตพุตแบบสัญญาณพัลส SDA สําหรับเชือมต ่ อผานระบบบัส I2C SCL สําหรับเชือมต ่ อผานระบบบัส I2C +5V ดานหนาของโมดูล CMPS03

รูปที่ 17-1 แสดงรูปรางและตําแหนงขาสําหรับการตอใชงานของโมดูลเข็มทิศอิเล็กทรอนิกส CMPS03


 

33.0mm 28.6mm

ADX-CMPS03

R1 4.7k

R2 4.7k

K1 SCL

S1 CAL

K4 I2C BUS

+5V

GND SCL SDA +5V

K3 PWM

31.5mm 26.7mm

>31.5mm

K2 SDA

front +5V SCL SDA CMPS-03 PWM Digital Compass NC CAL 50/60Hz NC GND

PWM

GND

>33.0mm

คอนเน็กเตอรตัวเมีย สําหรับติดตั้งโมดูล CMPS03

คอนเน็กเตอร PCB ของ สัญญาณระบบบัส I2C

จุดตอสัญญาณของระบบบัส I2C สําหรับเสียบสายตอวงจรเพื่อใชกับบอรดทดลองหรือ แผงตอวงจร (เบรดบอรด) สวิตชกดติดปลอยดับสําหรับปรับแตงเพือหาตํ ่ าแหนง อางอิง (calibration) คอนเน็กเตอร PCB ของเอาตพุตสัญญาณพัลส

รูปที่ 17-2 แสดงวงจรของบอรด ADX-CMPS03 และการเชือมต ่ อกับโมดูล CMPS03 พัลสจาก 1 มิลลิวินาทีไปจนถึง 36.99 มิลลิวินาที มีความละเอียด 0.1 มิลลิวินาทีตอองศา ในสัญญาณ พัลสแตละไซเกิล มีชวงลอจิก “0” กวาง 65 มิลลิวินาที ดังนั้นในการนําสัญญาณพัลสมาประมวลผลเปนคามุม จึงตองใชการนับความกวางของ สัญญาณพัลสเปนหลักในการคํานวณหาคามุมที่โมดูล CMPS03 วัดได

17.3.2 การอานคาทิศทางเปนขอมูลดิจิตอลผานระบบบัส I2C การอานคาจากโมดูล CMPS03 ใหไดคาทีมี่ ความแมนยําสูงควรเลือกเอาตพุตขอมูลดิจิตอลผาน ระบบบัส I2C โดยโมดูล CMPS03 สามารถสงขอมูลของตําแหนงออกมาที่ความละเอียดสูงสุด 0.1 องศาโดยไมจําเปนตองมีการคํานวณหรือแปลงคาใด ๆ อีก


  

Start Bit

Start Bit

แอดเดรสสําหรับสงคาขอมูลไปยัง CMPS03 = $CO 1

1

0

0

0

0

0

A7

A6

A5

A4

A3

A2

A1

1

2

3

4

5

6

7

0 R/W ACK

8

Start bit

ขอมูลตําแหนงรีจสิ เตอรที่ตองการอานคา

9

แอดเดรสสําหรับอานคาขอมูลจาก CMPS03 = $C1

D7 D6 D5 D4 D3 D2 D1 D0 ACK 1

2

3

4

5

6

7

8

9

Stop bit

ขอมูล 8 บิตที่อานไดจาก CMPS03

1

1

0

0

0

0

0

1

A7

A6

A5

A4

A3

A2

A1

R/W

ACK

1

2

3

4

5

6

7

8

9

D7 D6 D5 D4 D3 D2 D1 D0 ACK 1

2

3

4

5

6

7

8

9

รูปที่ 17-3 แสดงไดอะแกรมเวลาของการติดตอสือสารกั ่ บโมดูล CMPS03 ผานระบบบัส I2C ตําแหนงรีจิสเตอร รายละเอียด 0 ตัวเลขแสดงรุนของบอรด CMP03 1 สงคาตําแหนงแบบหยาบ (0 ถึง 255) สงคาตําแหนงแบบละเอียดดวยตัวเลข 16 บิต (0 ถึง 3599) 2,3 สามารถแปลงคาเพื่อแสดงองศา 0 ถึง 359.9 องศาไดโดยตรง สําหรับตรวจสอบคาภายใน โดยจะแสดงคาความตางของ 4,5 Sensor1 เปนตัวเลข 16 บิตแบบคิดเครื่องหมาย สําหรับตรวจสอบคาภายใน โดยจะแสดงคาความตางของ 6,7 Sensor2 เปนตัวเลข 16 บิตแบบคิดเครื่องหมาย แสดงคาตัวเลขการปรับแตงภายใน (calibration value1) 8,9 เปนตัวเลข 16 บิตแบบคิดเครื่องหมาย แสดงคาตัวเลขการปรับแตงภายใน (calibration value2) 10,11 เปนตัวเลข 16 บิตแบบคิดเครื่องหมาย 12,13 ไมใชงานอานคาไดเปน 0 14 ไมใชงาน ไมไดกําหนดคาไว คําสั่งสําหรับการปรับแตงคา โดยเมื่อตองการปรับแตงคา 15 ตองเขียนขอมูล 255 เขาที่รีจิสเตอรตําแหนงนี้

ตารางที่ 17-1 แสดงตําแหนงรีจิสเตอรภายในโมดูล CMPS03


 

17.3.2.1 รูปแบบการสื่อสารขอมูลบัส I2C บัส I2C เชื่อมตอกับไมโครคอนโทรลเลอรโดยใชสายสัญญาณ 2 เสนไดแกขา SDA (รับและ สงขอมูล) และ SCL (ขาสัญญาณนาฬิกา) โดยขาสัญญาณทั้งสองจะตองตอตัวตานทานพูลอัปตอไว เพื่อกําหนดสถานะลอจิก “1” ใหกับระบบบัส

17.3.2.2 ลําดับขันการติ ้ ดตอ คาแอดเดรสของโมดูล CMPS03 คือ 0xC0 สําหรับการสงขอมูล และ 0xC1 สําหรับการอาน คาขอมูล โดยขันตอนการติ ้ ดตอกับโมดูล CMPS03 เพื่ออานขอมูลมีดังนี้ (1) สงบิตเริ่มตนหรือ Start bit เพื่อแจงใหระบบบัส I2C เตรียมพรอมรับขอมูล (2) สงคาแอดเดรส 0xC0 เพือระบุ ่ วาตองการเขียนขอมูลไปยังกับโมดูล CMPS03 (3) สงคาตําแหนงรีจิสเตอรภายในโมดูล CMPS03 ที่ตองการอานคา ซึ่งมีรายละเอียด แสดงในตารางที่ 17-1 (4) สงคาแอดเดรส 0xC1 เพื่อระบุวาตองการอานคาขอมูลจากโมดูล CMPS03 (5) อานคาขอมูลจากโมดูล CMPS03 มาเก็บไวในหนวยความจํา (6) สงบิตหยุดเพือหยุ ่ ดการสือสารข ่ อมูล และกําหนดใหบัสอยูในสภาวะบั  สวาง

17.3.2.3 การปรับแตงคาของโมดูล CMPS03 ผานทางระบบบัส I2C การปรับแต���คาทําไดโดยการสงคา 0xFF ไปยังรีจิสเตอร 15 ของโมดูล CMPS03 โดยจะตองสง คา 4 ครังและระบุ ้ ทิศทางหลักๆ 4 ทิศทางเชนเดียวกับการกําหนดคาดวยสวิตชโดยตรง มีขันตอนดั ้ งนี้ (1) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศเหนือ จากนั้น เขียนคา 255 (0xFF) ไปยังรีจิสเตอร 15 (2) วางโมดูล CMPS03 ขนานกับพืน้ หันดานหนาของโมดูลไปทางทิศตะวันออก เขียน คา 255 (0xFF) ไปยังรีจิสเตอร 15 (3) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศใต กดสวิตช เขียนคา 255 (0xFF) ไปยังรีจิสเตอร 15 (4) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศตะวันตก กด สวิตช เขียนคา 255 (0xFF) ไปยังรีจิสเตอร 15 หลังจากปรับแตงคาแลวคาทีปรั ่ บแตงจะเก็บไวที่หนวยความจําอีอีพรอม ดังนั้นแมไมจายไฟ ใหกับตัวบอรด ขอมูลทีปรั ่ บแตงแลว จะยังคงอยูตอไป


  

     ในการทดลองนีเป ้ นการเขียนโปรแกรมภาษา C ควบคุมไมโครคอนโทรลเลอร P89V51RD2 เพื่อติดตอ กับโมดูลเข็มทิศอิเล็กทรอนิกส CMPS-03 ในการสรางระบบทิศทางอางอิง 25.1 เริ่ มด วยการปรับแตงทิศทางใหแกโมดูลเข็มทิศอิเล็กทรอนิกส CMPS03 เพื่อใหการวัดทิศทางของโมดูล CMPS03 มีความแมนยํามากที่สุด การปรับแตงมีขั้นตอนดังนี้ (25.1.1) ติดตั้งโมดูล CMPS03 ลงบนบอรดเชือมต ่ อ ADX-CMPS03 (25.1.2) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศเหนือ กดสวิตช 1 ครั้ง (25.1.3) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศตะวันออก กดสวิตช (25.1.4) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศใต กดสวิตช 1 ครั้ง (25.1.5) วางโมดูล CMPS03 ขนานกับพื้น หันดานหนาของโมดูลไปทางทิศตะวันตก กดสวิตช 1 ครั้ง +5V 31 C2 1/50V

2

40

5

RESET 9 R1 10k

+5V

C1 0.1/50

6 4

16

RST

P3.6 17 P3.7

IC1 P89V51RD2 P0.7

+5V

C5 0.1/ 50V

R2 10k x8

32

R/W

3 DSP1 LCD 16x2

E RS D7 D6 D5 D4 D3 D2 D1 D0 14 13 12 11 10 9 8 7

VR1 10k

1

33 P0.6 34 P0.5 35 P0.4 36 P0.3 37 P0.2 38 P0.1 39 P0.0

+5V

R3 4k7 1 P1.0 2 P1.1

R4 4k7

+5V SDA SCL

MOD1 CMPS03 GND

20 18 C3 33pF

19 C4 33pF

XTAL1 11.0592MHz

รูปที่L25-1 วงจรทดลองติดตอไมโครคอนโทรลเลอร P89V51RD2 กับ CMPS03 โมดูลเข็มทิศอิเล็กทรอนิกส


 

/*——————————————————————————————————————————————————————————————————————————*/ // Program : CMPS-03 Demo program // Description : Read angle by CMPS-03 sensor // Filename : l2501.c // C compiler : RIDE 51 V6.4.35 /*——————————————————————————————————————————————————————————————————————————*/ #include <REGLV51RD2.h> // Header file register for P89V51RD2BN #include <i2cV51.h> // Module function of i2c bus #include <lcdV51.h> // Module function of LCD display #define COMPASS_ID 0xC0 // Macro for CMPS03 addressing /*********************** Function for read angle for CMPS-03 *****************/ int read_angle() { unsigned int datah=0; // Variable for storing high byte unsigned int datal=0; // Variable for storing low byte i2c_start(); i2c_write(COMPASS_ID); i2c_write(0x02);

// I2C start condition // I2C send CMPS03 ID // I2C send command to read data from CMPS03

i2c_start(); i2c_write(COMPASS_ID+1); datah=i2c_read(); i2c_ACK(); datal=i2c_read(); i2c_NACK(); i2c_stop(); datah = (datah<<8)+(datal); return(datah/10);

// // // // // // // // //

I2C start condition I2C send CMPS03 ID in Read mode Read data high byte store to datah I2C acknowlage Read data low byte store to datal I2C acknowledge I2C stop condition Keep total value to datah Return value

} /*********************** Main loop *******************************************/ void main() { unsigned int value,old_value; // Variable for storing angle lcd_init(); // Initial LCD lcd_puts(0x80,”CMPS-03 Demo... “); // Display title message of CMPS03 program lcd_puts(0xC0,”Angle: “); // Display located angle value while(1) // Infinite loop { value = read_angle(); // Read angle from CMPS03 if(value != old_value) // Compare new and previous value to update display { lcd_puts(0xC7,” “); // Clear previous value inttolcd(0xC7,value); // Update new value delay(100); // Delay for displaying } old_value = value; // Keep previous value for comparison next time } }

โปรแกรมที่ P25-1 โปรแกรมภาษา C สําหรับทดลองติดตอไมโครคอนโทรลเลอร P89V51RD2 กับ CMPS03 โมดูลเข็มทิศอิเล็กทรอนิกส (มีตอ)


  

คําอธิบายโปรแกรม การทํางานของโปรแกรมนีติ้ ดตอกับโมดูล CMPS03 ผานการสื่อสารขอมูลอนุกรมแบบบัส I2C ดังนั้น จึงไดทําการผนวกไฟลไลบรารี i2cV51.h ซึงทํ ่ าหนาทีสร ่ างสภาวะเงื่อนไขตางๆ ตามขอกําหนดของบัส I2C บัส ซึงได ่ นําเสนอในการทดลองกอนหนานีแล ้ ว ภายในโปรแกรมหลั กเป นการวนอ านค ามุ มมาแสดงผลที่โมดู ล LCD อยูตลอดเวลาภายใต while(1){} ทีเป ่ นจริงตลอด ในการแสดงผลนันจะเปรี ้ ยบเทียบขอมูลเดิมและคาใหมทีอ่ านได ถามีการ เปลี่ยนแปลงจึงนําคาใหมไปแสดงผล ฟงกชั่น read_angle ใชในการอานคามุมที่ไดจากโมดูล CMPS03 ผานทางระบบบัส I2C โดยเริมต ่ น การติ ดต อแลวตามด วยการสงแอดเดรสประจําตัวของโมดูล CMPS03 ซึ่งก็คือ 0xC0 นิยามดวยมาโคร COMPASS_ID ดังนี้

#define COMPASS_ID 0xC0

แลวตามดวยขอมูลคําสั่ง 0x02 เพื่อแจงใหโมดูล CMPS03 สงคามุมเปนชวงขอมูล 0 ถึง 3599 ซึงตรงกั ่ บคา มุมตั้งแต 0 ถึง 359.9 องศา โดยขอมูลจะถูกสงกลับมา 2 ไบตตอเนื่องโดยเริ่มจากไบตสูงแลวตามดวยไบต ลาง หลังจากอานขอมูลเขามา 2 ไบตแลว จะนําไปหารดวย 10 จึงไดผลลัพธสุทธิทีคื่ นคาจากฟงกชัน่

โปรแกรมที่ P25-1 โปรแกรมภาษา C สําหรับทดลองติดตอไมโครคอนโทรลเลอร P89V51RD2 กับ CMPS03 โมดูลเข็มทิศอิเล็กทรอนิกส (จบ) 25.2 ตอวงจรตามรูปที่ L25-1 25.3 เขียนโปรแกรมที่ P25-1 แลวทําการแปลงใหเปนไฟล .hex ดวย RC51 ผานกระบวนการสรางไฟลโปรเจ็กต ของ Rkit-51 โดยใช RIDE ไดไฟล l2501.hex ดาวนโหลดลงในไมโครคอนโทรลเลอร P89V51RD2 โดยตองลบ ขอมูลกอนโปรแกรมลงไปใหม 25.4 จายไฟใหแกวงจร หมุนโมดูล CMPS-03 โดยใหระนาบของแผงวงจรขนานกับพื้น โดยหมุนใหครบ 1 รอบ สังเกตผลทีโมดู ่ ล LCD ทีโมดู ่ ล LCD แสดงผลดังนี้

CMPS-03 Demo... Angle: xxx โดยถาการทํางานถูกตองคาทีแสดงจะมี ่ คาตั้งแต 0 ถึง 359 องศา ภายใน 1 รอบ


V51-CMPS03