Proton Tutorial - LM35DZ

The  LM35DZ is an accurate temperature sensor that will provide an analogue output of 10mV per degree C within 0.01% Its not hard to interface one with a PIC, and the following example allows for a temperature range of -55 to 150 deg C.

The datasheet shows many ways to use the LM35DZ, but I'm using the example on page 7 with the -55 to +150 degree C application. It requires 3 additional components, 2 * 1N914 (Or 1N4148), and 1 * 18K resistor.

Here's the circuit:

lm35dz2011

 

ISIS doesn't have a model for the LM35DZ, so I put a signal of 0-2.05V on the output of the LM35DZ to simulate the voltage swing. This is not how the device behaves in real life, and rather has two output references that need to be summed to generate the correct temperature value.

Now its a matter of sampling the voltage, and displaying it on the screen, I also have a custom character made so that it displays the degree symbol on the LCD.

LM35DZ Code
Device 16F877A
Declare XTAL 4
 
DECLARE ADIN_RES 10 ' 10-bit result required  DECLARE ADIN_TAD 8_FOSC ' Set the ADC's clock source  DECLARE ADIN_STIME 50 ' Allow 50us sample time 
Declare LCD_TYPE 0 ' Type of LCD Used is Alpha Declare LCD_DTPIN PORTB.4 ' The control bits B4,B5,B6,B7 Declare LCD_RSPIN PORTB.2 ' RS pin on B2 Declare LCD_ENPIN PORTB.3 ' E pin on B3 Declare LCD_INTERFACE 4 ' Interface method is 4 bit 
Dim ADC_Result As Float
Dim ADC_Total As Float
Dim Temp_Float as Float
Dim ADC_Channel as Byte
Dim ADC_Loops as Word
Dim Temp as Word
 
 
Dim Last_Result1 As Float
Dim Last_Result2 As Float
 
ADCON1 = %10000000 ' Set all to analogue inputs (PORTA) TRISA = $FF ' Declare porta as all inputs 
Delayms 150
Cls
 
Print $FE,$40,$07,$05,$07,$00,$00,$00,$00,$00 ' Custom character for Degree 
ADC_Loops = 200
 
Main:
 
 ADC_Channel = 1 ' ADC on first reference  Gosub ADC_Average ' Perform an averaging to enhance accuracy 
 Temp_Float = ADC_Result ' Store the result 
 ADC_Channel = 0 ' ADC on second reference  Gosub ADC_Average ' Perform an averaging to enhance accuracy 
 ' Convert values into Volts (with a scale of 1000)  ADC_Result = ADC_Result * 5000 / 1023
 Temp_Float = Temp_Float * 5000 / 1023 ' to reduce decimal error  ADC_Result = ADC_Result - Temp_Float ' And calculate difference 
 ADC_Result = ADC_Result / 10 ' Scale back down remembering 10mV = 1 Deg C 
 If ADC_Result Last_Result1 Then ' Check if the data has changed  ' and only update display if it has  Print At 1,1, Dec1 ADC_Result, 0, "C "
 Last_Result1 = ADC_Result ' Store new data  Endif
 
Goto Main ' Loop for ever 
 
ADC_Average: ' Perform an averaging on ADC conversions to reduce errors 
 ADC_Total = 0 ' Clear summing register  
 ' Loop for a pre-determined number of times  For Temp = 1 To ADC_Loops
 ADC_Result = ADIN ADC_Channel ' Grab a new ADC value  ADC_Total = ADC_Total + ADC_Result ' Sum it to the total register  Delayus 1 ' Allow internal capacitors to discharge  Next Temp
 
 ' Determin the average of all the equations  ADC_Result = ADC_Total / ADC_Loops
 
 Return

 

Forum Activity

Member Access