ANALOG-TO-DIGITAL CONVERTER (1)

สำหรับ A/D ใน chip แบบ 28 pins จะมี 5 inputs แบบ 40 pins จะมี 8 inputs register ที่เกี่ยวข้อง จะมีอยู่ 4 ตัวด้วยกันคือ

ADRESH คือ ค่า register ผลลัพธ์ byte สูง ของการแปลงสัญญาณ

ADRESL คือ ค่า register ผลลัพธ์ byte ต่ำ ของการแปลงสัญญาณ

ADCON0 คือ register ควบคุมเกี่ยวกับ A/D byte ที่ 1

ADCON1 คือ register ควบคุมเกี่ยวกับ A/D byte ที่ 2

จะขออธิบาย Register แต่ละตัวก่อนเพื่อสร้างความเข้าใจนะครับ

ADCON0

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

ADCS1

ADCS0

CHS2

CHS1

CHS0

GO/(DONE\)

-

ADON

Bit7-6: ADCS1:ADCS0: เป็น bit ที่ใช้เลือกสัญญาณนาฬิกาในการแปลง A/D

00 = Fosc/2 Fosc = ความถี่ของ crystal ที่ใช้

01 = Fosc/8

00 = Fosc/32

11 = FRC (เลือกใช้ความถี่จากวงจร RC ที่อยู่ภายใน)

 

Bit5-3: CHS2:CHS0 เป็น bit ที่ใช้เลือก channel ของสัญญาณ A/D

000 = channel 0, (RA0/AN0)

001 = channel 1, (RA0/AN1)

000 = channel 2, (RA0/AN2)

000 = channel 3, (RA0/AN3)

000 = channel 4, (RA0/AN4)

000 = channel 5, (RA0/AN5) (ไม่มีใน mcu แบบ 28 pins)

000 = channel 6, (RA0/AN6)

000 = channel 7, (RA0/AN7)

 

Bit 2: GO/(DONE\): เป็นบิตที่ใช้ในการแสดงสถานะของการแปลง A/D

ถ้า ADON bit ถูก set เป็น 1 แล้ว เมื่อบิตนี้เป็น

1 หมายถึง A/D กำลังอยู่ในช่วงการแปลงค่า ( ให้ set บิต นี้ในการเริ่มต้นการแปลงสัญญาณ)

0 หมายถึง A/D ไม่ได้อยู่ในช่วงการแปลงค่า ( บิตนี้จะ mcu จะ clear เป็น 0 โดยอัตโนมัติ เมื่อทำการแปลงสัญญาณเสร็จเรียบร้อยแล้ว

 

Bit 1: ยังไม่ถูกใช้งาน

Bit 0: ADON: A/D On bit (บอกสถานะของ A/D ในขณะนั้น)

1 = A/D convertor กำลังถูกใช้งาน

0 = A/D convertor ไม่ได้ถูกใช้งาน

ADCON1

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

ADFM

-

-

-

PCFG3

PCFG2

PCFG1

PCFG0

Bit 7: ADFM:

1 = หลังจากแปลงสัญญาณ ให้ด้านซ้ายของ ADRESH เป็น 0

ADRESH

ADRESL

000000xx

xxxxxxxx

0 = หลังจากแปลงสัญญาณให้ด้านขวาของ ADRESL เป็น 0

ADRESH

ADRESL

xxxxxxxx

xx000000

Bit 6-4: ไม่ได้ถูกใช้

Bit 3-0: PCFG3:PCFG0 เป็นตัว set คุณสมบัติต่างๆ ในการทำงาน A/D ให้กับ PIC โดยเราสามารถ เลือกว่าจะใช้ VREF แยกต่างหากหรือจะใช้จาก VDD,VSS เลยก็ได้ส่วนต้องการใช้ CHANNEL ไหน port ไหนก็ให้ดูที่ตารางกำหนด

PCFG3:PCFG0

AN7

RE2

AN6

RE1

AN5

RE0

AN4

RA5

AN3

RA3

AN2

RA2

AN1

RA1

AN0

RA0

VREF+

VREF-

CHAN/

REFS

0000

A

A

A

A

A

A

A

A

VDD

VSS

8/0

0001

A

A

A

A

VREF+

A

A

A

RA3

VSS

7/1

0010

D

D

D

A

A

A

A

A

VDD

VSS

5/0

0011

D

D

D

A

VREF+

A

A

A

RA3

VSS

4/1

0100

D

D

D

D

A

D

A

A

VDD

VSS

3/0

0101

D

D

D

D

VREF+

D

A

A

RA3

VSS

2/1

011x

D

D

D

D

D

D

D

D

VDD

VSS

0/0

1000

A

A

A

A

VREF+

VREF-

A

A

RA3

RA2

6/2

1001

D

D

A

A

A

A

A

A

VDD

VSS

6/0

1010

D

D

A

A

VREF+

A

A

A

RA3

VSS

5/1

1011

D

D

A

A

VREF+

VREF-

A

A

RA3

RA2

4/2

1100

D

D

D

A

VREF+

VREF-

A

A

RA3

RA2

3/2

1101

D

D

D

D

VREF+

VREF-

A

A

RA3

RA2

2/2

1110

D

D

D

D

D

D

D

A

VDD

VSS

1/0

1111

D

D

D

D

VREF+

VREF-

D

A

RA3

RA2

1/2

A หมายถึง Analog input

D หมายถึง Digital I/O

ส่วน An7-AN5 จะไม่มีในตระกูลที่เป็น 28 ขา

เมื่อการแปลง A/D เสร็จสิ้น ผลลัพธ์ของการแปลง A/D จะมีขนาด 10 bit ซึ่งจะเก็บอยู่ใน Register 2 ตัวต่อกันคือ ADRESH:ADRESL ส่วน register bit GO/DONE\ (ADCON0<2>) จะถูก cleared และ ADIF จะถูก set (A/D interrupt flag) Block diagram ของ A/D จะเป็นดังรูปข้างล่าง

 

 

ขั้นตอนการใช้งาน A/D module

  1. เลือก set config ของ A/D โดย

  2. ถ้าต้องการใช้ A/D interrupt ต้อง set flag ต่างๆ ดังนี้

  3. รอเวลาเพื่อให้ A/D module พร้อม ( acquisition time) หาได้จากการคำนวณ

  4. เริ่มทำการ A/D ด้วยการ set GO/DONE\ bit

  5. รอจนกว่าการแปลงA/D จะเสร็จสมบูรณ์ ซึ่งดูได้ 2 วิธี

  1. อ่านค่าผลลัพธ์ของ A/D จาก ADRESH:ADRESL โดย clear ADIF bit หลังจาก การอ่านด้วยถ้าใช้ A/D interrupt

  2. หลังจากอ่านค่าเรียบร้อยแล้ว ต้องรอเป็นระยะเวลา 2TAD (มีอยู่ใน data sheet) ก่อนที่จะทำการแปลง A/D อีกครั้งหนึ่ง

 

การเลือก A/D Conversion Clock

เวลาที่ใช้ในการ แปลง A/D หนึ่งครั้งเรากำหนดให้เป็น TAD ในหนึ่งครั้งของการแปลง A/D PIC ต้องการอย่างน้อย 12TAD ต่อการแปลงแบบ 10 bits ในการเลือกสัญญาณความถี่ของ A/D สามารถเลือกได้ 4 แบบคือ

ซึ่งค่าเหล่านี้เราเลือกได้จากการ set ค่า register (ADCS1:ADCS0)

เฮ้ออ เหนื่อย เป็นอันจบการอธิบาย register ที่จำเป็นที่ต้องรู้ในการใช้ A/D ภายใน 16F87X นะครับ ตอนหน้าก็เป็นเรื่องการเขียน code ล้วนๆ ครับ

 

 

BACK