ADC interfacing with LPC2148
Features of ADC:
ADC0 (6 Channel), ADC1 (8 Channel)
10-bit, Successive Approximation
Supports burst mode(repeated conversion at 3-bit to 10-bit resolution)
Conversion time: 2.44 us
SoC by software control, on timer match, transition on a pin
Voltage Range: 0 V – VREF (+3.3 V)
Max. clock freq is 4.5 MHz, (by programming ADCCON)
Functional block diagram of ADC in LPC2148:
Features of ADC:
Functional Block Diagram: |
ADC0: It has 6 channel ( AD0.0 and AD0.5 not available).
ADC1: It has 8 channel
This Successive Approximation process requires a clock less than or equal to 4.5 MHz. We can adjust this clock using clock divider settings.
ADC Control register(AD0CR):
Bits 7:0 – SEL
Selects which of the AD0.7:0/AD1.7:0 pins is (are) to be sampled and converted. For AD0, bit 0 selects (00000001) Pin AD0.0, and bit 7 selects(10000000) pin AD0.7. In software-controlled mode, only one of these bits should be 1. In hardware scan mode, any value containing 1 to 8 can be one.
Bits 15:8 – CLKDIV
The APB clock (PCLK) is divided by (this value plus one) to produce the clock for the A/D converter, which should be less than or equal to 4.5 MHz Typically, software should program the smallest value in this field that yields a clock of 4.5 MHz or slightly less, but in certain cases (such as a high-impedance analog source) a slower clock may be desirable.
Bit 16 – BURST
If bit is 0: ADC will not perform Repeated A to D Conversion.
If bit is 1: ADC will perform Repeated A to D Conversion The AD converter does repeated conversions at the rate selected by the CLKS field.Repeated conversions can be terminated by clearing this bit, but the conversion that’s in progress when this bit is cleared will be completed.
Note: START bits must be 000 when BURST = 1, otherwise conversions will not be start.
Bits 19:17 – CLKS
This field selects the number of clocks used for each conversion in Burst mode and result size in bits.
when we select 000 then it uses 11 clocks for each conversion and provide 10 bits of result in corresponding ADDR register.
Bit 20 :RESERVED
Bit 21 –PDN
Power Down
If bit is 1: The A/D converter is operational.
If bit is 0: The A/D converter is in power-down mode.
Bit 23:22 – RESERVED
Bit 26:24 – START
Bit 27 – EDGE
(In use only when START field contains Values from 010 TO 111)
ADC data register(AD0DR):
Contains most recent converted data and EoC(Done)
Bits 5:0 – RESERVED
Bits 15:6 – RESULT
When DONE(31) bit is set to 1, this field contains 10-bit ADC result that has a value in the range of 0 to 1023.
Bit 29:16 – RESERVED
Bit 30 – OVERRUN
This bit is set to 1 in burst mode if the result of one or more conversions is lost and overwritten before the conversion that produced the result in the RESULT bits.
This bit is cleared by reading this register.
Bit 31 – DONE
This bit is set to 1 when an A/D conversion completes.
ADC Global data register(AD0GDR):
Contains done bit, most converted data, channel number
Bits 5:0 – RESERVED
Bits 15:6 – RESULT
When DONE(31) bit is set to 1, this field contains 10-bit ADC result that has a value in the range of 0 to 1023.
Bit 23:16 – RESERVED
Bits 26:24 – CHN
These bits contain the channel from which ADC value is read.
e.g. 000 identifies that the RESULT field contains ADC value of channel 0.
Bit 29:27 – RESERVED
Bit 30 – OVERRUN
This bit is set to 1 in burst mode if the result of one or more conversions is lost and overwritten before the conversion that produced the result in the RESULT bits.
This bit is cleared by reading this register.
Bit 31 – DONE
This bit is set to 1 when an A/D conversion complete.
LM35 Temperature sensor interfacing with LPC2148
Note: For Proteus Simulation use Global data register(AD0GDR) instead of Data register(AD0DR2) in programming.
Algorithm:
1) Configure ADC control register according to need of application.
2) Start ADC conversion by writing appropriate value to START bits in ADxCR.
3) Monitor the DONE bit (bit number 31) of the corresponding ADC data register till it changes from 0 to 1.
4) Read ADC result from ADC data register and Display on (LCD or Serial Window of terminal)
Code:ADC interfacing with LPC2148
ADC interfacing with LPC2148 (Display output on UART0)
ADC Control register(AD0CR):
Bits 7:0 – SEL
Selects which of the AD0.7:0/AD1.7:0 pins is (are) to be sampled and converted. For AD0, bit 0 selects (00000001) Pin AD0.0, and bit 7 selects(10000000) pin AD0.7. In software-controlled mode, only one of these bits should be 1. In hardware scan mode, any value containing 1 to 8 can be one.
Bits 15:8 – CLKDIV
The APB clock (PCLK) is divided by (this value plus one) to produce the clock for the A/D converter, which should be less than or equal to 4.5 MHz Typically, software should program the smallest value in this field that yields a clock of 4.5 MHz or slightly less, but in certain cases (such as a high-impedance analog source) a slower clock may be desirable.
Bit 16 – BURST
If bit is 0: ADC will not perform Repeated A to D Conversion.
If bit is 1: ADC will perform Repeated A to D Conversion The AD converter does repeated conversions at the rate selected by the CLKS field.Repeated conversions can be terminated by clearing this bit, but the conversion that’s in progress when this bit is cleared will be completed.
Note: START bits must be 000 when BURST = 1, otherwise conversions will not be start.
Bits 19:17 – CLKS
This field selects the number of clocks used for each conversion in Burst mode and result size in bits.
CLKS field - 19-18-17 | No. of Clock cycles used per bit conversion |
000 | 11 clocks cycles / 10 bit conversion |
001 | 10 clocks/ 9 bits |
010 | 9 clocks/ 8 bits |
011 | 8 clocks/ 7 bits |
100 | 7 clocks/ 6 bits |
101 | 6 clocks/ 5 bits |
110 | 5 clocks/ 4 bits |
111 | 4 clocks/ 3 bits |
Bit 20 :RESERVED
Bit 21 –PDN
Power Down
If bit is 1: The A/D converter is operational.
If bit is 0: The A/D converter is in power-down mode.
Bit 23:22 – RESERVED
Bit 26:24 – START
START field - 26-25-24 | |||||
000 | No start of Conversion | ||||
001 | Start of Conversion Now |
Bit 27 – EDGE
(In use only when START field contains Values from 010 TO 111)
ADC data register(AD0DR):
Contains most recent converted data and EoC(Done)
Bits 5:0 – RESERVED
Bits 15:6 – RESULT
When DONE(31) bit is set to 1, this field contains 10-bit ADC result that has a value in the range of 0 to 1023.
Bit 29:16 – RESERVED
Bit 30 – OVERRUN
This bit is set to 1 in burst mode if the result of one or more conversions is lost and overwritten before the conversion that produced the result in the RESULT bits.
This bit is cleared by reading this register.
Bit 31 – DONE
This bit is set to 1 when an A/D conversion completes.
ADC Global data register(AD0GDR):
Contains done bit, most converted data, channel number
Bits 5:0 – RESERVED
Bits 15:6 – RESULT
When DONE(31) bit is set to 1, this field contains 10-bit ADC result that has a value in the range of 0 to 1023.
Bit 23:16 – RESERVED
Bits 26:24 – CHN
These bits contain the channel from which ADC value is read.
e.g. 000 identifies that the RESULT field contains ADC value of channel 0.
Bit 29:27 – RESERVED
Bit 30 – OVERRUN
This bit is set to 1 in burst mode if the result of one or more conversions is lost and overwritten before the conversion that produced the result in the RESULT bits.
This bit is cleared by reading this register.
Bit 31 – DONE
This bit is set to 1 when an A/D conversion complete.
Example
- Select
ADC-0, Channel-2, Clock frequency 3 MHz (let PCLK is 15 MHz), burst
mode repeated conversion) and 10-bit resolution. Power-up ADC and issue
start of conversion.
Solution: AD0CR = 0x01210404; // configure SEL, CLKDIV, BURST CLKS & PDN bit fields set START, signal No start of conversion
Interfacing Diagram |
Interfacing Diagram |
Algorithm:
1) Configure ADC control register according to need of application.
2) Start ADC conversion by writing appropriate value to START bits in ADxCR.
3) Monitor the DONE bit (bit number 31) of the corresponding ADC data register till it changes from 0 to 1.
4) Read ADC result from ADC data register and Display on (LCD or Serial Window of terminal)
Code:ADC interfacing with LPC2148
/**********************************************************
Expt. 6.: ADC interfacing with to LPC2148
Platform: LPC2148 Development Board.
College: PICT
Hardware Setup:-
ADC Channel = AD0.2, P0.29
LCD Data line = P0.16 to P0.23
LCD Control line = P1.16,P1.17,P1.18
**********************************************************/
#include <lpc214x.h>
//Calibrated to 1ms
void delay_ms(unsigned int time)
{
unsigned int i, j;
for (j=0; j<time; j++)
for(i=0; i<8002; i++);
}
void LCD_command(unsigned char command)
{
IOCLR0 = 0xFF<<16; // Clear LCD Data lines
IOCLR1=1<<16; // RS=0 for command
IOCLR1=1<<17; // RW=0 for write
IOSET0=command<<16; // put command on data line
IOSET1=(1<<18); // en=1
delay_ms(10) ; // delay
IOCLR1=(1<<18); // en=0
}
LCD_DATA(unsigned char data)
{
IOCLR0 = 0xFF<<16; // Clear LCD Data lines
IOSET1=1<<16; // RS=1 for data
IOCLR1=1<<17; // RW=0 for write
IOSET0= data<<16; // put command on data line
IOSET1=(1<<18); //en=1
delay_ms(10) ; //delay
IOCLR1=(1<<18); //en=0
}
LCD_init()
{
LCD_command(0x38); //8bit mode and 5x8 dotes
delay_ms(10) ; // delay
LCD_command(0x01); //clear lcd(clear command)
delay_ms(10) ; // delay
LCD_command(0x06); //cursor increament and
delay_ms(10) ; // delay
LCD_command(0x0E);
delay_ms(10) ;
LCD_command(0x80); //set cursor to 0th location 1st lne
delay_ms(10) ;
}
void LCD_write_string(unsigned char *string)
{
int i = 0;
while(string[i]!='\0') //Check for End of String
{
LCD_DATA(string[i]);
delay_ms(10) ;
i=i++; //sending data on LCD byte by byte
}
}
int main(void)
{
unsigned char var1[]= {"ADC:"};
unsigned char val[4];
unsigned int ADC_Result=0,i;
PINSEL1 = 0x04000000;
PINSEL2 = 0X00; //Configure PORT1 as GPIO
IODIR1= 0x07<<16; //Configure P1.18, P1.17, P1.16
IODIR0= 0xFF<<16; //Configure P0.23 - P0.16 as output
LCD_init(); //Initialize LCD 16x2
/************** Configure ADC0 for following
ADC Channel = AD0.2
ADC Clock = 3 MHz
Clock Selection = 11 Clock Cycles/10bit
Start Condition = No start
Power Down = 1, EDGE = 0, BURST = 1 *************/
AD0CR = 0x00210404;
while (1)
{
LCD_write_string(var1);
AD0CR |= 1<<24; //Start ADC
while (!(AD0DR2&0x80000000)); //Wait for conversion
ADC_Result = AD0DR2; //Store converted data
ADC_Result = (ADC_Result>>6) & 0x3FF;
for(i=0;i<4;i++)
{
val[i]=ADC_Result%0X0A ;
val[i]=val[i]+0X30;
ADC_Result=ADC_Result/0X0A;
}
LCD_DATA(val[3]);
LCD_DATA(val[2]);
LCD_DATA(val[1]);
LCD_DATA(val[0]);
delay_ms(1200);
LCD_command(0x01); //clear lcd(clear command)
}
}
/**********************************************************
Expt. 6.: ADC interfacing with to LPC2148 Platform: LPC2148 Development Board. College: PICT Hardware Setup:- ADC Channel = AD0.2, P0.29
LCD Data line = P0.16 to P0.23
LCD Control line = P1.16,P1.17,P1.18
**********************************************************/
#include <lpc214x.h>
//Calibrated to 1ms
void delay_ms(unsigned int time)
{
unsigned int i, j;
for (j=0; j<time; j++)
for(i=0; i<8002; i++);
}
void LCD_command(unsigned char command)
{
IOCLR0 = 0xFF<<16; // Clear LCD Data lines
IOCLR1=1<<16; // RS=0 for command
IOCLR1=1<<17; // RW=0 for write
IOSET0=command<<16; // put command on data line
IOSET1=(1<<18); // en=1
delay_ms(10) ; // delay
IOCLR1=(1<<18); // en=0
}
LCD_DATA(unsigned char data)
{
IOCLR0 = 0xFF<<16; // Clear LCD Data lines
IOSET1=1<<16; // RS=1 for data
IOCLR1=1<<17; // RW=0 for write
IOSET0= data<<16; // put command on data line
IOSET1=(1<<18); //en=1
delay_ms(10) ; //delay
IOCLR1=(1<<18); //en=0
}
LCD_init()
{
LCD_command(0x38); //8bit mode and 5x8 dotes
delay_ms(10) ; // delay
LCD_command(0x01); //clear lcd(clear command)
delay_ms(10) ; // delay
LCD_command(0x06); //cursor increament and
delay_ms(10) ; // delay
LCD_command(0x0E);
delay_ms(10) ;
LCD_command(0x80); //set cursor to 0th location 1st lne
delay_ms(10) ;
}
void LCD_write_string(unsigned char *string)
{
int i = 0;
while(string[i]!='\0') //Check for End of String
{
LCD_DATA(string[i]);
delay_ms(10) ;
i=i++; //sending data on LCD byte by byte
}
}
int main(void)
{
unsigned char var1[]= {"ADC:"};
unsigned char val[4];
unsigned int ADC_Result=0,i;
PINSEL1 = 0x04000000;
PINSEL2 = 0X00; //Configure PORT1 as GPIO
IODIR1= 0x07<<16; //Configure P1.18, P1.17, P1.16
IODIR0= 0xFF<<16; //Configure P0.23 - P0.16 as output
LCD_init(); //Initialize LCD 16x2
/************** Configure ADC0 for following
ADC Channel = AD0.2
ADC Clock = 3 MHz
Clock Selection = 11 Clock Cycles/10bit
Start Condition = No start
Power Down = 1, EDGE = 0, BURST = 1 *************/
AD0CR = 0x00210404;
while (1)
{
LCD_write_string(var1);
AD0CR |= 1<<24; //Start ADC
while (!(AD0DR2&0x80000000)); //Wait for conversion
ADC_Result = AD0DR2; //Store converted data
ADC_Result = (ADC_Result>>6) & 0x3FF;
for(i=0;i<4;i++)
{
val[i]=ADC_Result%0X0A ;
val[i]=val[i]+0X30;
ADC_Result=ADC_Result/0X0A;
}
LCD_DATA(val[3]);
LCD_DATA(val[2]);
LCD_DATA(val[1]);
LCD_DATA(val[0]);
delay_ms(1200);
LCD_command(0x01); //clear lcd(clear command)
}
}
#include <lpc214x.h>
//Calibrated to 1ms
void delay_ms(unsigned int time)
{
unsigned int i, j;
for (j=0; j<time; j++)
for(i=0; i<8002; i++);
}
void LCD_command(unsigned char command)
{
IOCLR0 = 0xFF<<16; // Clear LCD Data lines
IOCLR1=1<<16; // RS=0 for command
IOCLR1=1<<17; // RW=0 for write
IOSET0=command<<16; // put command on data line
IOSET1=(1<<18); // en=1
delay_ms(10) ; // delay
IOCLR1=(1<<18); // en=0
}
LCD_DATA(unsigned char data)
{
IOCLR0 = 0xFF<<16; // Clear LCD Data lines
IOSET1=1<<16; // RS=1 for data
IOCLR1=1<<17; // RW=0 for write
IOSET0= data<<16; // put command on data line
IOSET1=(1<<18); //en=1
delay_ms(10) ; //delay
IOCLR1=(1<<18); //en=0
}
LCD_init()
{
LCD_command(0x38); //8bit mode and 5x8 dotes
delay_ms(10) ; // delay
LCD_command(0x01); //clear lcd(clear command)
delay_ms(10) ; // delay
LCD_command(0x06); //cursor increament and
delay_ms(10) ; // delay
LCD_command(0x0E);
delay_ms(10) ;
LCD_command(0x80); //set cursor to 0th location 1st lne
delay_ms(10) ;
}
void LCD_write_string(unsigned char *string)
{
int i = 0;
while(string[i]!='\0') //Check for End of String
{
LCD_DATA(string[i]);
delay_ms(10) ;
i=i++; //sending data on LCD byte by byte
}
}
int main(void)
{
unsigned char var1[]= {"ADC:"};
unsigned char val[4];
unsigned int ADC_Result=0,i;
PINSEL1 = 0x04000000;
PINSEL2 = 0X00; //Configure PORT1 as GPIO
IODIR1= 0x07<<16; //Configure P1.18, P1.17, P1.16
IODIR0= 0xFF<<16; //Configure P0.23 - P0.16 as output
LCD_init(); //Initialize LCD 16x2
/************** Configure ADC0 for following
ADC Channel = AD0.2
ADC Clock = 3 MHz
Clock Selection = 11 Clock Cycles/10bit
Start Condition = No start
Power Down = 1, EDGE = 0, BURST = 1 *************/
AD0CR = 0x00210404;
while (1)
{
LCD_write_string(var1);
AD0CR |= 1<<24; //Start ADC
while (!(AD0DR2&0x80000000)); //Wait for conversion
ADC_Result = AD0DR2; //Store converted data
ADC_Result = (ADC_Result>>6) & 0x3FF;
for(i=0;i<4;i++)
{
val[i]=ADC_Result%0X0A ;
val[i]=val[i]+0X30;
ADC_Result=ADC_Result/0X0A;
}
LCD_DATA(val[3]);
LCD_DATA(val[2]);
LCD_DATA(val[1]);
LCD_DATA(val[0]);
delay_ms(1200);
LCD_command(0x01); //clear lcd(clear command)
}
}
ADC interfacing with LPC2148 (Display output on UART0)
/**********************************************************
Expt. 6.: ADC interfacing with to LPC2148
Platform: LPC2148 Development Board.
College: PICT
Hardware Setup:-
ADC Channel = AD0.2 (P0.29), uart0= P0.0 and P0.1
**********************************************************/
#include <lpc214x.h>
void uart0Init(void);
void uart0Putch(unsigned char ch);
void UART0_Txstring(unsigned char *Str);
void delay_ms(unsigned int time)
{
unsigned int i, j;
for (j=0; j<time; j++)
for(i=0; i<8002; i++);
}
void uart0Init(void)
{
PINSEL0=0x00000005;// port 0 tx P0.1 and rx P0.0 selected
U0LCR=0x83; //8bit data, no parity, 1 stop bit
U0DLL=97;// 9600 baud rate @15Mhz Pclk
U0LCR=0x03;// DLAB=0
}
void uart0Putch(unsigned char ch)
{
U0THR=ch; // Transmitter holding register
while(!(U0LSR & 0x20));// wait still THR=0
}
void UART0_Txstring(unsigned char *Str)
{
int i=0;
while(Str[i]!='\0')
{
uart0Putch(Str[i]);
i++;
}
}
int main(void)
{
int adcdata;
int voltage;
float voltage1;
unsigned char volt[3];
unsigned char volt1[3];
PINSEL1 = 0x04000000;
uart0Init();
AD0CR = 0x00210404;
while(1)
{ AD0CR |= 1<<24;
if(AD0DR2 & 0x80000000) ////EOC bit monitoring
{
adcdata=(AD0DR2 & 0x0000FFC0);
adcdata=adcdata>>6;
voltage1=((adcdata/1023.0)*3.3);
voltage=adcdata;
sprintf(volt1, "%.1f", voltage1);
sprintf(volt, "%.1d", voltage);
UART0_Txstring("\n Analog voltage is: ");
UART0_Txstring(volt1);
delay_ms(3000);
UART0_Txstring("\n Digital value of Analog voltage is: ");
UART0_Txstring(volt);
delay_ms(5000);
}
}
}
/**********************************************************
Expt. 6.: ADC interfacing with to LPC2148 Platform: LPC2148 Development Board. College: PICT Hardware Setup:- ADC Channel = AD0.2 (P0.29), uart0= P0.0 and P0.1
**********************************************************/
#include <lpc214x.h>
void uart0Init(void);
void uart0Putch(unsigned char ch);
void UART0_Txstring(unsigned char *Str);
void delay_ms(unsigned int time)
{
unsigned int i, j;
for (j=0; j<time; j++)
for(i=0; i<8002; i++);
}
void uart0Init(void)
{
PINSEL0=0x00000005;// port 0 tx P0.1 and rx P0.0 selected
U0LCR=0x83; //8bit data, no parity, 1 stop bit
U0DLL=97;// 9600 baud rate @15Mhz Pclk
U0LCR=0x03;// DLAB=0
}
void uart0Putch(unsigned char ch)
{
U0THR=ch; // Transmitter holding register
while(!(U0LSR & 0x20));// wait still THR=0
}
void UART0_Txstring(unsigned char *Str)
{
int i=0;
while(Str[i]!='\0')
{
uart0Putch(Str[i]);
i++;
}
}
int main(void)
{
int adcdata;
int voltage;
float voltage1;
unsigned char volt[3];
unsigned char volt1[3];
PINSEL1 = 0x04000000;
uart0Init();
AD0CR = 0x00210404;
while(1)
{ AD0CR |= 1<<24;
if(AD0DR2 & 0x80000000) ////EOC bit monitoring
{
adcdata=(AD0DR2 & 0x0000FFC0);
adcdata=adcdata>>6;
voltage1=((adcdata/1023.0)*3.3);
voltage=adcdata;
sprintf(volt1, "%.1f", voltage1);
sprintf(volt, "%.1d", voltage);
UART0_Txstring("\n Analog voltage is: ");
UART0_Txstring(volt1);
delay_ms(3000);
UART0_Txstring("\n Digital value of Analog voltage is: ");
UART0_Txstring(volt);
delay_ms(5000);
}
}
}
#include <lpc214x.h>
void uart0Init(void);
void uart0Putch(unsigned char ch);
void UART0_Txstring(unsigned char *Str);
void delay_ms(unsigned int time)
{
unsigned int i, j;
for (j=0; j<time; j++)
for(i=0; i<8002; i++);
}
void uart0Init(void)
{
PINSEL0=0x00000005;// port 0 tx P0.1 and rx P0.0 selected
U0LCR=0x83; //8bit data, no parity, 1 stop bit
U0DLL=97;// 9600 baud rate @15Mhz Pclk
U0LCR=0x03;// DLAB=0
}
void uart0Putch(unsigned char ch)
{
U0THR=ch; // Transmitter holding register
while(!(U0LSR & 0x20));// wait still THR=0
}
void UART0_Txstring(unsigned char *Str)
{
int i=0;
while(Str[i]!='\0')
{
uart0Putch(Str[i]);
i++;
}
}
int main(void)
{
int adcdata;
int voltage;
float voltage1;
unsigned char volt[3];
unsigned char volt1[3];
PINSEL1 = 0x04000000;
uart0Init();
AD0CR = 0x00210404;
while(1)
{ AD0CR |= 1<<24;
if(AD0DR2 & 0x80000000) ////EOC bit monitoring
{
adcdata=(AD0DR2 & 0x0000FFC0);
adcdata=adcdata>>6;
voltage1=((adcdata/1023.0)*3.3);
voltage=adcdata;
sprintf(volt1, "%.1f", voltage1);
sprintf(volt, "%.1d", voltage);
UART0_Txstring("\n Analog voltage is: ");
UART0_Txstring(volt1);
delay_ms(3000);
UART0_Txstring("\n Digital value of Analog voltage is: ");
UART0_Txstring(volt);
delay_ms(5000);
}
}
}
No comments:
Post a Comment