Help with the conversion math


Closed Thread
Results 1 to 31 of 31

Hybrid View

  1. #1
    Join Date
    Mar 2011
    Location
    Los Angeles, California
    Posts
    322


    Did you find this post helpful? Yes | No

    Default Re: Help with the conversion math

    Hi Ioannis,
    This is my very first attempt at using the PIC's A/D.
    I think that ADCON0 should be 000100?1 as I am not sure what "GO/DONE" should be set at.
    ADCON2 looks like it should be 11101010 and again I am not certain of the last 3 bits.

    Thanks, Ed

  2. #2
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,171


    Did you find this post helpful? Yes | No

    Default Re: Help with the conversion math

    Ed,

    Settings depend on your hardware and software requirements.

    E.g.: Do you have internal or extrernal Vref for the ADC? If it is internal and you want the Vref to be at Vdd and ground span, you should set VFG1:0 as 00.

    So, I will try to give you an approach and if it is not close to your circuit we can change it.

    ADCON0: %00000001 ' This sets the ADC channel to 0 (AN0) reference at power supply and converter is ON, ready to convert.
    ADCON1: %00000001 ' All inputs digital except channel 0 (AN0)
    ADCON2: %10110010 ' Right justification, 16Tad acquisition time, Fosc/32 to be safe.

    Now, when all this are setup, you only have to set the GO/DONE bit (ADCON0.1=1) and wait until it is cleared (WHILE ADCON0.1:WEND).

    Then get your 10bit result from the ADRESH/ADRESL registers or the variable you use in ADCIN.

    Ioannis

  3. #3
    Join Date
    Mar 2011
    Location
    Los Angeles, California
    Posts
    322


    Did you find this post helpful? Yes | No

    Default Re: Help with the conversion math

    Hi Ioannis!
    Thank you!
    The connections are very simple, the sensor output is connected to pin 8 (AN4) of the 18F1320.
    So to me this would make ADCON0: %00010001.
    Then ADCON1: %11101111, all inputs digital except channel 4 (AN4) which would be set to analog.
    Then ADCON2: %10110010 as you wrote.

    Or did I misunderstand something completely?

    Again, Thank you for all the time you are spending with me.

    Ed

  4. #4
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,171


    Did you find this post helpful? Yes | No

    Default Re: Help with the conversion math

    I think you are good to go!

    Ioannis

  5. #5
    Join Date
    Mar 2011
    Location
    Los Angeles, California
    Posts
    322


    Did you find this post helpful? Yes | No

    Default Re: Help with the conversion math

    Thanks Ioannis it works great now! Next is trying to understand the program Henrik wrote.

    Accumulator VAR WORD
    i VAR BYTE
    ADResult VAR WORD

    Accumulator = 0

    Main:

    For i = 0 to 39
    ADCIN 4, ADResult
    Accumulator = Accumulator + ADResult
    PauseUs 500
    NEXT

    ADResult = Accumulator / 10 ' Psuedo 12bit resolution, ADResult is now 0-4092

    ' Sensor outputs 0.5V (ADResult=409 ) at 0psi (nominal)
    ' Sensor outputs 4.5V (ADResult=3683) at 7psi (nominal)

    ADResult = ADResult - 409 ' Offset for zero output, ADResult is now 0 to 3274 for 0 to 7psi
    ADResult = ADResult */ 547 ' Scale up, ADResult is now 0 to 6995 for 0 to 7psi

    ' Display Pressure: x.xx psi
    HSEROUT["Pressure: ", DEC ADResult/1000, ".", DEC2 ADResult//1000, "psi", 13]

    PAUSE 1000

    Goto Main

    If I know that at zero PSI the A/D gives 110 as a value and now it looks like we are using a high value of 4092 would I not take and use 4 times the 110 value?
    Next, where did the 547 value come from and should it be "adjusted"?

    Thanks, Ed

  6. #6
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,624


    Did you find this post helpful? Yes | No

    Default Re: Help with the conversion math

    Hi Ed,

    The sensor nominally outputs 0.5V at 0 psi. With 5V as the reference the 10bit ADC will return a value of 102 (102.4 ideally) for a 0.5V input.
    Becaues we are taking 40 readings and then dividing that by 10 we go from 10bit reslution to 12bit (4 times oversampling) so our 102.4 now becomes 102.4*40/10=409 which is where the 409 in the code comes from.

    At full scale (7psi, 0.07psi whatever is is) the sensor nominally outputs 4.5V. With 5V as the reference the 10bit ADC will return a value of 921 (921.6 ideally) for a 4.5V input.
    Because we are taking 40 readings and then dividing that by 10 we go from 10bit resoultion to 12bit (4 times oversampling) so our 921.6 now becaomes 921.6*40/10=3686.

    So now we have a value ranging from 409 to 3686 for our 0 to 7 (or 0.07) psi. The first thing we need to do is remove the offset. Easy enough, just subtract 409 to get a value ranging from 0 to 3277 for our 0 to 7 (or 0.07psi).

    The final step is to get that strange value into something reassembling the actual pressure and that's where the 547 numbler comes in.

    The */ operator has be covered numerous times on the forum. It's like multiplying by units of 1/256. So 3277 * (1/256*547) = 7002.

    So now we have a value ranging from 0 to 7002 for a pressure of 0 to 7 (or 0.07 or whatever) psi and all we need to do is to put a decimal point between the correct digitis when displaying the value.
    For 0 to 7psi:
    HSEROUT["Pressure: ", DEC ADResult/1000, ".", DEC2 ADResult//1000, "psi", 13]

    For 0 to 0.07psi:
    HSEROUT["Pressure: 0.0", DEC ADResult, "psi", 13]

    Obviously, if your sensor outputs values other than the nominal (which of course is likely) the numbers needs to be tweaked to calibrate the readings.

    /Henrik.

  7. #7
    Join Date
    Mar 2011
    Location
    Los Angeles, California
    Posts
    322


    Did you find this post helpful? Yes | No

    Default Re: Help with the conversion math

    Thank you Henrik!
    You and the people here are incredibly smart! I cannot thank all of you enough for your support and patience in teaching me so much and guiding me out of the "fog" I tend to get into. The high pressure side of the sensor is being fed with a .094" tube so there is not a lot of pressure to sense which is why the sensor has such a small range. The low side of the sensor is "static" pressure so you can compensate for the depth and still be able to know the speed when sub is travelling through water. In Microcode Studios ICD is where I can see the readings from the sensor. So since I know from the ICD that at zero pressure I get 110 and not 102.4 should I only adjust the low value or should I also adjust the high value assuming that the sensor has basically a 4 volt span (.5v to 4.5v) or does the high value stay the same? That is, a range from .5368 volts to 4.5368 volts. Again my most sincere thanks.

    Ed

Similar Threads

  1. AD conversion
    By CipiCips in forum mel PIC BASIC
    Replies: 8
    Last Post: - 19th May 2011, 02:09
  2. A/D conversion with PIC18F67J50
    By ScaleRobotics in forum mel PIC BASIC Pro
    Replies: 9
    Last Post: - 8th May 2009, 02:48
  3. PBPL Math...new math takes more cycles...Always?
    By skimask in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 10th February 2008, 11:22
  4. conversion
    By pramodsinha in forum Forum Requests
    Replies: 2
    Last Post: - 19th January 2006, 16:58
  5. ºC -> ºF Conversion
    By CocaColaKid in forum General
    Replies: 6
    Last Post: - 15th March 2005, 10:42

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