Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sun May 14 23:18:57 2017 +0000
Revision:
18:6a4db94011d3
Publishing again

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sahilmgandhi 18:6a4db94011d3 1 /**
sahilmgandhi 18:6a4db94011d3 2 ******************************************************************************
sahilmgandhi 18:6a4db94011d3 3 * @file adc_sar.c
sahilmgandhi 18:6a4db94011d3 4 * @brief Implementation of a SAR ADC driver
sahilmgandhi 18:6a4db94011d3 5 * @internal
sahilmgandhi 18:6a4db94011d3 6 * @author ON Semiconductor
sahilmgandhi 18:6a4db94011d3 7 * $Rev:
sahilmgandhi 18:6a4db94011d3 8 * $Date:
sahilmgandhi 18:6a4db94011d3 9 ******************************************************************************
sahilmgandhi 18:6a4db94011d3 10 * Copyright 2016 Semiconductor Components Industries LLC (d/b/a “ON Semiconductor”).
sahilmgandhi 18:6a4db94011d3 11 * All rights reserved. This software and/or documentation is licensed by ON Semiconductor
sahilmgandhi 18:6a4db94011d3 12 * under limited terms and conditions. The terms and conditions pertaining to the software
sahilmgandhi 18:6a4db94011d3 13 * and/or documentation are available at http://www.onsemi.com/site/pdf/ONSEMI_T&C.pdf
sahilmgandhi 18:6a4db94011d3 14 * (“ON Semiconductor Standard Terms and Conditions of Sale, Section 8 Software”) and
sahilmgandhi 18:6a4db94011d3 15 * if applicable the software license agreement. Do not use this software and/or
sahilmgandhi 18:6a4db94011d3 16 * documentation unless you have carefully read and you agree to the limited terms and
sahilmgandhi 18:6a4db94011d3 17 * conditions. By using this software and/or documentation, you agree to the limited
sahilmgandhi 18:6a4db94011d3 18 * terms and conditions.
sahilmgandhi 18:6a4db94011d3 19 *
sahilmgandhi 18:6a4db94011d3 20 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
sahilmgandhi 18:6a4db94011d3 21 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
sahilmgandhi 18:6a4db94011d3 22 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
sahilmgandhi 18:6a4db94011d3 23 * ON SEMICONDUCTOR SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL,
sahilmgandhi 18:6a4db94011d3 24 * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
sahilmgandhi 18:6a4db94011d3 25 * @endinternal
sahilmgandhi 18:6a4db94011d3 26 *
sahilmgandhi 18:6a4db94011d3 27 * @ingroup adc_sar
sahilmgandhi 18:6a4db94011d3 28 *
sahilmgandhi 18:6a4db94011d3 29 * @details
sahilmgandhi 18:6a4db94011d3 30 * <p>
sahilmgandhi 18:6a4db94011d3 31 * </p>
sahilmgandhi 18:6a4db94011d3 32 *
sahilmgandhi 18:6a4db94011d3 33 */
sahilmgandhi 18:6a4db94011d3 34
sahilmgandhi 18:6a4db94011d3 35 #include "device.h"
sahilmgandhi 18:6a4db94011d3 36 #include "analogin_api.h"
sahilmgandhi 18:6a4db94011d3 37 #include "PeripheralPins.h"
sahilmgandhi 18:6a4db94011d3 38 #include "mbed_assert.h"
sahilmgandhi 18:6a4db94011d3 39 #include "clock.h"
sahilmgandhi 18:6a4db94011d3 40 #include "adc_sar.h"
sahilmgandhi 18:6a4db94011d3 41
sahilmgandhi 18:6a4db94011d3 42 #if DEVICE_ANALOGIN
sahilmgandhi 18:6a4db94011d3 43
sahilmgandhi 18:6a4db94011d3 44 /**
sahilmgandhi 18:6a4db94011d3 45 * \defgroup hal_analogin Analogin hal functions
sahilmgandhi 18:6a4db94011d3 46 * @{
sahilmgandhi 18:6a4db94011d3 47 */
sahilmgandhi 18:6a4db94011d3 48
sahilmgandhi 18:6a4db94011d3 49 /** Initialize the analogin peripheral
sahilmgandhi 18:6a4db94011d3 50 *
sahilmgandhi 18:6a4db94011d3 51 * Configures the pin used by analogin.
sahilmgandhi 18:6a4db94011d3 52 * @param obj The analogin object to initialize
sahilmgandhi 18:6a4db94011d3 53 * @param pin The analogin pin name
sahilmgandhi 18:6a4db94011d3 54 */
sahilmgandhi 18:6a4db94011d3 55 void analogin_init(analogin_t *obj, PinName pin)
sahilmgandhi 18:6a4db94011d3 56 {
sahilmgandhi 18:6a4db94011d3 57 CLOCK_ENABLE(CLOCK_ADC);
sahilmgandhi 18:6a4db94011d3 58 ADCName adc;
sahilmgandhi 18:6a4db94011d3 59 uint8_t adc_pin = 0;
sahilmgandhi 18:6a4db94011d3 60
sahilmgandhi 18:6a4db94011d3 61 adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
sahilmgandhi 18:6a4db94011d3 62 MBED_ASSERT(adc != (ADCName)NC);
sahilmgandhi 18:6a4db94011d3 63
sahilmgandhi 18:6a4db94011d3 64 obj->adcReg = (AdcReg_pt)adc;
sahilmgandhi 18:6a4db94011d3 65 obj->pin = pin;
sahilmgandhi 18:6a4db94011d3 66 obj->pinFlag = 1;
sahilmgandhi 18:6a4db94011d3 67 obj->ADC_Offset_Value = TRIMREG->ADC_OFFSET_TRIM;
sahilmgandhi 18:6a4db94011d3 68
sahilmgandhi 18:6a4db94011d3 69 switch (pin) {
sahilmgandhi 18:6a4db94011d3 70 case A0:
sahilmgandhi 18:6a4db94011d3 71 adc_pin=0;
sahilmgandhi 18:6a4db94011d3 72 break;
sahilmgandhi 18:6a4db94011d3 73 case A1:
sahilmgandhi 18:6a4db94011d3 74 adc_pin = 1;
sahilmgandhi 18:6a4db94011d3 75 break;
sahilmgandhi 18:6a4db94011d3 76 case A2:
sahilmgandhi 18:6a4db94011d3 77 adc_pin = 2;
sahilmgandhi 18:6a4db94011d3 78 break;
sahilmgandhi 18:6a4db94011d3 79 case A3:
sahilmgandhi 18:6a4db94011d3 80 adc_pin = 3;
sahilmgandhi 18:6a4db94011d3 81 break;
sahilmgandhi 18:6a4db94011d3 82 default:
sahilmgandhi 18:6a4db94011d3 83 break;
sahilmgandhi 18:6a4db94011d3 84 }
sahilmgandhi 18:6a4db94011d3 85
sahilmgandhi 18:6a4db94011d3 86 /* If no config parameters are passed on; assume default value */
sahilmgandhi 18:6a4db94011d3 87 if (obj->adcConf == Null) {
sahilmgandhi 18:6a4db94011d3 88 /* Single sample, absolute conversion, scale = 1 */
sahilmgandhi 18:6a4db94011d3 89 obj->adcReg->CONTROL.WORD = ((0 << ADC_CONTROL_MODE_BIT_POS) |
sahilmgandhi 18:6a4db94011d3 90 (1 << ADC_CONTROL_MEASTYPE_BIT_POS) |
sahilmgandhi 18:6a4db94011d3 91 (6 << ADC_CONTROL_INPUTSCALE_BIT_POS) |
sahilmgandhi 18:6a4db94011d3 92 (((uint8_t)adc_pin) << ADC_CONTROL_MEAS_CH_BIT_POS));
sahilmgandhi 18:6a4db94011d3 93
sahilmgandhi 18:6a4db94011d3 94 /* Prescaler enabled; set to 7 */
sahilmgandhi 18:6a4db94011d3 95 obj->adcReg->PRESCALE.WORD = ((True << ADC_PRESCALE_EN_BIT_POS) |
sahilmgandhi 18:6a4db94011d3 96 (7 << ADC_PRESCALE_VAL_BIT_POS)); /* ADC clock = 32MHz/(Prescale + 1) */
sahilmgandhi 18:6a4db94011d3 97
sahilmgandhi 18:6a4db94011d3 98 obj->adcReg->DELAY.WORD = ((0x34 << ADC_DELAY_SAMPLE_RATE_BIT_POS) | /** 25 uS Sets the sample rate in units of PCLKperiod * (Prescale + 1). */
sahilmgandhi 18:6a4db94011d3 99 (0x05 << ADC_DELAY_WARMUP_BIT_POS) | /** 12.5 uS Sets the measure time in units of PCLKperiod * (Prescale + 1). */
sahilmgandhi 18:6a4db94011d3 100 (0x1A << ADC_DELAY_SAMPLE_TIME_BIT_POS)); /** 2.5 uS Sets the warm-up time in units of PCLKperiod * (Prescale + 1). */
sahilmgandhi 18:6a4db94011d3 101
sahilmgandhi 18:6a4db94011d3 102 obj->adcReg->IR = 0; /** No interrupt generated */
sahilmgandhi 18:6a4db94011d3 103 } else {
sahilmgandhi 18:6a4db94011d3 104 obj->adcConf->convCh = adc_pin;
sahilmgandhi 18:6a4db94011d3 105
sahilmgandhi 18:6a4db94011d3 106 /* ADC register settings */
sahilmgandhi 18:6a4db94011d3 107 if((obj->adcConf->measurementType) == ADC_RELATIVE_MEAS) {
sahilmgandhi 18:6a4db94011d3 108 obj->adcReg->CONTROL.WORD = ((obj->adcConf->mode << ADC_CONTROL_MODE_BIT_POS) |
sahilmgandhi 18:6a4db94011d3 109 (obj->adcConf->measurementType << ADC_CONTROL_MEASTYPE_BIT_POS) |
sahilmgandhi 18:6a4db94011d3 110 (obj->adcConf->inputScale << ADC_CONTROL_INPUTSCALE_BIT_POS) |
sahilmgandhi 18:6a4db94011d3 111 (obj->adcConf->convCh << ADC_CONTROL_MEAS_CH_BIT_POS) |
sahilmgandhi 18:6a4db94011d3 112 (obj->adcConf->referenceCh << ADC_CONTROL_REF_CH_BIT_POS));
sahilmgandhi 18:6a4db94011d3 113 } else {
sahilmgandhi 18:6a4db94011d3 114 obj->adcReg->CONTROL.WORD = ((obj->adcConf->mode << ADC_CONTROL_MODE_BIT_POS) |
sahilmgandhi 18:6a4db94011d3 115 (obj->adcConf->measurementType << ADC_CONTROL_MEASTYPE_BIT_POS) |
sahilmgandhi 18:6a4db94011d3 116 (obj->adcConf->inputScale << ADC_CONTROL_INPUTSCALE_BIT_POS) |
sahilmgandhi 18:6a4db94011d3 117 (obj->adcConf->convCh << ADC_CONTROL_MEAS_CH_BIT_POS));
sahilmgandhi 18:6a4db94011d3 118 }
sahilmgandhi 18:6a4db94011d3 119
sahilmgandhi 18:6a4db94011d3 120 obj->adcReg->PRESCALE.WORD = ((True << ADC_PRESCALE_EN_BIT_POS) |
sahilmgandhi 18:6a4db94011d3 121 (obj->adcConf->PrescaleVal << ADC_PRESCALE_VAL_BIT_POS)); /* ADC clock = 32MHz/(Prescale + 1) */
sahilmgandhi 18:6a4db94011d3 122
sahilmgandhi 18:6a4db94011d3 123 obj->adcReg->DELAY.WORD = ((obj->adcConf->samplingRate << ADC_DELAY_SAMPLE_RATE_BIT_POS) | /** 25 uS Sets the sample rate in units of PCLKperiod * (Prescale + 1). */
sahilmgandhi 18:6a4db94011d3 124 (obj->adcConf->WarmUpTime << ADC_DELAY_WARMUP_BIT_POS) | /** 12.5 uS Sets the measure time in units of PCLKperiod * (Prescale + 1). */
sahilmgandhi 18:6a4db94011d3 125 (obj->adcConf->samplingTime << ADC_DELAY_SAMPLE_TIME_BIT_POS)); /** 2.5 uS Sets the warm-up time in units of PCLKperiod * (Prescale + 1). */
sahilmgandhi 18:6a4db94011d3 126
sahilmgandhi 18:6a4db94011d3 127 obj->adcReg->IR = obj->adcConf->interruptConfig; /** Interrupt setting */
sahilmgandhi 18:6a4db94011d3 128 }
sahilmgandhi 18:6a4db94011d3 129
sahilmgandhi 18:6a4db94011d3 130 /* Enable interrupt */
sahilmgandhi 18:6a4db94011d3 131 NVIC_ClearPendingIRQ(Adc_IRQn);
sahilmgandhi 18:6a4db94011d3 132 NVIC_EnableIRQ(Adc_IRQn);
sahilmgandhi 18:6a4db94011d3 133 }
sahilmgandhi 18:6a4db94011d3 134
sahilmgandhi 18:6a4db94011d3 135 /** Read the input voltage, represented as a float in the range [0.0, 1.0]
sahilmgandhi 18:6a4db94011d3 136 *
sahilmgandhi 18:6a4db94011d3 137 * @param obj The analogin object
sahilmgandhi 18:6a4db94011d3 138 * @return A floating value representing the current input voltage
sahilmgandhi 18:6a4db94011d3 139 */
sahilmgandhi 18:6a4db94011d3 140 float analogin_read(analogin_t *obj)
sahilmgandhi 18:6a4db94011d3 141 {
sahilmgandhi 18:6a4db94011d3 142 float retVal = 0.0;
sahilmgandhi 18:6a4db94011d3 143 uint16_t value = analogin_read_u16(obj);
sahilmgandhi 18:6a4db94011d3 144 retVal = (float)value * (1.0f / (float)0x03FF);
sahilmgandhi 18:6a4db94011d3 145 return(retVal);
sahilmgandhi 18:6a4db94011d3 146 }
sahilmgandhi 18:6a4db94011d3 147
sahilmgandhi 18:6a4db94011d3 148 /** Read the value from analogin pin, represented as an unsigned 16bit value
sahilmgandhi 18:6a4db94011d3 149 *
sahilmgandhi 18:6a4db94011d3 150 * @param obj The analogin object
sahilmgandhi 18:6a4db94011d3 151 * @return An unsigned 16bit value representing the current input voltage
sahilmgandhi 18:6a4db94011d3 152 */
sahilmgandhi 18:6a4db94011d3 153 uint16_t analogin_read_u16(analogin_t *obj)
sahilmgandhi 18:6a4db94011d3 154 {
sahilmgandhi 18:6a4db94011d3 155 uint16_t adcData = 0;
sahilmgandhi 18:6a4db94011d3 156 uint8_t adc_pin = 0;
sahilmgandhi 18:6a4db94011d3 157
sahilmgandhi 18:6a4db94011d3 158 CLOCK_ENABLE(CLOCK_ADC);
sahilmgandhi 18:6a4db94011d3 159
sahilmgandhi 18:6a4db94011d3 160 if (obj->pinFlag) {
sahilmgandhi 18:6a4db94011d3 161 switch (obj->pin) {
sahilmgandhi 18:6a4db94011d3 162 case A0:
sahilmgandhi 18:6a4db94011d3 163 adc_pin=0;
sahilmgandhi 18:6a4db94011d3 164 break;
sahilmgandhi 18:6a4db94011d3 165 case A1:
sahilmgandhi 18:6a4db94011d3 166 adc_pin = 1;
sahilmgandhi 18:6a4db94011d3 167 break;
sahilmgandhi 18:6a4db94011d3 168 case A2:
sahilmgandhi 18:6a4db94011d3 169 adc_pin = 2;
sahilmgandhi 18:6a4db94011d3 170 break;
sahilmgandhi 18:6a4db94011d3 171 case A3:
sahilmgandhi 18:6a4db94011d3 172 adc_pin = 3;
sahilmgandhi 18:6a4db94011d3 173 break;
sahilmgandhi 18:6a4db94011d3 174 default:
sahilmgandhi 18:6a4db94011d3 175 break;
sahilmgandhi 18:6a4db94011d3 176 }
sahilmgandhi 18:6a4db94011d3 177
sahilmgandhi 18:6a4db94011d3 178 /* Re initialize the pin configured for ADC read */
sahilmgandhi 18:6a4db94011d3 179 obj->adcReg->CONTROL.BITS.CONV_CH = adc_pin;
sahilmgandhi 18:6a4db94011d3 180 }
sahilmgandhi 18:6a4db94011d3 181
sahilmgandhi 18:6a4db94011d3 182 obj->adcReg->CONTROL.BITS.START_CONV=1; /* Start The Conversion */
sahilmgandhi 18:6a4db94011d3 183
sahilmgandhi 18:6a4db94011d3 184 while((uint32_t)(obj->adcReg->STATUS)!=(uint32_t)1) {
sahilmgandhi 18:6a4db94011d3 185 }
sahilmgandhi 18:6a4db94011d3 186 adcData =(uint16_t)(obj->adcReg->DATA);
sahilmgandhi 18:6a4db94011d3 187
sahilmgandhi 18:6a4db94011d3 188 /* Offset the ADC data with trim value */
sahilmgandhi 18:6a4db94011d3 189 if (obj->ADC_Offset_Value != 0xFFFFFFFF) {
sahilmgandhi 18:6a4db94011d3 190
sahilmgandhi 18:6a4db94011d3 191 if(adcData >= obj->ADC_Offset_Value) {
sahilmgandhi 18:6a4db94011d3 192 adcData -= obj->ADC_Offset_Value;
sahilmgandhi 18:6a4db94011d3 193 }
sahilmgandhi 18:6a4db94011d3 194 }
sahilmgandhi 18:6a4db94011d3 195
sahilmgandhi 18:6a4db94011d3 196 return(adcData);
sahilmgandhi 18:6a4db94011d3 197 }
sahilmgandhi 18:6a4db94011d3 198
sahilmgandhi 18:6a4db94011d3 199 #endif // DEVICE_ANALOGIN
sahilmgandhi 18:6a4db94011d3 200