ADC Accuracy using SparkFun RedBoard Artemis

I was trying to do some simple ADC’s using the Redboard Artermis and I can’t get my results to match my meter. I took into account the 2.0VDC reference and the 10 bit ADC. The Meter reads 1.4V and the redboard is giving me 1.3V. I am trying to read an NTC style thermocouple with a 100K in series resistor so I know that I have a high impedance load.

I found an app note in their documentation for the Apollo2 ( a little outdated) about setting up the ADC settling time. The problem is that I can’t figure out what register or HAL command is used to control the settling time.

https://www.ambiqmicro.com/static/mcu/f … rev1_1.pdf

Here is my read:

double voltage = analogRead(A0)*2.0/1024;

Just wondering if anyone else has run into this issue. If I plug a traditional atmel style redboard in, and change the reference to 5.0, all works well and the voltages match.

I looked through the

am_hal_adc.c file

and could not find what I was looking for.

Thanks,

Tom

no… you can not change that fixed number. You can only adjust the clock speed in ap3_analog.cpp, function ap3_adc_setup(). You can try to set the clock to AM_HAL_ADC_CLKSEL_HFRC_DIV2 instead of AM_HAL_ADC_CLKSEL_HFRC to reduce to clock speed to half. On a quick test reading the VDD I do not see a difference however. Measuring the VDD with a digital Fluke multimeter gives 3.137. The ADC reading gives a voltage of is 3.146 in both cases on 10bit. Alternative you can try to increase / decrease the resolution with the call analogReadResolution(uint8_t bits)

I did some more experiments to see what was going on since I was inspired by someone’s quick reply to my problem. I got rid of the thermocouple and just used a breadboard to build some voltage dividers. I used a 4.7K and 4.7K for one with a 3.3 V supply, and results:

Fluke Meter: 1.651V

ADC as packaged: 1.625V

After clock adjust: 1.656V

Then I built a 100K and 100K to give a higher impedance on the input.

Fluke Meter: 1.643V

ADC as packaged: 1.316V

After clock change: 1.357V

Change from 10 bit to 14 bit: 1.373V

Then I researched hal to see if I could find clock with even more division but they do not exist.

My theory is the super quick sample rate capability comes with the drawback of not being able to have enough time to charge to the cap in the ADC with high impedance loads. Kind of a bummer for this project as I was excited to use the tensorflow aspect with a control system that depended on a 100K thermo couple.

https://cdn.sparkfun.com/assets/d/a/7/c … v0_9_1.pdf

In here on page 780/909 it shows the dynamics of the sampling. Not 100% sure what this means but it sounds like a 14 bit ADC allows for 40 cycles of settling time whereas the 8 bit allows for 18 cycles. That would explain why the results above for the 100K were better at 14 bit but will way off.

TSNGLSLOT_SC

NCMP_PM14

Delay from scan start to scan

complete, precision mode 14

40 cycles

TSNGLSLOT_SC

NCMP_PM8

Delay from scan start to scan

complete, precision mode 8

18 cycles

Actually the Arduino Artemis library is always using 14 bit (set in ap3_analog.cpp, function ap3_change_channel()). When a read is performed at the end of analogRead() it will scale down the result to the requested bits. I did a change to hard code 10-bits to test but it does not bring a difference.

I suspect the timing could the issue but also interesting to me is the impedance difference in the datasheet (page 780) between ADC channel 0 and channel 1-7. The channel 0 is typical 720K where channel 1-7 is 3600M ohm. Channel 0 is connected to pad 16, where the 1 - 7 are connected to 29,11,31,32,33,34,35. Not sure which channel you have used for your test, but maybe try another.