mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
targets/TARGET_Analog_Devices/TARGET_ADUCM302X/TARGET_ADUCM3029/api/analogin_api.c@189:f392fc9709a3, 2019-02-20 (annotated)
- Committer:
- AnnaBridge
- Date:
- Wed Feb 20 22:31:08 2019 +0000
- Revision:
- 189:f392fc9709a3
- Parent:
- 180:96ed750bd169
mbed library release version 165
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AnnaBridge | 178:79309dc6340a | 1 | /******************************************************************************* |
AnnaBridge | 178:79309dc6340a | 2 | * Copyright (c) 2010-2017 Analog Devices, Inc. |
AnnaBridge | 178:79309dc6340a | 3 | * |
AnnaBridge | 178:79309dc6340a | 4 | * All rights reserved. |
AnnaBridge | 178:79309dc6340a | 5 | * |
AnnaBridge | 178:79309dc6340a | 6 | * Redistribution and use in source and binary forms, with or without modification, |
AnnaBridge | 178:79309dc6340a | 7 | * are permitted provided that the following conditions are met: |
AnnaBridge | 178:79309dc6340a | 8 | * - Redistributions of source code must retain the above copyright notice, |
AnnaBridge | 178:79309dc6340a | 9 | * this list of conditions and the following disclaimer. |
AnnaBridge | 178:79309dc6340a | 10 | * - Redistributions in binary form must reproduce the above copyright notice, |
AnnaBridge | 178:79309dc6340a | 11 | * this list of conditions and the following disclaimer in the documentation |
AnnaBridge | 178:79309dc6340a | 12 | * and/or other materials provided with the distribution. |
AnnaBridge | 178:79309dc6340a | 13 | * - Modified versions of the software must be conspicuously marked as such. |
AnnaBridge | 178:79309dc6340a | 14 | * - This software is licensed solely and exclusively for use with processors |
AnnaBridge | 178:79309dc6340a | 15 | * manufactured by or for Analog Devices, Inc. |
AnnaBridge | 178:79309dc6340a | 16 | * - This software may not be combined or merged with other code in any manner |
AnnaBridge | 178:79309dc6340a | 17 | * that would cause the software to become subject to terms and conditions |
AnnaBridge | 178:79309dc6340a | 18 | * which differ from those listed here. |
AnnaBridge | 178:79309dc6340a | 19 | * - Neither the name of Analog Devices, Inc. nor the names of its |
AnnaBridge | 178:79309dc6340a | 20 | * contributors may be used to endorse or promote products derived |
AnnaBridge | 178:79309dc6340a | 21 | * from this software without specific prior written permission. |
AnnaBridge | 178:79309dc6340a | 22 | * - The use of this software may or may not infringe the patent rights of one |
AnnaBridge | 178:79309dc6340a | 23 | * or more patent holders. This license does not release you from the |
AnnaBridge | 178:79309dc6340a | 24 | * requirement that you obtain separate licenses from these patent holders |
AnnaBridge | 178:79309dc6340a | 25 | * to use this software. |
AnnaBridge | 178:79309dc6340a | 26 | * |
AnnaBridge | 178:79309dc6340a | 27 | * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" |
AnnaBridge | 178:79309dc6340a | 28 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- |
AnnaBridge | 178:79309dc6340a | 29 | * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
AnnaBridge | 178:79309dc6340a | 30 | * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE |
AnnaBridge | 178:79309dc6340a | 31 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR |
AnnaBridge | 178:79309dc6340a | 32 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF |
AnnaBridge | 178:79309dc6340a | 33 | * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF |
AnnaBridge | 178:79309dc6340a | 34 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
AnnaBridge | 178:79309dc6340a | 35 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
AnnaBridge | 178:79309dc6340a | 36 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
AnnaBridge | 178:79309dc6340a | 37 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
AnnaBridge | 178:79309dc6340a | 38 | * POSSIBILITY OF SUCH DAMAGE. |
AnnaBridge | 178:79309dc6340a | 39 | ******************************************************************************/ |
AnnaBridge | 178:79309dc6340a | 40 | |
AnnaBridge | 178:79309dc6340a | 41 | #include "mbed_assert.h" |
AnnaBridge | 178:79309dc6340a | 42 | #include "analogin_api.h" |
AnnaBridge | 178:79309dc6340a | 43 | |
AnnaBridge | 178:79309dc6340a | 44 | #if DEVICE_ANALOGIN |
AnnaBridge | 178:79309dc6340a | 45 | |
AnnaBridge | 178:79309dc6340a | 46 | #include "adi_adc_def.h" |
AnnaBridge | 178:79309dc6340a | 47 | #include "pinmap.h" |
AnnaBridge | 178:79309dc6340a | 48 | #include "PeripheralPins.h" |
AnnaBridge | 178:79309dc6340a | 49 | |
AnnaBridge | 178:79309dc6340a | 50 | #ifdef __cplusplus |
AnnaBridge | 178:79309dc6340a | 51 | extern "C" { |
AnnaBridge | 178:79309dc6340a | 52 | #endif |
AnnaBridge | 178:79309dc6340a | 53 | |
AnnaBridge | 178:79309dc6340a | 54 | /* ADC Device number */ |
AnnaBridge | 178:79309dc6340a | 55 | #define ADC_DEV_NUM (0u) |
AnnaBridge | 178:79309dc6340a | 56 | |
AnnaBridge | 178:79309dc6340a | 57 | /* Memory Required for adc driver */ |
AnnaBridge | 178:79309dc6340a | 58 | static uint32_t DeviceMemory[(ADI_ADC_MEMORY_SIZE+3)/4]; |
AnnaBridge | 178:79309dc6340a | 59 | /* Active channel */ |
AnnaBridge | 178:79309dc6340a | 60 | static uint32_t adi_pin2channel(PinName pin); |
AnnaBridge | 178:79309dc6340a | 61 | |
AnnaBridge | 178:79309dc6340a | 62 | /** |
AnnaBridge | 178:79309dc6340a | 63 | * \defgroup hal_analogin Analogin hal functions |
AnnaBridge | 178:79309dc6340a | 64 | * @{ |
AnnaBridge | 178:79309dc6340a | 65 | */ |
AnnaBridge | 178:79309dc6340a | 66 | |
AnnaBridge | 178:79309dc6340a | 67 | /** Initialize the analogin peripheral |
AnnaBridge | 178:79309dc6340a | 68 | * |
AnnaBridge | 178:79309dc6340a | 69 | * Configures the pin used by analogin. |
AnnaBridge | 178:79309dc6340a | 70 | * @param obj The analogin object to initialize |
AnnaBridge | 178:79309dc6340a | 71 | * @param pin The analogin pin name |
AnnaBridge | 178:79309dc6340a | 72 | */ |
AnnaBridge | 178:79309dc6340a | 73 | void analogin_init(analogin_t *obj, PinName pin) |
AnnaBridge | 178:79309dc6340a | 74 | { |
AnnaBridge | 178:79309dc6340a | 75 | ADI_ADC_HANDLE hDevice; |
AnnaBridge | 178:79309dc6340a | 76 | bool bCalibrationDone = false; |
AnnaBridge | 178:79309dc6340a | 77 | bool bReady = false; |
AnnaBridge | 178:79309dc6340a | 78 | |
AnnaBridge | 178:79309dc6340a | 79 | ADCName peripheral; |
AnnaBridge | 178:79309dc6340a | 80 | uint32_t function, channel; |
AnnaBridge | 178:79309dc6340a | 81 | |
Anna Bridge |
180:96ed750bd169 | 82 | memset(obj, 0, sizeof(analogin_t) ); |
Anna Bridge |
180:96ed750bd169 | 83 | memset( DeviceMemory, 0, sizeof( DeviceMemory ) ); |
Anna Bridge |
180:96ed750bd169 | 84 | |
Anna Bridge |
180:96ed750bd169 | 85 | peripheral = (ADCName)pinmap_peripheral(pin, &PinMap_ADC[0]); // gives peripheral |
AnnaBridge | 178:79309dc6340a | 86 | MBED_ASSERT(peripheral != (ADCName)NC); |
AnnaBridge | 178:79309dc6340a | 87 | |
AnnaBridge | 178:79309dc6340a | 88 | /* verify read function */ |
AnnaBridge | 178:79309dc6340a | 89 | function = pinmap_function(pin, &PinMap_ADC[0]); |
AnnaBridge | 178:79309dc6340a | 90 | MBED_ASSERT(function == 1); |
AnnaBridge | 178:79309dc6340a | 91 | |
AnnaBridge | 178:79309dc6340a | 92 | /* Configure PORT2_MUX registers */ |
AnnaBridge | 178:79309dc6340a | 93 | pin_function(pin, function); |
AnnaBridge | 178:79309dc6340a | 94 | |
AnnaBridge | 178:79309dc6340a | 95 | /* Configure active channel */ |
AnnaBridge | 178:79309dc6340a | 96 | channel = adi_pin2channel(pin); |
AnnaBridge | 178:79309dc6340a | 97 | MBED_ASSERT(channel != 0xFFFFFFFF); |
AnnaBridge | 178:79309dc6340a | 98 | obj->UserBuffer.nChannels = channel; |
AnnaBridge | 178:79309dc6340a | 99 | |
AnnaBridge | 178:79309dc6340a | 100 | /* Set ACLK to CCLK/16 */ |
AnnaBridge | 178:79309dc6340a | 101 | adi_pwr_SetClockDivider(ADI_CLOCK_ACLK,16); |
AnnaBridge | 178:79309dc6340a | 102 | |
AnnaBridge | 178:79309dc6340a | 103 | /* Set default values for conversion and delay cycles. This sets up a sampling rate of |
AnnaBridge | 178:79309dc6340a | 104 | 16kHz. The sampling frequency is worked out from the following: |
AnnaBridge | 178:79309dc6340a | 105 | |
AnnaBridge | 178:79309dc6340a | 106 | if delay time > 0: |
AnnaBridge | 178:79309dc6340a | 107 | Fs = ACLK / [((14 + sampling time) * oversample factor) + (delay time + 2)] |
AnnaBridge | 178:79309dc6340a | 108 | if delay time = 0: |
AnnaBridge | 178:79309dc6340a | 109 | Fs = ACLK / ((14 + sampling time) * oversample factor) |
AnnaBridge | 178:79309dc6340a | 110 | |
AnnaBridge | 178:79309dc6340a | 111 | The sampling (or acquisition) and delay times are in number of ACLK clock cycles. |
AnnaBridge | 178:79309dc6340a | 112 | */ |
AnnaBridge | 178:79309dc6340a | 113 | obj->DelayCycles = 0; |
AnnaBridge | 178:79309dc6340a | 114 | obj->SampleCycles = 88; |
AnnaBridge | 178:79309dc6340a | 115 | |
AnnaBridge | 178:79309dc6340a | 116 | /* Open the ADC device */ |
AnnaBridge | 178:79309dc6340a | 117 | adi_adc_Open(ADC_DEV_NUM, DeviceMemory, sizeof(DeviceMemory), &hDevice); |
AnnaBridge | 178:79309dc6340a | 118 | obj->hDevice = hDevice; |
AnnaBridge | 178:79309dc6340a | 119 | |
AnnaBridge | 178:79309dc6340a | 120 | /* Power up ADC */ |
AnnaBridge | 178:79309dc6340a | 121 | adi_adc_PowerUp(hDevice, true); |
AnnaBridge | 178:79309dc6340a | 122 | |
AnnaBridge | 178:79309dc6340a | 123 | /* Set ADC reference */ |
AnnaBridge | 178:79309dc6340a | 124 | adi_adc_SetVrefSource(hDevice, ADI_ADC_VREF_SRC_INT_2_50_V); |
AnnaBridge | 178:79309dc6340a | 125 | |
AnnaBridge | 178:79309dc6340a | 126 | /* Enable ADC sub system */ |
AnnaBridge | 178:79309dc6340a | 127 | adi_adc_EnableADCSubSystem(hDevice, true); |
AnnaBridge | 178:79309dc6340a | 128 | |
AnnaBridge | 178:79309dc6340a | 129 | /* Wait untilthe ADC is ready for sampling */ |
AnnaBridge | 178:79309dc6340a | 130 | while(bReady == false) { |
AnnaBridge | 178:79309dc6340a | 131 | adi_adc_IsReady(hDevice, &bReady); |
AnnaBridge | 178:79309dc6340a | 132 | } |
AnnaBridge | 178:79309dc6340a | 133 | |
AnnaBridge | 178:79309dc6340a | 134 | /* Start calibration */ |
AnnaBridge | 178:79309dc6340a | 135 | adi_adc_StartCalibration(hDevice); |
AnnaBridge | 178:79309dc6340a | 136 | |
AnnaBridge | 178:79309dc6340a | 137 | /* Wait until calibration is done */ |
AnnaBridge | 178:79309dc6340a | 138 | while (!bCalibrationDone) { |
AnnaBridge | 178:79309dc6340a | 139 | adi_adc_IsCalibrationDone(hDevice, &bCalibrationDone); |
AnnaBridge | 178:79309dc6340a | 140 | } |
AnnaBridge | 178:79309dc6340a | 141 | |
AnnaBridge | 178:79309dc6340a | 142 | /* Set the delay time */ |
AnnaBridge | 178:79309dc6340a | 143 | adi_adc_SetDelayTime(hDevice, obj->DelayCycles); |
AnnaBridge | 178:79309dc6340a | 144 | |
AnnaBridge | 178:79309dc6340a | 145 | /* Set the acquisition time. (Application need to change it based on the impedence) */ |
AnnaBridge | 178:79309dc6340a | 146 | adi_adc_SetAcquisitionTime(hDevice, obj->SampleCycles); |
Anna Bridge |
180:96ed750bd169 | 147 | |
AnnaBridge | 178:79309dc6340a | 148 | } |
AnnaBridge | 178:79309dc6340a | 149 | |
AnnaBridge | 178:79309dc6340a | 150 | /** Read the input voltage, represented as a float in the range [0.0, 1.0] |
AnnaBridge | 178:79309dc6340a | 151 | * |
AnnaBridge | 178:79309dc6340a | 152 | * @param obj The analogin object |
AnnaBridge | 178:79309dc6340a | 153 | * @return A floating value representing the current input voltage |
AnnaBridge | 178:79309dc6340a | 154 | */ |
AnnaBridge | 178:79309dc6340a | 155 | float analogin_read(analogin_t *obj) |
AnnaBridge | 178:79309dc6340a | 156 | { |
AnnaBridge | 178:79309dc6340a | 157 | float fl32 = (float)analogin_read_u16(obj)/(float)4095.0; |
AnnaBridge | 178:79309dc6340a | 158 | |
AnnaBridge | 178:79309dc6340a | 159 | return(fl32); |
AnnaBridge | 178:79309dc6340a | 160 | } |
AnnaBridge | 178:79309dc6340a | 161 | |
AnnaBridge | 178:79309dc6340a | 162 | /** Read the value from analogin pin, represented as an unsigned 16bit value |
AnnaBridge | 178:79309dc6340a | 163 | * |
AnnaBridge | 178:79309dc6340a | 164 | * @param obj The analogin object |
AnnaBridge | 178:79309dc6340a | 165 | * @return An unsigned 16bit value representing the current input voltage |
AnnaBridge | 178:79309dc6340a | 166 | */ |
AnnaBridge | 178:79309dc6340a | 167 | uint16_t analogin_read_u16(analogin_t *obj) |
AnnaBridge | 178:79309dc6340a | 168 | { |
AnnaBridge | 178:79309dc6340a | 169 | ADI_ADC_HANDLE hDevice = obj->hDevice; |
AnnaBridge | 178:79309dc6340a | 170 | ADI_ADC_BUFFER *pAdcBuffer; |
Anna Bridge |
180:96ed750bd169 | 171 | uint32_t ADCsample; |
Anna Bridge |
180:96ed750bd169 | 172 | |
Anna Bridge |
180:96ed750bd169 | 173 | obj->UserBuffer.pDataBuffer = &ADCsample; |
Anna Bridge |
180:96ed750bd169 | 174 | obj->UserBuffer.nNumConversionPasses = 1; |
Anna Bridge |
180:96ed750bd169 | 175 | obj->UserBuffer.nBuffSize = 1; |
AnnaBridge | 178:79309dc6340a | 176 | |
AnnaBridge | 178:79309dc6340a | 177 | /* Submit the buffer to the driver */ |
AnnaBridge | 178:79309dc6340a | 178 | adi_adc_SubmitBuffer(hDevice, &obj->UserBuffer); |
AnnaBridge | 178:79309dc6340a | 179 | |
AnnaBridge | 178:79309dc6340a | 180 | /* Enable the ADC */ |
AnnaBridge | 178:79309dc6340a | 181 | adi_adc_Enable(hDevice, true); |
AnnaBridge | 178:79309dc6340a | 182 | |
AnnaBridge | 178:79309dc6340a | 183 | adi_adc_GetBuffer(hDevice, &pAdcBuffer); |
AnnaBridge | 178:79309dc6340a | 184 | MBED_ASSERT(pAdcBuffer == &obj->UserBuffer); |
AnnaBridge | 178:79309dc6340a | 185 | |
AnnaBridge | 178:79309dc6340a | 186 | return( (uint16_t)( ((uint16_t *)pAdcBuffer->pDataBuffer)[(pAdcBuffer->nNumConversionPasses) - 1]) ); |
AnnaBridge | 178:79309dc6340a | 187 | } |
AnnaBridge | 178:79309dc6340a | 188 | |
Anna Bridge |
180:96ed750bd169 | 189 | /* Retrieve the active channel corresponding to the input pin */ |
Anna Bridge |
180:96ed750bd169 | 190 | static uint32_t adi_pin2channel(PinName pin) |
Anna Bridge |
180:96ed750bd169 | 191 | { |
AnnaBridge | 178:79309dc6340a | 192 | |
AnnaBridge | 178:79309dc6340a | 193 | uint32_t activech; |
AnnaBridge | 178:79309dc6340a | 194 | |
AnnaBridge | 178:79309dc6340a | 195 | switch(pin) { |
AnnaBridge | 178:79309dc6340a | 196 | case ADC_VIN0: |
AnnaBridge | 178:79309dc6340a | 197 | activech = ADI_ADC_CHANNEL_0; |
AnnaBridge | 178:79309dc6340a | 198 | break; |
AnnaBridge | 178:79309dc6340a | 199 | case ADC_VIN1: |
AnnaBridge | 178:79309dc6340a | 200 | activech = ADI_ADC_CHANNEL_1; |
AnnaBridge | 178:79309dc6340a | 201 | break; |
AnnaBridge | 178:79309dc6340a | 202 | case ADC_VIN2: |
AnnaBridge | 178:79309dc6340a | 203 | activech = ADI_ADC_CHANNEL_2; |
AnnaBridge | 178:79309dc6340a | 204 | break; |
AnnaBridge | 178:79309dc6340a | 205 | case ADC_VIN3: |
AnnaBridge | 178:79309dc6340a | 206 | activech = ADI_ADC_CHANNEL_3; |
AnnaBridge | 178:79309dc6340a | 207 | break; |
AnnaBridge | 178:79309dc6340a | 208 | case ADC_VIN4: |
AnnaBridge | 178:79309dc6340a | 209 | activech = ADI_ADC_CHANNEL_4; |
AnnaBridge | 178:79309dc6340a | 210 | break; |
AnnaBridge | 178:79309dc6340a | 211 | case ADC_VIN5: |
AnnaBridge | 178:79309dc6340a | 212 | activech = ADI_ADC_CHANNEL_5; |
AnnaBridge | 178:79309dc6340a | 213 | break; |
AnnaBridge | 178:79309dc6340a | 214 | case ADC_VIN6: |
AnnaBridge | 178:79309dc6340a | 215 | activech = ADI_ADC_CHANNEL_6; |
AnnaBridge | 178:79309dc6340a | 216 | break; |
AnnaBridge | 178:79309dc6340a | 217 | case ADC_VIN7: |
AnnaBridge | 178:79309dc6340a | 218 | activech = ADI_ADC_CHANNEL_7; |
AnnaBridge | 178:79309dc6340a | 219 | break; |
AnnaBridge | 178:79309dc6340a | 220 | default: |
AnnaBridge | 178:79309dc6340a | 221 | activech = (uint32_t) 0xFFFFFFFF; |
AnnaBridge | 178:79309dc6340a | 222 | break; |
AnnaBridge | 178:79309dc6340a | 223 | } |
AnnaBridge | 178:79309dc6340a | 224 | |
AnnaBridge | 178:79309dc6340a | 225 | return ((uint32_t)activech); |
AnnaBridge | 178:79309dc6340a | 226 | } |
AnnaBridge | 178:79309dc6340a | 227 | |
AnnaBridge | 178:79309dc6340a | 228 | |
AnnaBridge | 178:79309dc6340a | 229 | |
AnnaBridge | 178:79309dc6340a | 230 | /**@}*/ |
AnnaBridge | 178:79309dc6340a | 231 | |
AnnaBridge | 178:79309dc6340a | 232 | #ifdef __cplusplus |
AnnaBridge | 178:79309dc6340a | 233 | } |
AnnaBridge | 178:79309dc6340a | 234 | #endif |
AnnaBridge | 178:79309dc6340a | 235 | |
AnnaBridge | 178:79309dc6340a | 236 | #endif // #if DEVICE_ANALOGIN |