CyDelay between ADC_IsEndConversion(ADC_WAIT_FOR_RESULT) and ADC_GetResult16() necessary?

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Anonymous
Not applicable

Dear Cypress Developer Community,

I got inspired by the hackster.io project "PSoC 4 : (4+3=) 7$ Auto Ranging Ohms Meter" (https://www.hackster.io/PSoC_Rocks/psoc-4-4-3-7-auto-ranging-ohms-meter-41dc9e).

Because I do not have a PSoC 4 available, I ported the project to PSoC5LP (CY8CKIT-059). By testing the code, I noticed that the ohms meter is working fine for lower unknown resistance values (Rx less than few hundred ohms), but auto ranging ohms meter is showing significant errors for higher resistances.

Step-by-step I changed the hackster.io code to try to identify the error. Attached you can find my latest PSoC Creator version. For simplicity, only 4 predefined measurement-currents are taken: 2mA, 0,2mA, 20uA, 2uA. In the first attempt, IDAC is set to 2mA. If the measured ADC-voltage is above 1V, the next current range is taken (0.2mA), and so on...
As soon as measured voltage is below 1V, the resistance value is calculated by R = U/I.

For debugging purposes, the i-range is printed out at the character LCD-display as well.

Here are some measurement results:
Rx-value      resistance measured by PSoC      range
100Ohm           98 Ohm                                     0
1,5kOhm      1482 Ohm                                     1
47kOhm         50 kOhm                                     2
100kOhm     279 kOhm                                     3


Interestingly, if I put a break point at code line 63 (adc_result = ADC_GetResult16();) and press continuously F5 (Resume Execution) in debug mode, I get much better measurement results:

Rx-value      measured in debug mode               range
100Ohm          99 Ohm (99.14 Ohm)                 0
1,5kOhm     1487 Ohm (1487.79 Ohm)             1
47kOhm        46 kOhm (46.410 Ohm)               2
100kOhm    103 kOhm (103.947 Ohm)             3


I figured out that I need to add a CyDelay between

ADC_IsEndConversion(ADC_WAIT_FOR_RESULT);

and

adc_result = ADC_GetResult16();

to get closer voltages. If the delay is 200ms, I still see significant errors with 100k testing resistor (measured: 133k). By setting delay to 1s, everything seems fine... but ohms meter is acting quite slow... and furthermore, I do not understand why a CyDelay is needed here at all ?!?!

   

I'm open for any ideas... because currently I have no clue what's going wrong here...

Thanks,
     Michael

0 Likes
1 Solution
Anonymous
Not applicable

Rob1, Bob,

   

... thanks for your hints. In the meantime I found the error... by looking closer to the schematic of PSoC5LP Prototyping Kit (CY8CKIT-059) I noticed that Cypress connected a 1µF capacitor at Pin 3.2. That's the pin I used for ADC input... and for sure, the capacitor gets charged - the smaller the amount of current, the longer it takes... and that's why the delay is needed.

   

 

   

After changing the pin the Ohms meter project is working fine.

   

 

   

@Rob1: I had the same idea... but

   

      ADC_IsEndConversion(ADC_WAIT_FOR_RESULT);

   

should be blocking;  it does not return a result until the ADC conversion is complete. That's why I tried

   

 while( ADC_IsEndConversion(ADC_WAIT_FOR_RESULT) == 0) {}

   

as well.

   

 

   

@Bob: I didn't get your hint regarding "reference resistor" which allows for gain corrections... could you please add some more words on this idea? You made me curious...

   

 

   

Thanks for your hints,

   

       Michael

View solution in original post

0 Likes
3 Replies
RoBO_1287886
Level 4
Level 4
First solution authored 25 replies posted 10 replies posted

Dear sir,

   

to avoid issue, you can wait the end of conversion before read the result of conversion.

   

....

   

while(!ADC_SAR_IsEndConversion(ADC_SAR_RETURN_STATUS));
SAR_result = ADC_SAR_GetResult16();

   

....

   

 

   

yours,

   

Rob1

0 Likes
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

Generally your code is ok. There is absolutely no need for a wait after the conversion is done.

   

You might have three sources for errors in your design:

   
        
  • Noise on the input lines
  •     
  • Noise at your Vref (where does that come from? Buffered ??)
  •     
  • No reference resistor used
  •    
   

A more reliable design will use a reference resistor in series to the R to measure. This will allow for gain corrections of the ADC and offset cancelling.

   

 

   

Bob

0 Likes
Anonymous
Not applicable

Rob1, Bob,

   

... thanks for your hints. In the meantime I found the error... by looking closer to the schematic of PSoC5LP Prototyping Kit (CY8CKIT-059) I noticed that Cypress connected a 1µF capacitor at Pin 3.2. That's the pin I used for ADC input... and for sure, the capacitor gets charged - the smaller the amount of current, the longer it takes... and that's why the delay is needed.

   

 

   

After changing the pin the Ohms meter project is working fine.

   

 

   

@Rob1: I had the same idea... but

   

      ADC_IsEndConversion(ADC_WAIT_FOR_RESULT);

   

should be blocking;  it does not return a result until the ADC conversion is complete. That's why I tried

   

 while( ADC_IsEndConversion(ADC_WAIT_FOR_RESULT) == 0) {}

   

as well.

   

 

   

@Bob: I didn't get your hint regarding "reference resistor" which allows for gain corrections... could you please add some more words on this idea? You made me curious...

   

 

   

Thanks for your hints,

   

       Michael

0 Likes