ตอนที่ 10 ANALOG-TO-DIGITAL CONVERTER (2)
ตอนนี้เราจะมากันถึงเรื่องการเขียน code เลยนะครับ ก่อนอื่นก็มาดูกันก่อนนะครับว่าวงจรผมต่อแบบไหน ดูได้จากวงจร ORCAD ข้างล่างเลยนะครับ อันนี้คร่าวๆ นะครับ
ผมจะใช้ตัวต้านทานแบบปรับค่าได้เป็นตัวปรับค่า Voltage ที่เข้าไปยังขา AtoD ซึ่งตอนนี้ผมจะใช้ AD0(channel 0) แต่ถ้าจะใช้งานจริงๆ อย่าใช้วิธีนี้นะครับ เพราะมันเป็นวิธีที่แย่เอามากๆ แต่นี่เป็นการทดลองพออนุโลมครับ ส่วนวงจรผมขอใช้ demo board ต้นแบบ แสดงให้ดูละกันนะครับ ( โปรโมตไปในตัว ฮิๆ)
คราวนี้เรามาอธิบาย 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 ครับ