ตอนที่ 10 ANALOG-TO-DIGITAL CONVERTER (2)

ตอนนี้เราจะมากันถึงเรื่องการเขียน code เลยนะครับ ก่อนอื่นก็มาดูกันก่อนนะครับว่าวงจรผมต่อแบบไหน ดูได้จากวงจร ORCAD ข้างล่างเลยนะครับ อันนี้คร่าวๆ นะครับ

ผมจะใช้ตัวต้านทานแบบปรับค่าได้เป็นตัวปรับค่า Voltage ที่เข้าไปยังขา AtoD ซึ่งตอนนี้ผมจะใช้ AD0(channel 0) แต่ถ้าจะใช้งานจริงๆ อย่าใช้วิธีนี้นะครับ เพราะมันเป็นวิธีที่แย่เอามากๆ แต่นี่เป็นการทดลองพออนุโลมครับ ส่วนวงจรผมขอใช้ demo board ต้นแบบ แสดงให้ดูละกันนะครับ ( โปรโมตไปในตัว ฮิๆ)

  1. เป็นตัวต้านทานแบบปรับค่าได้ต่อตรงเข้ากับ A/D channel 1
  2. เป็น push button ที่ต่อกับ port B ของ PIC

คราวนี้เรามาอธิบาย code กับหน่อยนะครับ

;***** VARIABLE DEFINITIONS

AtoD_HI EQU 0x20 ; สร้าง register ชื่อ AtoD_HI กับ AtoD_LO สำหรับเก็บค่าที่เกิดจาก

AtoD_LO EQU 0x21 ; การแปลง AtoD

; Start at the reset vector

org 0x000

nop ; สำหรับ MBLAB-ICD ต้องมีบรรทัดนี้เสมอ

goto Start

org 0x20

Start:

bsf STATUS,RP0 ; เลือก Bank1

bcf STATUS,RP1

movlw B'10000111' ; ตั้งค่า Timer 0 ให้มี prescaler = 1:256

movwf OPTION_REG

movlw h'FF' ; ให้ PORTB เป็น input ทั้งหมด

movwf TRISB

clrf TRISC ; ให้ PORTC เป็น output ทั้งหมด

movlw B'00001110' ; ให้จัดเรียงบิตหลังจาก A/D เป็น Left justify คือ ADRESH:ADRESL

; (XXXXXXXX:XX000000), และเลือก AN0 เป็น analog channel เพียง port เดียว

movwf ADCON1 ;กำหนดให้ใช้ VDD and VSS เป็น references + และ - ตามลำดับ

bcf STATUS,RP0 ; Select Bank0

movlw B'01000001' ; เลือก A/D conversion clock = Fosc/8 แล้วทำการ enable A/D

movwf ADCON0

clrf PORTC ; CLEAR PORT C

Main:

btfss INTCON,T0IF ; รอจนกระทั่ง Timer0 เกิด time out

goto Main

bcf INTCON,T0IF

bsf ADCON0,GO ; เริ่มทำการ A/D conversion

Wait:

btfsc ADCON0,GO ; รอจนกระทั่งการแปลงเสร็จสมบูรณ์

goto Wait

movfw ADRESH ; เก็บค่าดังกล่าวไว้ที่ AtoD_HI,AtoD_LO

movwf AtoD_HI

bsf STATUS,RP0 ; Select BANK1

bcf STATUS,RP1

movfw ADRESL

bcf STATUS,RP0 ; Select BANK0

movwf AtoD_LO

movwf PORTC ; Write Low byte value to PORTC

WaitPush:

btfss PORTB,0 ; รอจนกระทั่งมีการกด push button

goto WaitPush

goto Main ; เมื่อมีการกด push button ให้ไปเริ่มต้นการแปลง A/D อีกครั้ง

end

ตอนนี้ก็มาลองทดลองกันดู โดยที่ผมสร้าง watch windows เพื่อดูค่า register ที่เปลี่ยนแปลง ของ ADRESH และ ADRESL ดังรูป

คราวนี้ผมจะลองปรับค่า voltage ต่างๆ ดู ลองปรับเป็น 3.62 Volt

ลองคำนวณดูเนื่องจากเป็น AtoD แบบ 10 bit โดยที่เราใหัค่าชิดซ้าย ดังนั้นค่าที่ได้ก็คือ 1011,1010,10 ได้ค่า ฐานสิบเป็น 746 เป็น a/d 10 บิตก็หารด้วย 1023 แล้วคูณด้วย 5 Volt เนื่องจากใช้ Vdd เป็น Vref (746/1023)*5 = 3.64 V นับว่าใกล้เคียง มี error นิดหน่อย อาจมาจากหลายสาเหตุ ก็นับว่า AtoD ขนาด 10 บิตของ PIC16F87X นี่ใช้ได้ค่อนข้างดีทีเดียวกับงานที่ไม่ต้องการความเร็วสูงมาก และไม่ต้องการความละเอียดสูง

Code สามารถ download ได้ที่ pic free source code ครับ

 

 

BACK