conversione mdps a gradi del giroscopio su scheda IKS01A1
Dependencies: X_NUCLEO_IKS01A1 mbed
Fork of HelloWorld_IKS01A1 by
Revision 10:5226b32ae4f8, committed 2017-02-14
- Comitter:
- divui
- Date:
- Tue Feb 14 23:33:47 2017 +0000
- Parent:
- 9:49650e8f0bb2
- Commit message:
- .
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 49650e8f0bb2 -r 5226b32ae4f8 main.cpp --- a/main.cpp Thu Nov 24 16:19:41 2016 +0000 +++ b/main.cpp Tue Feb 14 23:33:47 2017 +0000 @@ -1,134 +1,77 @@ -/** - ****************************************************************************** - * @file main.cpp - * @author AST / EST - * @version V0.0.1 - * @date 14-August-2015 - * @brief Simple Example application for using the X_NUCLEO_IKS01A1 - * MEMS Inertial & Environmental Sensor Nucleo expansion board. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ +/* + Conversione dei dati grezzi del giroscopio su scheda IKS01A1 in gradi +*/ /* Includes */ #include "mbed.h" #include "x_nucleo_iks01a1.h" +#define sens 70 + + /* Instantiate the expansion board */ static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15); /* Retrieve the composing elements of the expansion board */ static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope(); static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer(); -static MagneticSensor *magnetometer = mems_expansion_board->magnetometer; -static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor; -static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor; -static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor; -static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor; - -/* Helper function for printing floats & doubles */ -static char *printDouble(char* str, double v, int decimalDigits=2) -{ - int i = 1; - int intPart, fractPart; - int len; - char *ptr; - - /* prepare decimal digits multiplicator */ - for (;decimalDigits!=0; i*=10, decimalDigits--); - - /* calculate integer & fractinal parts */ - intPart = (int)v; - fractPart = (int)((v-(double)(int)v)*i); - - /* fill in integer part */ - sprintf(str, "%i.", intPart); - - /* prepare fill in of fractional part */ - len = strlen(str); - ptr = &str[len]; - - /* fill in leading fractional zeros */ - for (i/=10;i>1; i/=10, ptr++) { - if(fractPart >= i) break; - *ptr = '0'; - } - - /* fill in (rest of) fractional part */ - sprintf(ptr, "%i", fractPart); - - return str; -} /* Simple main function */ int main() { uint8_t id; - float value1, value2; - char buffer1[32], buffer2[32]; int32_t axes[3]; + int32_t off[3]; + float parziale[3] = {0,0,0}; //inizializzazione vettore senza ciclo FOR + float finale[3] = {0,0,0}; + int32_t k=0; printf("\r\n--- Starting new run ---\r\n"); - - humidity_sensor->ReadID(&id); - printf("HTS221 humidity & temperature = 0x%X\r\n", id); - pressure_sensor->ReadID(&id); - printf("LPS25H pressure & temperature = 0x%X\r\n", id); - magnetometer->ReadID(&id); - printf("LIS3MDL magnetometer = 0x%X\r\n", id); gyroscope->ReadID(&id); printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n", id); - wait(3); + wait(1.5); + + //acquisizione offset + accelerometer->Get_X_Axes(off); + printf("off [gyro/mdps]: %6ld, %6ld, %6ld\r\n", off[0], off[1], off[2]); + while(1) { printf("\r\n"); - temp_sensor1->GetTemperature(&value1); - humidity_sensor->GetHumidity(&value2); - printf("HTS221: [temp] %7s°C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2)); - - temp_sensor2->GetFahrenheit(&value1); - pressure_sensor->GetPressure(&value2); - printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2)); - - printf("---\r\n"); - - magnetometer->Get_M_Axes(axes); - printf("LIS3MDL [mag/mgauss]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]); - accelerometer->Get_X_Axes(axes); printf("LSM6DS0 [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]); gyroscope->Get_G_Axes(axes); - printf("LSM6DS0 [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]); + printf("LSM6DS0 RAW [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]); + + for(int i=0;i<3;i++) + axes[i]=axes[i]-off[i]; + + printf("LSM6DS0 FINE [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]); + + + k=k+1; + wait_ms(1); //dt - wait(1.5); + // Ricavo il parziale della velocità angolare + for(int i=0;i<3;i++) + { + parziale[i]=(axes[i]*sens)/1000;// passo da mdps a dpLSB + + finale[i]=(finale[i]-19)/2.84;// levo la correzione per poter sommare i dati parziali + + parziale[i]/= 1000;// moltiplico per il dt (1ms) + + if (axes[i]>150 ||axes[i]<-150) + finale[i] += parziale[i]; // integro + + finale[i]=(finale[i]*2.84)+19;// correggo offset e guadagno che ho ricavato da una "taratura" grezza (ricavo la retta ) + + } + printf("finale [gyro/d]: %6f, %6f, %6f\r\n", finale[0], finale[1], finale[2]);//angolo + } + }