#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