diff --git a/cores/arduino/ard_sup/analog/ap3_analog.cpp b/cores/arduino/ard_sup/analog/ap3_analog.cpp index 636116ca..c06b04e4 100644 --- a/cores/arduino/ard_sup/analog/ap3_analog.cpp +++ b/cores/arduino/ard_sup/analog/ap3_analog.cpp @@ -159,7 +159,27 @@ uint16_t analogRead(uint8_t pinNumber) { if (ap3_analog_configure_map[indi].isAnalog == false) { - if (ap3_set_pin_to_analog(pinNumber) != AP3_OK) + if (padNumber == AP3_ADC_DIFF0_PAD) + { + ap3_err_t retval = AP3_ERR; + retval = ap3_set_pin_to_analog(ap3_gpio_pad2pin(12)); + retval = ap3_set_pin_to_analog(ap3_gpio_pad2pin(13)); + if (retval != AP3_OK) + { + return 0; //Error + } + } + else if (padNumber == AP3_ADC_DIFF1_PAD) + { + ap3_err_t retval = AP3_ERR; + retval = ap3_set_pin_to_analog(ap3_gpio_pad2pin(14)); + retval = ap3_set_pin_to_analog(ap3_gpio_pad2pin(15)); + if (retval != AP3_OK) + { + return 0; //Error + } + } + else if (ap3_set_pin_to_analog(pinNumber) != AP3_OK) { //Serial.println("Error - set pin to analog"); return 0; //Error @@ -335,13 +355,12 @@ ap3_err_t ap3_adc_setup() } //Set function of pin to analog input -//TODO Support differential pairs 0/1 ap3_err_t ap3_set_pin_to_analog(uint8_t pinNumber) { ap3_err_t retval = AP3_ERR; - uint8_t funcsel = 0; am_hal_gpio_pincfg_t pincfg = AP3_PINCFG_INPUT; + retval = ap3_analog_pad_funcsel(ap3_gpio_pin2pad(pinNumber), &funcsel); if (retval != AP3_OK) @@ -350,10 +369,11 @@ ap3_err_t ap3_set_pin_to_analog(uint8_t pinNumber) } pincfg.uFuncSel = funcsel; // set the proper function select option for this instance/pin/type combination pinMode(pinNumber, pincfg, &retval); + return retval; } -//Given pin number, assign ADC function +//Given pad number, get ADC function ap3_err_t ap3_analog_pad_funcsel(ap3_gpio_pad_t padNumber, uint8_t *funcsel) { ap3_err_t retval = AP3_ERR; diff --git a/cores/arduino/ard_sup/analog/ap3_analog_structures.c b/cores/arduino/ard_sup/analog/ap3_analog_structures.c index bb15a211..1a871690 100644 --- a/cores/arduino/ard_sup/analog/ap3_analog_structures.c +++ b/cores/arduino/ard_sup/analog/ap3_analog_structures.c @@ -28,6 +28,8 @@ const ap3_analog_pad_map_elem_t ap3_analog_map[AP3_ANALOG_PADS] = { {.pad = 11, .funcsel = AM_HAL_PIN_11_ADCSE2}, {.pad = 12, .funcsel = AM_HAL_PIN_12_ADCD0NSE9}, {.pad = 13, .funcsel = AM_HAL_PIN_13_ADCD0PSE8}, + {.pad = 14, .funcsel = AM_HAL_PIN_14_ADCD1P}, + {.pad = 15, .funcsel = AM_HAL_PIN_15_ADCD1N}, {.pad = 16, .funcsel = AM_HAL_PIN_16_ADCSE0}, {.pad = 29, .funcsel = AM_HAL_PIN_29_ADCSE1}, {.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] = {.pad = 33, .isAnalog = false}, {.pad = 34, .isAnalog = false}, {.pad = 35, .isAnalog = false}, - {.pad = AP3_ADC_DIFF0_PAD, .isAnalog = true}, - {.pad = AP3_ADC_DIFF1_PAD, .isAnalog = true}, + {.pad = AP3_ADC_DIFF0_PAD, .isAnalog = false}, + {.pad = AP3_ADC_DIFF1_PAD, .isAnalog = false}, {.pad = AP3_ADC_TEMP_PAD, .isAnalog = true}, {.pad = AP3_ADC_DIV3_PAD, .isAnalog = true}, {.pad = AP3_ADC_VSS_PAD, .isAnalog = true}, diff --git a/cores/arduino/ard_sup/ap3_analog_types.h b/cores/arduino/ard_sup/ap3_analog_types.h index b08e690e..56c37d66 100644 --- a/cores/arduino/ard_sup/ap3_analog_types.h +++ b/cores/arduino/ard_sup/ap3_analog_types.h @@ -23,7 +23,7 @@ SOFTWARE. #ifndef _AP3_ANALOG_TYPES_H_ #define _AP3_ANALOG_TYPES_H_ -#define AP3_ANALOG_PADS 10 +#define AP3_ANALOG_PADS 12 #define AP3_ANALOG_CHANNELS 15 enum EXTRA_ADC_PADS diff --git a/cores/arduino/ard_sup/ap3_gpio.h b/cores/arduino/ard_sup/ap3_gpio.h index 7f1601bb..ec01a5bb 100644 --- a/cores/arduino/ard_sup/ap3_gpio.h +++ b/cores/arduino/ard_sup/ap3_gpio.h @@ -35,25 +35,26 @@ extern const am_hal_gpio_pincfg_t g_AM_HAL_GPIO_OPEN_DRAIN_WITH_READ_12; extern const am_hal_gpio_pincfg_t g_AM_HAL_GPIO_INPUT_PULLDOWN; // macros pointing to internal apollo3 GPIO pincfg structures -#define AP3_PINCFG_INPUT (g_AM_HAL_GPIO_INPUT) -#define AP3_PINCFG_OUTPUT (g_AM_HAL_GPIO_OUTPUT_WITH_READ_12) -#define AP3_PINCFG_INPUT_PULLUP (g_AM_HAL_GPIO_INPUT_PULLUP) -#define AP3_PINCFG_INPUT_PULLDOWN (g_AM_HAL_GPIO_INPUT_PULLDOWN) -#define AP3_PINCFG_OPEN_DRAIN (g_AM_HAL_GPIO_OPEN_DRAIN_WITH_READ_12) -#define AP3_PINCFG_TRISTATE (g_AM_HAL_GPIO_TRISTATE) +#define AP3_PINCFG_INPUT (g_AM_HAL_GPIO_INPUT) +#define AP3_PINCFG_OUTPUT (g_AM_HAL_GPIO_OUTPUT_WITH_READ_12) +#define AP3_PINCFG_INPUT_PULLUP (g_AM_HAL_GPIO_INPUT_PULLUP) +#define AP3_PINCFG_INPUT_PULLDOWN (g_AM_HAL_GPIO_INPUT_PULLDOWN) +#define AP3_PINCFG_OPEN_DRAIN (g_AM_HAL_GPIO_OPEN_DRAIN_WITH_READ_12) +#define AP3_PINCFG_TRISTATE (g_AM_HAL_GPIO_TRISTATE) // constants for Arduino pin modes -#define INPUT (0x00) -#define OUTPUT (0x01) -#define INPUT_PULLUP (0x02) -#define INPUT_PULLDOWN (0x03) -#define OPEN_DRAIN (0x04) -#define TRISTATE (0x05) +#define INPUT (0x00) +#define OUTPUT (0x01) +#define INPUT_PULLUP (0x02) +#define INPUT_PULLDOWN (0x03) +#define OPEN_DRAIN (0x04) +#define TRISTATE (0x05) #define AP3_GPIO_MAX_PADS (50) #define AP3_GPIO_IS_VALID(pad) ((pad >= 0) && (pad < AP3_GPIO_MAX_PADS)) extern ap3_gpio_pad_t ap3_gpio_pin2pad(ap3_gpio_pin_t pin); +extern ap3_gpio_pin_t ap3_gpio_pad2pin(ap3_gpio_pad_t pad); #define AP3_GPIO_PAD_UNUSED (255) #define AP3_GPIO_DEFAULT_PINCFG AP3_GPIO_PINCFG_NULL diff --git a/cores/arduino/ard_sup/gpio/ap3_gpio.cpp b/cores/arduino/ard_sup/gpio/ap3_gpio.cpp index 1ce8b078..ab349991 100644 --- a/cores/arduino/ard_sup/gpio/ap3_gpio.cpp +++ b/cores/arduino/ard_sup/gpio/ap3_gpio.cpp @@ -41,6 +41,16 @@ ap3_gpio_pad_t ap3_gpio_pin2pad(ap3_gpio_pin_t pin) return ap3_variant_pinmap[pin]; } +ap3_gpio_pin_t ap3_gpio_pad2pin(ap3_gpio_pad_t pad) +{ + for (int x = 0; x < AP3_VARIANT_NUM_PINS; x++) + { + if (ap3_variant_pinmap[x] == pad) + return (x); + } + return (AP3_GPIO_PAD_UNUSED); +} + typedef void (*voidFuncPtr)(void); typedef void (*voidFuncPtrArg)(void *); typedef struct diff --git a/libraries/Examples/examples/Advanced/Differential_ADC/Differential_ADC.ino b/libraries/Examples/examples/Advanced/Differential_ADC/Differential_ADC.ino new file mode 100644 index 00000000..2946f11f --- /dev/null +++ b/libraries/Examples/examples/Advanced/Differential_ADC/Differential_ADC.ino @@ -0,0 +1,58 @@ +/* + Using the differential ADC + By: Nathan Seidle + SparkFun Electronics + Date: July 17th, 2020 + License: This code is public domain. Based on deepsleep.c from Ambiq SDK v2.2.0. + + There are two differential ADC ports on the Artemis. These are located + on pads 12/13 (DIFF0N/DIFF0P) and 14/15 (DIFF1P/DIFF10). + + A differential ADC port measures -1.0V to 1.0V with + 0 = -1.0V, 8192 = 0V, and 16383 = 1.0V when the ADC is in 14-bit mode. + + Using a trimpot, attach DIFF- to GND and DIFF+ to the center pin of the trimpot. + Connect the outer pins of the trimpot to 3.3V and GND. + Twisting the trimpot you should see the voltage change from 0 to 1.0V. + Switching DIFF-/+ you should see -1.0V to 0V. + + SparkFun labored with love to create this code. Feel like supporting open source hardware? + Buy a board from SparkFun! https://www.sparkfun.com/products/15376 +*/ + +#define ANALOG_RESOLUTION 14 //Artemis has 14 bit ADC but can range from 8 to 14 bit + +int maxADCValue = pow(2, ANALOG_RESOLUTION); + +void setup() +{ + Serial.begin(115200); + Serial.println("Differential analog conversion example"); + + pinMode(LED_BUILTIN, OUTPUT); + + analogReadResolution(ANALOG_RESOLUTION); //Default is 10 bit. Increase to 14 bit. +} + +void loop() +{ + int myAnalog0 = analogRead(ADIFF0); //Pads 12/13. Pins 9/10 on RedBoard Artemis. + //int myAnalog0 = analogRead(ADIFF1); //Pads 14/15 + float myVoltage0 = mapfloat(myAnalog0, 0, maxADCValue, -1.0, 1.0); + Serial.print("Diff0 voltage: "); + Serial.print(myVoltage0, 3); + Serial.println(); + + digitalWrite(LED_BUILTIN, HIGH); + delay(25); + digitalWrite(LED_BUILTIN, LOW); + delay(25); +} + +float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) +{ + if (x > in_max) + x = in_max; + + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} \ No newline at end of file diff --git a/variants/artemis_thing_plus/config/variant.cpp b/variants/artemis_thing_plus/config/variant.cpp index aba19adf..8f1f40c1 100644 --- a/variants/artemis_thing_plus/config/variant.cpp +++ b/variants/artemis_thing_plus/config/variant.cpp @@ -70,3 +70,4 @@ const ap3_gpio_pin_t ap3_analog_A4 = 23; const ap3_gpio_pin_t ap3_analog_A5 = 24; const ap3_gpio_pin_t ap3_analog_A6 = 3; const ap3_gpio_pin_t ap3_analog_A7 = 9; +const ap3_gpio_pin_t ap3_analog_DIFF0 = AP3_ADC_DIFF0_PAD; diff --git a/variants/artemis_thing_plus/config/variant.h b/variants/artemis_thing_plus/config/variant.h index 1d170d90..44cf137f 100644 --- a/variants/artemis_thing_plus/config/variant.h +++ b/variants/artemis_thing_plus/config/variant.h @@ -57,6 +57,7 @@ extern Uart Serial1; #define A5 ap3_analog_A5 #define A6 ap3_analog_A6 #define A7 ap3_analog_A7 +#define ADIFF0 ap3_analog_DIFF0 // Promise the existence of analog pin names extern const ap3_gpio_pin_t ap3_analog_A0; @@ -67,6 +68,7 @@ extern const ap3_gpio_pin_t ap3_analog_A4; extern const ap3_gpio_pin_t ap3_analog_A5; extern const ap3_gpio_pin_t ap3_analog_A6; extern const ap3_gpio_pin_t ap3_analog_A7; +extern const ap3_gpio_pin_t ap3_analog_DIFF0; #define LED_BUILTIN 18 diff --git a/variants/redboard_artemis/config/variant.cpp b/variants/redboard_artemis/config/variant.cpp index e7d22c6c..0892ef02 100644 --- a/variants/redboard_artemis/config/variant.cpp +++ b/variants/redboard_artemis/config/variant.cpp @@ -76,3 +76,5 @@ const ap3_gpio_pin_t ap3_analog_A6 = 2; const ap3_gpio_pin_t ap3_analog_A8 = 8; const ap3_gpio_pin_t ap3_analog_A9 = 9; const ap3_gpio_pin_t ap3_analog_A10 = 10; +const ap3_gpio_pin_t ap3_analog_DIFF0 = AP3_ADC_DIFF0_PAD; +const ap3_gpio_pin_t ap3_analog_DIFF1 = AP3_ADC_DIFF1_PAD; diff --git a/variants/redboard_artemis/config/variant.h b/variants/redboard_artemis/config/variant.h index 5f62ad53..5c2e278c 100644 --- a/variants/redboard_artemis/config/variant.h +++ b/variants/redboard_artemis/config/variant.h @@ -72,6 +72,8 @@ extern Uart Serial1; #define A8 ap3_analog_A8 #define A9 ap3_analog_A9 #define A10 ap3_analog_A10 +#define ADIFF0 ap3_analog_DIFF0 +#define ADIFF1 ap3_analog_DIFF1 // Promise the existence of analog pin names extern const ap3_gpio_pin_t ap3_analog_A0; @@ -85,6 +87,8 @@ extern const ap3_gpio_pin_t ap3_analog_A6; extern const ap3_gpio_pin_t ap3_analog_A8; extern const ap3_gpio_pin_t ap3_analog_A9; extern const ap3_gpio_pin_t ap3_analog_A10; +extern const ap3_gpio_pin_t ap3_analog_DIFF0; +extern const ap3_gpio_pin_t ap3_analog_DIFF1; #define LED_BUILTIN 13 diff --git a/variants/redboard_artemis_atp/config/variant.cpp b/variants/redboard_artemis_atp/config/variant.cpp index a7a3d0c9..885939d4 100644 --- a/variants/redboard_artemis_atp/config/variant.cpp +++ b/variants/redboard_artemis_atp/config/variant.cpp @@ -92,3 +92,5 @@ extern const ap3_gpio_pin_t ap3_analog_A12 = 12; extern const ap3_gpio_pin_t ap3_analog_A32 = 32; extern const ap3_gpio_pin_t ap3_analog_A33 = 33; extern const ap3_gpio_pin_t ap3_analog_A35 = 35; +extern const ap3_gpio_pin_t ap3_analog_DIFF0 = AP3_ADC_DIFF0_PAD; +extern const ap3_gpio_pin_t ap3_analog_DIFF1 = AP3_ADC_DIFF1_PAD; diff --git a/variants/redboard_artemis_atp/config/variant.h b/variants/redboard_artemis_atp/config/variant.h index fd08ff6d..9babc53c 100644 --- a/variants/redboard_artemis_atp/config/variant.h +++ b/variants/redboard_artemis_atp/config/variant.h @@ -58,6 +58,8 @@ extern Uart Serial1; #define A32 ap3_analog_A32 #define A33 ap3_analog_A33 #define A35 ap3_analog_A35 +#define ADIFF0 ap3_analog_DIFF0 +#define ADIFF1 ap3_analog_DIFF1 // Promise the existence of analog pin names extern const ap3_gpio_pin_t ap3_analog_A29; @@ -70,6 +72,8 @@ extern const ap3_gpio_pin_t ap3_analog_A12; extern const ap3_gpio_pin_t ap3_analog_A32; extern const ap3_gpio_pin_t ap3_analog_A33; extern const ap3_gpio_pin_t ap3_analog_A35; +extern const ap3_gpio_pin_t ap3_analog_DIFF0; +extern const ap3_gpio_pin_t ap3_analog_DIFF1; #define LED_BUILTIN 5 diff --git a/variants/redboard_artemis_nano/config/variant.cpp b/variants/redboard_artemis_nano/config/variant.cpp index 188e2470..e18f7730 100644 --- a/variants/redboard_artemis_nano/config/variant.cpp +++ b/variants/redboard_artemis_nano/config/variant.cpp @@ -65,3 +65,4 @@ const ap3_gpio_pin_t ap3_analog_A5 = 5; const ap3_gpio_pin_t ap3_analog_A14 = 14; const ap3_gpio_pin_t ap3_analog_A15 = 15; const ap3_gpio_pin_t ap3_analog_A16 = 16; +const ap3_gpio_pin_t ap3_analog_DIFF0 = AP3_ADC_DIFF0_PAD; diff --git a/variants/redboard_artemis_nano/config/variant.h b/variants/redboard_artemis_nano/config/variant.h index 37f10bec..1212dbf0 100644 --- a/variants/redboard_artemis_nano/config/variant.h +++ b/variants/redboard_artemis_nano/config/variant.h @@ -56,6 +56,7 @@ extern Uart Serial1; #define A14 ap3_analog_A14 #define A15 ap3_analog_A15 #define A16 ap3_analog_A16 +#define ADIFF0 ap3_analog_DIFF0 // Promise the existence of analog pin names extern const ap3_gpio_pin_t ap3_analog_A0; @@ -66,6 +67,7 @@ extern const ap3_gpio_pin_t ap3_analog_A5; extern const ap3_gpio_pin_t ap3_analog_A14; extern const ap3_gpio_pin_t ap3_analog_A15; extern const ap3_gpio_pin_t ap3_analog_A16; +extern const ap3_gpio_pin_t ap3_analog_DIFF0; #define LED_BUILTIN 19