Skip to content

Commit f92ce2d

Browse files
author
Owen
authored
Merge pull request #246 from sparkfun/adcDifferential
2 parents 8dbc5d1 + 23c8391 commit f92ce2d

File tree

14 files changed

+128
-19
lines changed

14 files changed

+128
-19
lines changed

Diff for: cores/arduino/ard_sup/analog/ap3_analog.cpp

+24-4
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,27 @@ uint16_t analogRead(uint8_t pinNumber)
159159
{
160160
if (ap3_analog_configure_map[indi].isAnalog == false)
161161
{
162-
if (ap3_set_pin_to_analog(pinNumber) != AP3_OK)
162+
if (padNumber == AP3_ADC_DIFF0_PAD)
163+
{
164+
ap3_err_t retval = AP3_ERR;
165+
retval = ap3_set_pin_to_analog(ap3_gpio_pad2pin(12));
166+
retval = ap3_set_pin_to_analog(ap3_gpio_pad2pin(13));
167+
if (retval != AP3_OK)
168+
{
169+
return 0; //Error
170+
}
171+
}
172+
else if (padNumber == AP3_ADC_DIFF1_PAD)
173+
{
174+
ap3_err_t retval = AP3_ERR;
175+
retval = ap3_set_pin_to_analog(ap3_gpio_pad2pin(14));
176+
retval = ap3_set_pin_to_analog(ap3_gpio_pad2pin(15));
177+
if (retval != AP3_OK)
178+
{
179+
return 0; //Error
180+
}
181+
}
182+
else if (ap3_set_pin_to_analog(pinNumber) != AP3_OK)
163183
{
164184
//Serial.println("Error - set pin to analog");
165185
return 0; //Error
@@ -335,13 +355,12 @@ ap3_err_t ap3_adc_setup()
335355
}
336356

337357
//Set function of pin to analog input
338-
//TODO Support differential pairs 0/1
339358
ap3_err_t ap3_set_pin_to_analog(uint8_t pinNumber)
340359
{
341360
ap3_err_t retval = AP3_ERR;
342-
343361
uint8_t funcsel = 0;
344362
am_hal_gpio_pincfg_t pincfg = AP3_PINCFG_INPUT;
363+
345364
retval = ap3_analog_pad_funcsel(ap3_gpio_pin2pad(pinNumber), &funcsel);
346365

347366
if (retval != AP3_OK)
@@ -350,10 +369,11 @@ ap3_err_t ap3_set_pin_to_analog(uint8_t pinNumber)
350369
}
351370
pincfg.uFuncSel = funcsel; // set the proper function select option for this instance/pin/type combination
352371
pinMode(pinNumber, pincfg, &retval);
372+
353373
return retval;
354374
}
355375

356-
//Given pin number, assign ADC function
376+
//Given pad number, get ADC function
357377
ap3_err_t ap3_analog_pad_funcsel(ap3_gpio_pad_t padNumber, uint8_t *funcsel)
358378
{
359379
ap3_err_t retval = AP3_ERR;

Diff for: cores/arduino/ard_sup/analog/ap3_analog_structures.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ const ap3_analog_pad_map_elem_t ap3_analog_map[AP3_ANALOG_PADS] = {
2828
{.pad = 11, .funcsel = AM_HAL_PIN_11_ADCSE2},
2929
{.pad = 12, .funcsel = AM_HAL_PIN_12_ADCD0NSE9},
3030
{.pad = 13, .funcsel = AM_HAL_PIN_13_ADCD0PSE8},
31+
{.pad = 14, .funcsel = AM_HAL_PIN_14_ADCD1P},
32+
{.pad = 15, .funcsel = AM_HAL_PIN_15_ADCD1N},
3133
{.pad = 16, .funcsel = AM_HAL_PIN_16_ADCSE0},
3234
{.pad = 29, .funcsel = AM_HAL_PIN_29_ADCSE1},
3335
{.pad = 31, .funcsel = AM_HAL_PIN_31_ADCSE3},
@@ -50,8 +52,8 @@ ap3_analog_configure_map_elem_t ap3_analog_configure_map[AP3_ANALOG_CHANNELS] =
5052
{.pad = 33, .isAnalog = false},
5153
{.pad = 34, .isAnalog = false},
5254
{.pad = 35, .isAnalog = false},
53-
{.pad = AP3_ADC_DIFF0_PAD, .isAnalog = true},
54-
{.pad = AP3_ADC_DIFF1_PAD, .isAnalog = true},
55+
{.pad = AP3_ADC_DIFF0_PAD, .isAnalog = false},
56+
{.pad = AP3_ADC_DIFF1_PAD, .isAnalog = false},
5557
{.pad = AP3_ADC_TEMP_PAD, .isAnalog = true},
5658
{.pad = AP3_ADC_DIV3_PAD, .isAnalog = true},
5759
{.pad = AP3_ADC_VSS_PAD, .isAnalog = true},

Diff for: cores/arduino/ard_sup/ap3_analog_types.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ SOFTWARE.
2323
#ifndef _AP3_ANALOG_TYPES_H_
2424
#define _AP3_ANALOG_TYPES_H_
2525

26-
#define AP3_ANALOG_PADS 10
26+
#define AP3_ANALOG_PADS 12
2727
#define AP3_ANALOG_CHANNELS 15
2828

2929
enum EXTRA_ADC_PADS

Diff for: cores/arduino/ard_sup/ap3_gpio.h

+13-12
Original file line numberDiff line numberDiff line change
@@ -35,25 +35,26 @@ extern const am_hal_gpio_pincfg_t g_AM_HAL_GPIO_OPEN_DRAIN_WITH_READ_12;
3535
extern const am_hal_gpio_pincfg_t g_AM_HAL_GPIO_INPUT_PULLDOWN;
3636

3737
// macros pointing to internal apollo3 GPIO pincfg structures
38-
#define AP3_PINCFG_INPUT (g_AM_HAL_GPIO_INPUT)
39-
#define AP3_PINCFG_OUTPUT (g_AM_HAL_GPIO_OUTPUT_WITH_READ_12)
40-
#define AP3_PINCFG_INPUT_PULLUP (g_AM_HAL_GPIO_INPUT_PULLUP)
41-
#define AP3_PINCFG_INPUT_PULLDOWN (g_AM_HAL_GPIO_INPUT_PULLDOWN)
42-
#define AP3_PINCFG_OPEN_DRAIN (g_AM_HAL_GPIO_OPEN_DRAIN_WITH_READ_12)
43-
#define AP3_PINCFG_TRISTATE (g_AM_HAL_GPIO_TRISTATE)
38+
#define AP3_PINCFG_INPUT (g_AM_HAL_GPIO_INPUT)
39+
#define AP3_PINCFG_OUTPUT (g_AM_HAL_GPIO_OUTPUT_WITH_READ_12)
40+
#define AP3_PINCFG_INPUT_PULLUP (g_AM_HAL_GPIO_INPUT_PULLUP)
41+
#define AP3_PINCFG_INPUT_PULLDOWN (g_AM_HAL_GPIO_INPUT_PULLDOWN)
42+
#define AP3_PINCFG_OPEN_DRAIN (g_AM_HAL_GPIO_OPEN_DRAIN_WITH_READ_12)
43+
#define AP3_PINCFG_TRISTATE (g_AM_HAL_GPIO_TRISTATE)
4444

4545
// constants for Arduino pin modes
46-
#define INPUT (0x00)
47-
#define OUTPUT (0x01)
48-
#define INPUT_PULLUP (0x02)
49-
#define INPUT_PULLDOWN (0x03)
50-
#define OPEN_DRAIN (0x04)
51-
#define TRISTATE (0x05)
46+
#define INPUT (0x00)
47+
#define OUTPUT (0x01)
48+
#define INPUT_PULLUP (0x02)
49+
#define INPUT_PULLDOWN (0x03)
50+
#define OPEN_DRAIN (0x04)
51+
#define TRISTATE (0x05)
5252

5353
#define AP3_GPIO_MAX_PADS (50)
5454
#define AP3_GPIO_IS_VALID(pad) ((pad >= 0) && (pad < AP3_GPIO_MAX_PADS))
5555

5656
extern ap3_gpio_pad_t ap3_gpio_pin2pad(ap3_gpio_pin_t pin);
57+
extern ap3_gpio_pin_t ap3_gpio_pad2pin(ap3_gpio_pad_t pad);
5758
#define AP3_GPIO_PAD_UNUSED (255)
5859

5960
#define AP3_GPIO_DEFAULT_PINCFG AP3_GPIO_PINCFG_NULL

Diff for: cores/arduino/ard_sup/gpio/ap3_gpio.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ ap3_gpio_pad_t ap3_gpio_pin2pad(ap3_gpio_pin_t pin)
4141
return ap3_variant_pinmap[pin];
4242
}
4343

44+
ap3_gpio_pin_t ap3_gpio_pad2pin(ap3_gpio_pad_t pad)
45+
{
46+
for (int x = 0; x < AP3_VARIANT_NUM_PINS; x++)
47+
{
48+
if (ap3_variant_pinmap[x] == pad)
49+
return (x);
50+
}
51+
return (AP3_GPIO_PAD_UNUSED);
52+
}
53+
4454
typedef void (*voidFuncPtr)(void);
4555
typedef void (*voidFuncPtrArg)(void *);
4656
typedef struct
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
Using the differential ADC
3+
By: Nathan Seidle
4+
SparkFun Electronics
5+
Date: July 17th, 2020
6+
License: This code is public domain. Based on deepsleep.c from Ambiq SDK v2.2.0.
7+
8+
There are two differential ADC ports on the Artemis. These are located
9+
on pads 12/13 (DIFF0N/DIFF0P) and 14/15 (DIFF1P/DIFF10).
10+
11+
A differential ADC port measures -1.0V to 1.0V with
12+
0 = -1.0V, 8192 = 0V, and 16383 = 1.0V when the ADC is in 14-bit mode.
13+
14+
Using a trimpot, attach DIFF- to GND and DIFF+ to the center pin of the trimpot.
15+
Connect the outer pins of the trimpot to 3.3V and GND.
16+
Twisting the trimpot you should see the voltage change from 0 to 1.0V.
17+
Switching DIFF-/+ you should see -1.0V to 0V.
18+
19+
SparkFun labored with love to create this code. Feel like supporting open source hardware?
20+
Buy a board from SparkFun! https://www.sparkfun.com/products/15376
21+
*/
22+
23+
#define ANALOG_RESOLUTION 14 //Artemis has 14 bit ADC but can range from 8 to 14 bit
24+
25+
int maxADCValue = pow(2, ANALOG_RESOLUTION);
26+
27+
void setup()
28+
{
29+
Serial.begin(115200);
30+
Serial.println("Differential analog conversion example");
31+
32+
pinMode(LED_BUILTIN, OUTPUT);
33+
34+
analogReadResolution(ANALOG_RESOLUTION); //Default is 10 bit. Increase to 14 bit.
35+
}
36+
37+
void loop()
38+
{
39+
int myAnalog0 = analogRead(ADIFF0); //Pads 12/13. Pins 9/10 on RedBoard Artemis.
40+
//int myAnalog0 = analogRead(ADIFF1); //Pads 14/15
41+
float myVoltage0 = mapfloat(myAnalog0, 0, maxADCValue, -1.0, 1.0);
42+
Serial.print("Diff0 voltage: ");
43+
Serial.print(myVoltage0, 3);
44+
Serial.println();
45+
46+
digitalWrite(LED_BUILTIN, HIGH);
47+
delay(25);
48+
digitalWrite(LED_BUILTIN, LOW);
49+
delay(25);
50+
}
51+
52+
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
53+
{
54+
if (x > in_max)
55+
x = in_max;
56+
57+
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
58+
}

Diff for: variants/artemis_thing_plus/config/variant.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,4 @@ const ap3_gpio_pin_t ap3_analog_A4 = 23;
7070
const ap3_gpio_pin_t ap3_analog_A5 = 24;
7171
const ap3_gpio_pin_t ap3_analog_A6 = 3;
7272
const ap3_gpio_pin_t ap3_analog_A7 = 9;
73+
const ap3_gpio_pin_t ap3_analog_DIFF0 = AP3_ADC_DIFF0_PAD;

Diff for: variants/artemis_thing_plus/config/variant.h

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ extern Uart Serial1;
5757
#define A5 ap3_analog_A5
5858
#define A6 ap3_analog_A6
5959
#define A7 ap3_analog_A7
60+
#define ADIFF0 ap3_analog_DIFF0
6061

6162
// Promise the existence of analog pin names
6263
extern const ap3_gpio_pin_t ap3_analog_A0;
@@ -67,6 +68,7 @@ extern const ap3_gpio_pin_t ap3_analog_A4;
6768
extern const ap3_gpio_pin_t ap3_analog_A5;
6869
extern const ap3_gpio_pin_t ap3_analog_A6;
6970
extern const ap3_gpio_pin_t ap3_analog_A7;
71+
extern const ap3_gpio_pin_t ap3_analog_DIFF0;
7072

7173
#define LED_BUILTIN 18
7274

Diff for: variants/redboard_artemis/config/variant.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,5 @@ const ap3_gpio_pin_t ap3_analog_A6 = 2;
7676
const ap3_gpio_pin_t ap3_analog_A8 = 8;
7777
const ap3_gpio_pin_t ap3_analog_A9 = 9;
7878
const ap3_gpio_pin_t ap3_analog_A10 = 10;
79+
const ap3_gpio_pin_t ap3_analog_DIFF0 = AP3_ADC_DIFF0_PAD;
80+
const ap3_gpio_pin_t ap3_analog_DIFF1 = AP3_ADC_DIFF1_PAD;

Diff for: variants/redboard_artemis/config/variant.h

+4
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ extern Uart Serial1;
7272
#define A8 ap3_analog_A8
7373
#define A9 ap3_analog_A9
7474
#define A10 ap3_analog_A10
75+
#define ADIFF0 ap3_analog_DIFF0
76+
#define ADIFF1 ap3_analog_DIFF1
7577

7678
// Promise the existence of analog pin names
7779
extern const ap3_gpio_pin_t ap3_analog_A0;
@@ -85,6 +87,8 @@ extern const ap3_gpio_pin_t ap3_analog_A6;
8587
extern const ap3_gpio_pin_t ap3_analog_A8;
8688
extern const ap3_gpio_pin_t ap3_analog_A9;
8789
extern const ap3_gpio_pin_t ap3_analog_A10;
90+
extern const ap3_gpio_pin_t ap3_analog_DIFF0;
91+
extern const ap3_gpio_pin_t ap3_analog_DIFF1;
8892

8993
#define LED_BUILTIN 13
9094

Diff for: variants/redboard_artemis_atp/config/variant.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,5 @@ extern const ap3_gpio_pin_t ap3_analog_A12 = 12;
9292
extern const ap3_gpio_pin_t ap3_analog_A32 = 32;
9393
extern const ap3_gpio_pin_t ap3_analog_A33 = 33;
9494
extern const ap3_gpio_pin_t ap3_analog_A35 = 35;
95+
extern const ap3_gpio_pin_t ap3_analog_DIFF0 = AP3_ADC_DIFF0_PAD;
96+
extern const ap3_gpio_pin_t ap3_analog_DIFF1 = AP3_ADC_DIFF1_PAD;

Diff for: variants/redboard_artemis_atp/config/variant.h

+4
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ extern Uart Serial1;
5858
#define A32 ap3_analog_A32
5959
#define A33 ap3_analog_A33
6060
#define A35 ap3_analog_A35
61+
#define ADIFF0 ap3_analog_DIFF0
62+
#define ADIFF1 ap3_analog_DIFF1
6163

6264
// Promise the existence of analog pin names
6365
extern const ap3_gpio_pin_t ap3_analog_A29;
@@ -70,6 +72,8 @@ extern const ap3_gpio_pin_t ap3_analog_A12;
7072
extern const ap3_gpio_pin_t ap3_analog_A32;
7173
extern const ap3_gpio_pin_t ap3_analog_A33;
7274
extern const ap3_gpio_pin_t ap3_analog_A35;
75+
extern const ap3_gpio_pin_t ap3_analog_DIFF0;
76+
extern const ap3_gpio_pin_t ap3_analog_DIFF1;
7377

7478
#define LED_BUILTIN 5
7579

Diff for: variants/redboard_artemis_nano/config/variant.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,4 @@ const ap3_gpio_pin_t ap3_analog_A5 = 5;
6565
const ap3_gpio_pin_t ap3_analog_A14 = 14;
6666
const ap3_gpio_pin_t ap3_analog_A15 = 15;
6767
const ap3_gpio_pin_t ap3_analog_A16 = 16;
68+
const ap3_gpio_pin_t ap3_analog_DIFF0 = AP3_ADC_DIFF0_PAD;

Diff for: variants/redboard_artemis_nano/config/variant.h

+2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ extern Uart Serial1;
5656
#define A14 ap3_analog_A14
5757
#define A15 ap3_analog_A15
5858
#define A16 ap3_analog_A16
59+
#define ADIFF0 ap3_analog_DIFF0
5960

6061
// Promise the existence of analog pin names
6162
extern const ap3_gpio_pin_t ap3_analog_A0;
@@ -66,6 +67,7 @@ extern const ap3_gpio_pin_t ap3_analog_A5;
6667
extern const ap3_gpio_pin_t ap3_analog_A14;
6768
extern const ap3_gpio_pin_t ap3_analog_A15;
6869
extern const ap3_gpio_pin_t ap3_analog_A16;
70+
extern const ap3_gpio_pin_t ap3_analog_DIFF0;
6971

7072
#define LED_BUILTIN 19
7173

0 commit comments

Comments
 (0)