NTC thermistor temperature sensing


Closed Thread
Results 1 to 37 of 37

Hybrid View

  1. #1
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,653


    Did you find this post helpful? Yes | No

    Default

    Hi,

    IF you want to show 1/100 ° ...

    better finely tune your calculations @ first :

    255/ 3.3 = 77.272727 ... not 78 !!!

    PBP can handle ADRes * 2550 / 33 ... sooooooo ...

    add to that , here, a linear regression is not the best for a thermistor, and we conclude you will show " something " , but nothing that could be called a temperature.

    and I don't talk about the least digit meaning ...

    just my two cents ...

    Alain
    Last edited by Acetronics2; - 14th January 2011 at 09:30.
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

  2. #2


    Did you find this post helpful? Yes | No

    Default

    Well, sorry for these newbie questions...

    The precision for my thermoter is not critical, is just a temperature sensor for security purposes. But I want to keep the code for current and voltage sensing purposes (linear curves), so in these cases I need more precision...

    I've read many exemples given... I've modified my code in consequence, I can read the integer part (like 23.00 °C), but not the float part...

    Here's my code :
    Code:
    define OSC 20
    DEFINE ADC_BITS 8      ' Set number of bits in result
    DEFINE ADC_CLOCK 3     ' Set clock source (rc = 3)
    DEFINE ADC_SAMPLEUS 10 ' Set sampling time in microseconds 
    DEFINE LCD_DREG PORTC 'LCD data port
    DEFINE LCD_RSREG PORTC 'LCD data port
    DEFINE LCD_EREG PORTC
    DEFINE LCD_EBIT 5 
    DEFINE LCD_BITS 4 'LCD bus size 4 or 8 
    DEFINE LCD_LINES 2 'Number lines on LCD 
    DEFINE LCD_COMMANDUS 10000'Command delay time in us 
    DEFINE LCD_DATAUS 1000 'Data delay time in us 
    
    AD_AN1_VALUE VAR WORD
    B0 VAR WORD
    B1 VAR WORD
    B2 VAR WORD
    B3 VAR WORD
    
    TRISA = %11111111     
    
    ADCON1 = %10000010   
    
    PAUSE 4000
    
    lp:
    
    ADCIN 1, AD_AN1_VALUE
    
    B0 = AD_AN1_VALUE*129   
    B1 = B0-8143                                      
    B2 = B1/319
    PAUSE 100
                          
    LCDOUT $fe,1
    LCDOUT #AD_AN1_VALUE
    Lcdout $fe,$c0,"Temp.: ",DEC (B2 DIG 0),DEC (B2 DIG 1),".",DEC (B2 DIG 2),DEC (B2 DIG 3),"°C"
    
    goto lp
    I like to have XX.Y °C (23.2 °C for example).
    I know that is a very common problem, but I've spend many hours to try solve this, so...

    Example of my calculation :
    AD_AN1_VALUE=137
    B0=137*129=17673
    B1=17673-8143=9530
    B2=9530/319=29,874 °C

    But here I only get 29,00 °C...
    Last edited by pxidr84; - 14th January 2011 at 18:56.

  3. #3
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    No problem with the newbie questions, just figured a search would get you there.

    Powers of ten...
    If you are using an 18F chip it is easy with LONG type variables.

    Make the 9530, 953000, mult by 100.
    then
    953000 / 319 = 2987
    then
    do the DIG.

    What chip are you using?
    Dave
    Always wear safety glasses while programming.

  4. #4
    Join Date
    Oct 2010
    Posts
    27


    Did you find this post helpful? Yes | No

    Default

    PBP can only handle integer, it clips off the .874 dec portion.

    where analog in is 0-1024 I would do something like this, tho your scaling would vary :

    Analog_In_1:
    ADCIN 1, AIN1
    Volts_1=AIN1*50/51/2
    Start_Seconds=AIN1*50/51/2
    HI_1 = Volts_1/100
    LOW_1 = Volts_1//100
    Lcdout $fe,$c0,"Temp.: ",#HI_1,".",#LOW_1,"°C"

    Return

    So work in values*100
    Divide by 100 for the integer
    get the modulus of the Divide by 100 for the floating portion
    if you support longs even better!
    note // is modulus
    I thought B0 was reserved for Byte zero, but I may be thinking of something else.
    Last edited by Plcguy; - 14th January 2011 at 20:42.

  5. #5
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,653


    Did you find this post helpful? Yes | No

    Default

    not much better ...

    Code:
     
    .
    .
    .
     
    AD_AN1_VALUE VAR WORD
    B0 VAR WORD
    B1 VAR WORD
    B2 VAR WORD
    B3 VAR WORD
    B3 = 100
    TRISA  = %11111111     
    .
    .
    .
     
    PAUSE 4000
    lp:
    ADCIN 1, AD_AN1_VALUE
    B0 = AD_AN1_VALUE*129   
    B1 = B0 - 8143
    B1 = B1 * B3                                      
    B2 = Div32 319
    PAUSE 100
    B0 = B2 / 100   ' we get integer part of temp
    B1 = B2 // 100  ' we get the decimal part x 100
     
    LCDOUT $fe,1
    LCDOUT #AD_AN1_VALUE
    Lcdout $fe,$c0,"Temp.: ",DEC (B0 DIG 1),DEC (B0 DIG 0),"." ,DEC (B1 DIG 1),DEC (B1 DIG 0),"°C"
    goto lp
    But with whisles and Bells ...

    Alain
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

  6. #6
    Join Date
    Oct 2010
    Posts
    27


    Did you find this post helpful? Yes | No

    Default

    I'm not seeing what "DEC" and "dig" offers over my ver.....
    Please enlighten me!

  7. #7
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530


    Did you find this post helpful? Yes | No

    Default

    Oops, sorry Picguy (I thought you were the original poster....
    Last edited by ScaleRobotics; - 14th January 2011 at 22:18. Reason: Trying to get my foot out of my mouth.
    http://www.scalerobotics.com

  8. #8
    Join Date
    Oct 2010
    Posts
    27


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by scalerobotics View Post
    Oops, sorry Picguy (I thought you were the original poster....
    I appreciate you saying that, thank you. But my questions stand, AND I have read the manual. My version SEEMS more succinct than the dig / dec version. However, I assume there are advantages to that style, I'm just not seeing them.

    Please point them out to me.

  9. #9
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Plcguy View Post
    My version SEEMS more succinct than the dig / dec version. However, I assume there are advantages to that style, I'm just not seeing them.
    As for me, I missed your earlier post first, hence my foot in my mouth. But now that I look closer at it, if your //100 remainder is 9, then you will print out xx.9. In Alain's example dig 1 will be 0, dig 0 will be 9, so his result will be xx.09.

    Walter
    http://www.scalerobotics.com

  10. #10
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,653


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Plcguy View Post
    I'm not seeing what "DEC" and "dig" offers over my ver.....
    Please enlighten me!
    Hi, PlcGuy

    The Goal here is to offer solutions showing the differents uses of PBP and try to make people understand what they do ... not to show as-is the - so called - " best " solution.

    Pxidr84 had chosen this way of displaying its numbers ... no need to change it, as long as he understands what he does. - I perfectly know it is not the shorter or easier or smarter or .... way of doing it. And we do not talk about Walter's # 12 post ...

    The question was about scaling a value ... whithout knowing the Pic type, I showed the DIV 32 use ... which is the simpler for him.

    Darrel posted about "BIG Numbers" operations ... and it is the way to get more decimals here ... but not so simple - for a newbee !!!

    Now, We Know it is a Pic 18F ... the use of LONGs becomes obvious. It still is easy to use.

    I see in your example you just display the ADC input voltage, and not the required temp value, what could raise more questions than offer ideas, for a PBP "newbee" as our friend, as you didn't tell him it doesnt give the awaited result ...
    but was just an example.

    Not so easy to give a useful and usable answer to a post ... don't you think ???

    Alain

    PS: for B0, B1 .... absolutely no problem till you do not use the BS1 or 2 to include " compatibility files " ...
    Last edited by Acetronics2; - 15th January 2011 at 10:17.
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

  11. #11


    Did you find this post helpful? Yes | No

    Default

    Okay, I've rectified the code for use the 10-bit ADC. Now I get more accurate temperature measurement.
    I've also modified the temperature formula (the bin->voltage conversion is now "integrated" within), so I don't need anymore the bin->voltage calculation effetued by the PIC.

    Code:
    define OSC 20
    DEFINE ADC_BITS 10
    DEFINE ADC_CLOCK 3  
    DEFINE ADC_SAMPLEUS 10
    DEFINE LCD_DREG PORTC
    DEFINE LCD_RSREG PORTC
    DEFINE LCD_EREG PORTC
    DEFINE LCD_EBIT 5 
    
    tb0 VAR WORD
    tb1 VAR WORD
    tb2 VAR WORD
    tb3 VAR WORD
    tb3=100
    
    TRISA=%11111111     
    ADCON1=%10000010   
    
    PAUSE 4000
    
    lp:
    
    ADCIN 1,tb0
    tb1=tb0-16170
    tb1=tb1*tb3                                      
    tb2=Div32 634
    tb0=tb2/100   
    tb1=tb2//100    
               
    PAUSE 100
     
    Lcdout $fe,$c0,"IGBT t.: ",DEC (tb0 DIG 1),DEC (tb0 DIG 0),".",DEC (tb1 DIG 1),"°C"
    
    goto lp

  12. #12
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,653


    Did you find this post helpful? Yes | No

    Default

    Hi,

    I'm somewhat affraid ...
    ADCIN 1,tb0
    tb1=tb0-16170
    tb1=tb1*tb3
    tb2=Div32 634
    tb0=tb2/100
    tb1=tb2//100
    0 < Tb0 < 1024 ... ok ?

    1024 - 16170 = ??? - 15146 !!!
    so, tb1 is NEGATIVE ...

    and PBP do not deal with negative numbers .... but " read " it as 65536 -15146 = ???

    a hole in the somewhere ???

    Alain
    Last edited by Acetronics2; - 15th January 2011 at 15:30.
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

  13. #13


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Acetronics View Post
    not much better ...

    Code:
     
    .
    .
    .
     
    AD_AN1_VALUE VAR WORD
    B0 VAR WORD
    B1 VAR WORD
    B2 VAR WORD
    B3 VAR WORD
    B3 = 100
    TRISA  = %11111111     
    .
    .
    .
     
    PAUSE 4000
    lp:
    ADCIN 1, AD_AN1_VALUE
    B0 = AD_AN1_VALUE*129   
    B1 = B0 - 8143
    B1 = B1 * B3                                      
    B2 = Div32 319
    PAUSE 100
    B0 = B2 / 100   ' we get integer part of temp
    B1 = B2 // 100  ' we get the decimal part x 100
     
    LCDOUT $fe,1
    LCDOUT #AD_AN1_VALUE
    Lcdout $fe,$c0,"Temp.: ",DEC (B0 DIG 1),DEC (B0 DIG 0),"." ,DEC (B1 DIG 1),DEC (B1 DIG 0),"°C"
    goto lp
    But with whisles and Bells ...

    Alain
    Thank you so much, it works flawlessly now. Very helpful.

    For mackrackit, I use the 18F26K20 (3.3V, 64MHz, 28-DIP), but I will switch to 18F4431 (because mine haven't enough I/O ports, and not enough hardware PWM ports).

  14. #14
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,653


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by pxidr84 View Post
    Thank you so much, it works flawlessly now. Very helpful.

    For mackrackit, I use the 18F26K20 (3.3V, 64MHz, 28-DIP), but I will switch to 18F4431 (because mine haven't enough I/O ports, and not enough hardware PWM ports).

    Hi,

    IF you use a 18F series, it would be much better to make temp calculations with LONG types ... and then use 10 bits ADC result.

    you could easily get a .1°C resolution ( here it is .4°C ... I'm sure you had noticed ! )

    ...

    Alain
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts