Submitted by:
Glenn Clark
Protean Logic Inc.
This application note details the use of the very popular LTC1298 12-bit A/D converter IC. The LTC1298 is manufactured by Linear Technology Corp but another version of this IC is Manufactured by SIPEX, inc. The SIPEX part (SP8538) tends to be less costly and exhibits better performance in differential mode. Protean Logic currently stocks a supply of the SP8538 if you have difficulty locating a source for this part.
There are two approaches to interfacing the LTC1298/SP8538. The first approach uses general purpose pins to create the serial data and clock signals required to read the voltage on the input pins of the A/D. The second uses a section of hardware within the TICkit 62 called the Synchronis Serial Port (SSP) and generates the same serial data and clock pattern at a much faster rate.
The software approach is the easiest to understand and this application note deals with this method. The circuit for this program is shown below:

The program to read the voltage at pin 3 of the SP8538 is as follows
; program to read an LTC1298
DEF tic62_c
LIB fbasic.lib
DEF ltc_cs pin_a1
DEF ltc_clk pin_a3
DEF ltc_data pin_a4
LIB ltc1298.lib
FUNC none main
BEGIN
rs_param_set( debug_pin )
pin_high( ltc_cs )
pin_low( ltc_clk )
rep
con_out( read_ltc1298( 1b ))
con_out_char( 13b )
loop
ENDFUN
The program above is incredibly simple since all of the difficult stuff is performed by a call to the routine "read_ltc1298". This routine is contained in a file called "ltc1298.lib" which is available on the TICkit release disk. The library is shown below:
; Functions to control A/D
; These functions rely on three defines to work properly
; cs = Chip Select pin 'Must have a separate line '
; clk = Clock control pin 'Can share a data line with other device '
; data = data pin 'Can share a data line I.E. a LCD'
; Routine to read a data from an LTC1298 or LTC1288 A/D chip
FUNC word read_ltc1298
PARAM byte config ; This value indicates mode and channel
; for the A/D chip.
; bit 7 = mode ( 0=single end, 1=differential)
; bit 1-6 = channel select
; bit 0 = polarity for differential or lsb
; channel select for single ended
LOCAL byte count 0b
BEGIN
pin_low( ltc_clk )
pin_low( ltc_cs )
pin_high( ltc_data ) ; start bit
pulse_out_high( ltc_clk, 10w )
IF b_and( config, 0y10000000b ) ; do we want a differential conversion
pin_low( ltc_data )
ELSE
pin_high( ltc_data )
ENDIF
pulse_out_high( ltc_clk, 10w )
IF b_and( config, 1b ) ; select channel or polarity
pin_high( ltc_data )
ELSE
pin_low( ltc_data )
ENDIF
pulse_out_high( ltc_clk, 10w )
pin_high( ltc_data ) ; use msb first format
pin_high( ltc_clk ) ; clock in the msbf bit
=( count, pin_in( ltc_data )) ; make data line an input
pin_low( ltc_clk ) ; return clock to low state
; delay( 10w ) ; settling delay
=( count, 0b )
=( exit_value, 0w ) ; get data loop ready
REP
pulse_out_high( ltc_clk, 10w ) ; clock for next data bit
=( exit_value, <<( exit_value )); shift exit word to the left
IF pin_in( ltc_data )
++( exit_value )
ENDIF
++( count )
UNTIL ==( count, 12b )
pin_high( ltc_cs )
ENDFUN
The byte value passed to the LTC determines which mode to use to read the two input channels and which channel or differential polarity to convert. The meanings of the parameter is as follows:
0x00b = Single Ended Conversion on Channel 0 (pin 2)
0x01b = Single Ended Conversion on Channel 1 (pin 3)
0x80b = Differential Conversion Channel 1 - Channel 0 (pin2 - pin3)
0x81b = Differential Conversion Channel 0 - Channel 1 (pin3 - pin2)
In the main program above we are converting the voltage on pin2 to a number between 0 and 4095 where 0 is 0volts and 4095 is nominally 5 volts.
Protean Logic Inc. Copyright 05/06/04 Top of Page