diff --git a/src/examples/adc/adc.go b/src/examples/adc/adc.go index de8a7f885..37ae2ec71 100644 --- a/src/examples/adc/adc.go +++ b/src/examples/adc/adc.go @@ -14,7 +14,7 @@ func main() { led := machine.LED led.Configure(machine.PinConfig{Mode: machine.PinOutput}) - sensor := machine.ADC{machine.ADC2} + sensor := machine.ADC{Pin: machine.ADC2} sensor.Configure(machine.ADCConfig{}) for { diff --git a/src/machine/adc.go b/src/machine/adc.go index 739ca2ed6..783fecdcd 100644 --- a/src/machine/adc.go +++ b/src/machine/adc.go @@ -9,4 +9,11 @@ type ADCConfig struct { Reference uint32 // analog reference voltage (AREF) in millivolts Resolution uint32 // number of bits for a single conversion (e.g., 8, 10, 12) Samples uint32 // number of samples for a single conversion (e.g., 4, 8, 16, 32) + Bus uint8 // bus Number of ADC } + +const ( + AdcBusAuto = 0 + AdcBus0 = 1 + AdcBus1 = 2 +) diff --git a/src/machine/machine.go b/src/machine/machine.go index aa1a2f6bd..e73c466f0 100644 --- a/src/machine/machine.go +++ b/src/machine/machine.go @@ -44,4 +44,5 @@ func (p Pin) Low() { type ADC struct { Pin Pin + Bus uint8 } diff --git a/src/machine/machine_atsamd51.go b/src/machine/machine_atsamd51.go index f8b0a8650..7d6671663 100644 --- a/src/machine/machine_atsamd51.go +++ b/src/machine/machine_atsamd51.go @@ -813,6 +813,18 @@ func (a ADC) Configure(config ADCConfig) { } a.Pin.Configure(PinConfig{Mode: PinAnalog}) + + switch config.Bus { + case AdcBusAuto: + bus := a.getADCBus() + if bus == sam.ADC0 { + a.Bus = 0 + } else { + a.Bus = 1 + } + default: + a.Bus = config.Bus + } } // Get returns the current value of a ADC pin, in the range 0..0xffff. @@ -876,6 +888,12 @@ func (a ADC) Get() uint16 { } func (a ADC) getADCBus() *sam.ADC_Type { + if a.Bus == AdcBus0 { + return sam.ADC0 + } else if a.Bus == AdcBus1 { + return sam.ADC1 + } + if (a.Pin >= PB04 && a.Pin <= PB07) || (a.Pin >= PC00) { return sam.ADC1 } @@ -887,9 +905,17 @@ func (a ADC) getADCChannel() uint8 { case PA02: return 0 case PB08: - return 2 + if a.Bus == AdcBus1 { + return 0 + } else { + return 2 + } case PB09: - return 3 + if a.Bus == AdcBus1 { + return 1 + } else { + return 3 + } case PA04: return 4 case PA05: