Lab12. การใช้งาน ADC (Analog to Digital Converter)


#include <p30f2010.h>    //เปิดใช้งานไลบรารี dspic30F2010 
#include<adc10.h>           //เปิดใช้งานไลบรารี A to D ขนาด 10 บิต           
#include<uart.h>                                //เปิดใช้งานไลบรารี uart เพื่อส่งข้อมูลแบบ RS-232
#include<stdio.h>              //เปิดใช้งานไลบรารีการแปลงข้อมูล
#include<stdlib.h>             //เปิดใช้งานไลบรารีการ stdlib.h

_FOSC(CSW_FSCM_OFF & XT_PLL4);      // โหมดการทำงาน แบบ XT คริสตอล 4 - 10 MHz มี PLLx4 คือ ทวีคูณความถี่ของ clock 4 เท่า
_FWDT(WDT_OFF);                                            //ปิดการทำงาน  watchdog Timer

#define Fcy                                                           7372800.0
#define BAUD_RATE                                          9600.0
#define BAUD_RATE_GEN                               (Fcy/(16*BAUD_RATE))-1;

void _ISR _U1TXInterrupt(void)        //ฟังก์ชัน ีuart1 TX interrupt
{
                _U1TXIF = 0;                        //Clear register uart1 TX เป็น 0
                }
void _ISR _U1RXInterrupt(void)        //ฟังก์ชัน ีuart1 RX interrupt
{
                _U1RXIF = 0;                        //ฟังก์ชัน ีuart1 RX interrupt
                }

void delay_ms(unsigned int ms){                    ////ฟังก์ชัน delay ms
                unsigned int i;
                for(; ms>0; ms--)
                for(i=0; i<728; i++)
                Nop();
}

void uart1_init()                    //ฟังก์ชันการทำงาน uart1
{              
                unsigned int ConfigU1MODE,ConfigU1STA,BaudRate;                           
                CloseUART1();                     //ปิดการทำงาน uart1
                ConfigU1MODE =               UART_EN &                                                          // Enable UART1
                                                                UART_IDLE_CON &                            // UART1 working in idle mode
                                                                UART_RX_TX&     // UART1 normal pin(TX==>RF3 pin,RX==>RF2 pin)
                                                                UART_DIS_WAKE &                            // Disable wake-up on start UART
                                                                UART_DIS_LOOPBACK & // Disable loop back mode                              
                                                                UART_DIS_ABAUD &                          // Disable autobaud mode
                                                                UART_NO_PAR_8BIT &                      // Set data 8 bit ,no parity bit
                                                                UART_1STOPBIT;                                               // Set 1 stop bit
                ConfigU1STA       =             UART_INT_TX_BUF_EMPTY &         // Interrupt on buffer empty mode
                                                                UART_TX_PIN_NORMAL &                                // TX Break bit normal
                                                                UART_INT_RX_CHAR&                      // UART interrupt receive mode
                                                                UART_ADR_DETECT_DIS &             // Disable detect address mode
                                                                UART_RX_OVERRUN_CLEAR;         // Reset buffer over run

                BaudRate = BAUD_RATE_GEN;
                OpenUART1(ConfigU1MODE, ConfigU1STA, BaudRate);        //เปิดการทำงานของ uart1 ตามค่าที่กำหนดไว้
}

void adc_init()
{
unsigned int Channel, PinConfig, Scanselect, Adcon3_reg, Adcon2_reg,Adcon1_reg;
                ADCON1bits.ADON = 0;                    // Turn off ADC     
                Channel =             ADC_CH0_POS_SAMPLEA_AN0 &// Channel 0 positive input select AN0
                                                ADC_CH0_POS_SAMPLEA_AN1 & // Channel 0 positive input select AN1
                                                ADC_CH0_POS_SAMPLEA_AN2 & // Channel 0 positive input select AN2
                                                ADC_CH0_POS_SAMPLEA_AN3 & // Channel 0 positive input select AN3           
                                                ADC_CH0_NEG_SAMPLEA_NVREF ;             // Channel 0 negative VREF
                SetChanADC10(Channel);                                                                                // Set channel configuration             
                ConfigIntADC10(ADC_INT_DISABLE);                                           // Disable interrupt for ADC
                PinConfig              =             ENABLE_AN0_ANA &                         // Enable AN0-AN3 analog port
                                                                ENABLE_AN1_ANA &
                                                                ENABLE_AN2_ANA &
                                                                ENABLE_AN3_ANA ;                                          
                Scanselect           =             SKIP_SCAN_AN4 &                                             // Scan for AN0-AN3
                                                                SKIP_SCAN_AN5 &
                                                                SKIP_SCAN_AN6 &
                                                                SKIP_SCAN_AN7;                                                              
                Adcon3_reg =                      ADC_SAMPLE_TIME_10 &                 // Sample for 10 time
                                                                ADC_CONV_CLK_INTERNAL_RC &               // Internal Clock
                                                                ADC_CONV_CLK_13Tcy; 
                Adcon2_reg         =             ADC_VREF_AVDD_AVSS &                               // Vref at Vdd and Vss
                                                ADC_SCAN_ON &                                               // Enable scan for ADC
                                                ADC_ALT_BUF_OFF &                                       // Disable alternate buffer
                                                ADC_ALT_INPUT_OFF &                                   // Disable alternate input
                                                ADC_CONVERT_CH0&                                     // Select CH0 convert         
                                                ADC_SAMPLES_PER_INT_16;                         // 16 sample between interrupt
                Adcon1_reg =      ADC_MODULE_ON &                                        // Enable module ADC
                                                ADC_IDLE_CONTINUE &                                  // ADC run on idle mode
                                                ADC_FORMAT_INTG &                                      // Output value integer format
                                                ADC_CLK_MANUAL &                                        // ADC manual clock
                                                ADC_SAMPLE_SIMULTANEOUS &                 // ADC sampling simultaneous
                                                ADC_AUTO_SAMPLING_ON;                           // ADC auto sampling                        
OpenADC10(Adcon1_reg, Adcon2_reg,       Adcon3_reg,PinConfig, Scanselect);             // Turn on ADC module     
}
void Uart1_PrintStr(unsigned char *str_uart){               //ฟังก์ชันการส่งข้อมูล RS-232
                putsUART1((unsigned int *)str_uart);
                while(BusyUART1());
}
int main(void)
{
                char buffer[40];                    //ประกาศตัวแปรชื่อ buffer แบบตัวอักษรขนาด 40 ตัวอักษร
                float voltage;                         //ประกาศตัวแปรชื่อ Voltage แบบทศนิยม
                unsigned char i;                  //ประกาศตัวแปรชื่อ i แบบตัวอักษร
                unsigned int value1;           //ประกาศตัวแรชื่อ value1 แบบจำนวนเต็มบวก
                div_t V;
                adc_init();                              //เรียกใช้งานฟังก์ชัน A to D 
                uart1_init();                            //เรียกใช้งานฟังก์ชัน uart1
                Uart1_PrintStr("Test ADC Module\n\r");            //ส่งค่า Test ADC Module ออก RS - 232
                while(1)                                
                {                              
                ADCON1bits.SAMP = 1;                                     //เริ่มการ sampling สัญญาณที่เข้ามา
                                                ConvertADC10();                 //แปลงค่าสัญญาณที่เข้ามาเป็น  Digital 10 bits              
                                                value1 = ReadADC10(0);                  //เก็บค่า Digital 10 bits ไว้ที่ตัวแปร value1
                                for(i=0;i<4;i++){                                                   //for loop เพื่อ แปลงค่าให้เป็นทศนิยม
                                                voltage = ((float)value1)*5;                //Voltage = (value1*5)/1023
                                                V = div(voltage,1023);                        //อยู่ใน stdlib.h                                                                     
                }
                                                sprintf(buffer,"VALUE:%u\tVolt:%d.%d\r\n",value1,V.quot,V.rem) ;            //แปลง
                                                                                ข้อมูลค่า value1 และ ค่า V เป็นสตริงเก็บไวที่ตัวแปร buffer
                                                Uart1_PrintStr(buffer);                        //ส่งค่าที่เก็บไว้ที่ตัวแปร buffer ออก RS - 232
                }
return 0;                 //Reset ค่าเริ่มต้น
}
โปรแกรมการอ่านและแปลงค่าสัญญาณ Analog To Digital ขนาด 10 บิตแล้วส่งค่าที่ได้ออก RS – 232 คือค่า จำนวนบิตที่เก็บไวที่ตัวแปร value1 และค่า Volt ที่เก็บไว้ที่ตัวแปร V