Class to read acceleration measurements from Dimension Engineering Buffered +-3g Tri-axis Accelerometer device.

Committer:
mkanli
Date:
Sun Feb 20 08:11:35 2011 +0000
Revision:
0:9b3ea4450259
First cut

Who changed what in which revision?

UserRevisionLine numberNew 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