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
การเลือก 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 ล้วนๆ ครับ