embox
72 строки · 1.2 Кб
1/**
2* @file
3*
4* @date 06 july 2015
5* @author Anton Bondarev
6*/
7
8#include <util/log.h>9
10#include <math.h>11
12#include <stm32f3_discovery_gyroscope.h>13
14#include <embox/unit.h>15
16#include <drivers/sensors/gyro.h>17
18EMBOX_UNIT_INIT(gyro_init);19
20static float gyro_offset[3];21
22void gyro_get(float *value) {23BSP_GYRO_GetXYZ(value);24}
25
26/* mrad/s */
27static void gyro_data_normalize(float *in, float *out) {28for (int i = 0; i < 3; i++) {29out[i] = in[i] * 8.75f / 360 * 2 * M_PI;30}31}
32
33/* mrad/s, without offset */
34void gyro_data_obtain(float *out) {35float gyro[3] = { 0 };36
37gyro_get(gyro);38gyro_data_normalize(gyro, out);39
40for (int i = 0; i < 3; i++) {41out[i] -= gyro_offset[i];42}43}
44
45static void gyro_calculate_offset(void) {46float eps = 0.2;47
48for (int i = 0; i < 1000; i++) {49float gyro[3] = { 0 };50
51gyro_get(gyro);52
53for (int j = 0; j < 3; j++) {54gyro_offset[j] = (1 - eps) * gyro_offset[j] + eps * gyro[j];55}56}57
58gyro_data_normalize(gyro_offset, gyro_offset);59}
60
61static int gyro_init(void) {62int res;63
64res = BSP_GYRO_Init();65if (res != HAL_OK) {66log_error("BSP_GYRO_Init failed, returned %d\n", res);67return -1;68}69gyro_calculate_offset();70
71return 0;72}
73