Class to read acceleration measurements from Dimension Engineering Buffered +-3g Tri-axis Accelerometer device.
DimEngAcc3D.cpp@0:9b3ea4450259, 2011-02-20 (annotated)
- Committer:
- mkanli
- Date:
- Sun Feb 20 08:11:35 2011 +0000
- Revision:
- 0:9b3ea4450259
First cut
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mkanli | 0:9b3ea4450259 | 1 | /** |
mkanli | 0:9b3ea4450259 | 2 | * @file |
mkanli | 0:9b3ea4450259 | 3 | * @section LICENSE |
mkanli | 0:9b3ea4450259 | 4 | * Copyright (c) 2010 Mustafa Ozgur Kanli. |
mkanli | 0:9b3ea4450259 | 5 | * |
mkanli | 0:9b3ea4450259 | 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
mkanli | 0:9b3ea4450259 | 7 | * of this software and associated documentation files (the "Software"),to deal |
mkanli | 0:9b3ea4450259 | 8 | * in the Software without restriction, including without limitation the rights |
mkanli | 0:9b3ea4450259 | 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
mkanli | 0:9b3ea4450259 | 10 | * copies of the Software, and to permit persons to whom the Software is |
mkanli | 0:9b3ea4450259 | 11 | * furnished to do so, subject to the following conditions: |
mkanli | 0:9b3ea4450259 | 12 | * |
mkanli | 0:9b3ea4450259 | 13 | * The above copyright notice and this permission notice shall be included in |
mkanli | 0:9b3ea4450259 | 14 | * all copies or substantial portions of the Software. |
mkanli | 0:9b3ea4450259 | 15 | * |
mkanli | 0:9b3ea4450259 | 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
mkanli | 0:9b3ea4450259 | 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
mkanli | 0:9b3ea4450259 | 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
mkanli | 0:9b3ea4450259 | 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
mkanli | 0:9b3ea4450259 | 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
mkanli | 0:9b3ea4450259 | 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
mkanli | 0:9b3ea4450259 | 22 | * THE SOFTWARE. |
mkanli | 0:9b3ea4450259 | 23 | * |
mkanli | 0:9b3ea4450259 | 24 | * @section Description |
mkanli | 0:9b3ea4450259 | 25 | * Implementation of MaxSonar class. |
mkanli | 0:9b3ea4450259 | 26 | */ |
mkanli | 0:9b3ea4450259 | 27 | |
mkanli | 0:9b3ea4450259 | 28 | #include "mbed.h" |
mkanli | 0:9b3ea4450259 | 29 | #include "DimEngAcc3D.h" |
mkanli | 0:9b3ea4450259 | 30 | |
mkanli | 0:9b3ea4450259 | 31 | DimEngAcc3D::DimEngAcc3D(PinName pin_x, PinName pin_y, PinName pin_z) { |
mkanli | 0:9b3ea4450259 | 32 | |
mkanli | 0:9b3ea4450259 | 33 | // Set defaults. |
mkanli | 0:9b3ea4450259 | 34 | initFromVoltage(3.3); |
mkanli | 0:9b3ea4450259 | 35 | this->ain_x = NULL; |
mkanli | 0:9b3ea4450259 | 36 | this->ain_y = NULL; |
mkanli | 0:9b3ea4450259 | 37 | this->ain_z = NULL; |
mkanli | 0:9b3ea4450259 | 38 | |
mkanli | 0:9b3ea4450259 | 39 | // Create analog inputs as required. |
mkanli | 0:9b3ea4450259 | 40 | if (pin_x != NC) |
mkanli | 0:9b3ea4450259 | 41 | this->ain_x = new AnalogIn(pin_x); |
mkanli | 0:9b3ea4450259 | 42 | |
mkanli | 0:9b3ea4450259 | 43 | if (pin_y != NC) |
mkanli | 0:9b3ea4450259 | 44 | this->ain_y = new AnalogIn(pin_y); |
mkanli | 0:9b3ea4450259 | 45 | |
mkanli | 0:9b3ea4450259 | 46 | if (pin_z != NC) |
mkanli | 0:9b3ea4450259 | 47 | this->ain_z = new AnalogIn(pin_z); |
mkanli | 0:9b3ea4450259 | 48 | |
mkanli | 0:9b3ea4450259 | 49 | } |
mkanli | 0:9b3ea4450259 | 50 | |
mkanli | 0:9b3ea4450259 | 51 | DimEngAcc3D::~DimEngAcc3D(void) { |
mkanli | 0:9b3ea4450259 | 52 | |
mkanli | 0:9b3ea4450259 | 53 | if (this->ain_x != NULL) |
mkanli | 0:9b3ea4450259 | 54 | delete this->ain_x; |
mkanli | 0:9b3ea4450259 | 55 | |
mkanli | 0:9b3ea4450259 | 56 | if (this->ain_y != NULL) |
mkanli | 0:9b3ea4450259 | 57 | delete this->ain_y; |
mkanli | 0:9b3ea4450259 | 58 | |
mkanli | 0:9b3ea4450259 | 59 | if (this->ain_z != NULL) |
mkanli | 0:9b3ea4450259 | 60 | delete this->ain_z; |
mkanli | 0:9b3ea4450259 | 61 | } |
mkanli | 0:9b3ea4450259 | 62 | |
mkanli | 0:9b3ea4450259 | 63 | void DimEngAcc3D::initFromVoltage(float voltage) { |
mkanli | 0:9b3ea4450259 | 64 | /* |
mkanli | 0:9b3ea4450259 | 65 | * The equation was obtained from the linear relationship |
mkanli | 0:9b3ea4450259 | 66 | * of the sensitivity and input/reference voltage and two |
mkanli | 0:9b3ea4450259 | 67 | * pairs of sensitivity & voltage value pairs: |
mkanli | 0:9b3ea4450259 | 68 | * 195 mV/g @ 2V and 360mV @ 3.6V |
mkanli | 0:9b3ea4450259 | 69 | * |
mkanli | 0:9b3ea4450259 | 70 | * s = sensitivity (V/g) |
mkanli | 0:9b3ea4450259 | 71 | * v = reference voltage (V) |
mkanli | 0:9b3ea4450259 | 72 | * s = 0.103125*v - 0.01125 |
mkanli | 0:9b3ea4450259 | 73 | */ |
mkanli | 0:9b3ea4450259 | 74 | this->ref_voltage = voltage; |
mkanli | 0:9b3ea4450259 | 75 | this->zero_point = this->ref_voltage / 2.0; |
mkanli | 0:9b3ea4450259 | 76 | this->sensitivity = (0.103125 * this->ref_voltage) - 0.01125; |
mkanli | 0:9b3ea4450259 | 77 | this->x = this->zero_point; |
mkanli | 0:9b3ea4450259 | 78 | this->y = this->zero_point; |
mkanli | 0:9b3ea4450259 | 79 | this->z = this->zero_point; |
mkanli | 0:9b3ea4450259 | 80 | |
mkanli | 0:9b3ea4450259 | 81 | printf("ref: %f, zero: %f, sens: %f \r\n", this->ref_voltage, this->zero_point, this->sensitivity); |
mkanli | 0:9b3ea4450259 | 82 | } |
mkanli | 0:9b3ea4450259 | 83 | |
mkanli | 0:9b3ea4450259 | 84 | void DimEngAcc3D::setVoltage(float voltage) { |
mkanli | 0:9b3ea4450259 | 85 | initFromVoltage(voltage); |
mkanli | 0:9b3ea4450259 | 86 | } |
mkanli | 0:9b3ea4450259 | 87 | |
mkanli | 0:9b3ea4450259 | 88 | void DimEngAcc3D::read(void) { |
mkanli | 0:9b3ea4450259 | 89 | |
mkanli | 0:9b3ea4450259 | 90 | // Read the acceleration outputs. |
mkanli | 0:9b3ea4450259 | 91 | if (this->ain_x != NULL) |
mkanli | 0:9b3ea4450259 | 92 | this->x = this->ain_x->read() * this->ref_voltage; |
mkanli | 0:9b3ea4450259 | 93 | |
mkanli | 0:9b3ea4450259 | 94 | if (this->ain_y != NULL) |
mkanli | 0:9b3ea4450259 | 95 | this->y = this->ain_y->read() * this->ref_voltage; |
mkanli | 0:9b3ea4450259 | 96 | |
mkanli | 0:9b3ea4450259 | 97 | if (this->ain_z != NULL) |
mkanli | 0:9b3ea4450259 | 98 | this->z = this->ain_z->read() * this->ref_voltage; |
mkanli | 0:9b3ea4450259 | 99 | |
mkanli | 0:9b3ea4450259 | 100 | // Convert raw voltage measurements to m/s/s |
mkanli | 0:9b3ea4450259 | 101 | this->x = ACC_G * (this->x - this->zero_point) / this->sensitivity; |
mkanli | 0:9b3ea4450259 | 102 | this->y = ACC_G * (this->y - this->zero_point) / this->sensitivity; |
mkanli | 0:9b3ea4450259 | 103 | this->z = ACC_G * (this->z - this->zero_point) / this->sensitivity; |
mkanli | 0:9b3ea4450259 | 104 | } |
mkanli | 0:9b3ea4450259 | 105 |