accelerometer.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include <stdio.h>
  2. #include "bma400.h"
  3. #define GRAVITY_EARTH (9.80665f) /* Earth's gravity in m/s^2 */
  4. void set_interface(enum bma400_intf intf, struct bma400_dev *dev);
  5. void delay_ms(uint32_t period);
  6. int8_t i2c_reg_write(void *intf_ptr, uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length);
  7. int8_t i2c_reg_read(void *intf_ptr, uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length);
  8. int8_t spi_reg_write(void *intf_ptr, uint8_t cs, uint8_t reg_addr, uint8_t *reg_data, uint16_t length);
  9. int8_t spi_reg_read(void *intf_ptr, uint8_t cs, uint8_t reg_addr, uint8_t *reg_data, uint16_t length);
  10. void print_rslt(int8_t rslt);
  11. float lsb_to_ms2(int16_t val, float g_range, uint8_t bit_width);
  12. float sensor_ticks_to_s(uint32_t sensor_time);
  13. int main(int argc, char const *argv[])
  14. {
  15. struct bma400_dev bma;
  16. struct bma400_sensor_conf conf;
  17. struct bma400_sensor_data data;
  18. int8_t rslt;
  19. uint8_t n_samples = 200;
  20. float t, x, y, z;
  21. set_interface(BMA400_SPI_INTF, &bma);
  22. rslt = bma400_init(&bma);
  23. print_rslt(rslt);
  24. rslt = bma400_soft_reset(&bma);
  25. print_rslt(rslt);
  26. /* Select the type of configuration to be modified */
  27. conf.type = BMA400_ACCEL;
  28. /* Get the accelerometer configurations which are set in the sensor */
  29. rslt = bma400_get_sensor_conf(&conf, 1, &bma);
  30. print_rslt(rslt);
  31. /* Modify the desired configurations as per macros
  32. * available in bma400_defs.h file */
  33. conf.param.accel.odr = BMA400_ODR_100HZ;
  34. conf.param.accel.range = BMA400_2G_RANGE;
  35. conf.param.accel.data_src = BMA400_DATA_SRC_ACCEL_FILT_1;
  36. /* Set the desired configurations to the sensor */
  37. rslt = bma400_set_sensor_conf(&conf, 1, &bma);
  38. print_rslt(rslt);
  39. rslt = bma400_set_power_mode(BMA400_LOW_POWER_MODE, &bma);
  40. print_rslt(rslt);
  41. printf("t[s], Ax[m/s2], Ay[m/s2], Az[m/s2]\r\n");
  42. while (n_samples && (rslt == BMA400_OK)) {
  43. bma.delay_ms(10); /* Wait for 10ms as ODR is set to 100Hz */
  44. rslt = bma400_get_accel_data(BMA400_DATA_SENSOR_TIME, &data, &bma);
  45. print_rslt(rslt);
  46. /* 12-bit accelerometer at range 2G */
  47. x = lsb_to_ms2(data.x, 2, 12);
  48. y = lsb_to_ms2(data.y, 2, 12);
  49. z = lsb_to_ms2(data.z, 2, 12);
  50. t = sensor_ticks_to_s(data.sensortime);
  51. printf("%.4f, %.2f, %.2f, %.2f\r\n", t, x, y, z);
  52. n_samples--;
  53. }
  54. return 0;
  55. }
  56. void set_interface(enum bma400_intf intf, struct bma400_dev *dev)
  57. {
  58. switch (intf) {
  59. case BMA400_I2C_INTF:
  60. dev->intf_ptr = NULL; /* To attach your interface device reference */
  61. dev->delay_ms = delay_ms;
  62. dev->dev_id = BMA400_I2C_ADDRESS_SDO_LOW;
  63. dev->read = i2c_reg_read;
  64. dev->write = i2c_reg_write;
  65. dev->intf = BMA400_I2C_INTF;
  66. break;
  67. case BMA400_SPI_INTF:
  68. dev->intf_ptr = NULL; /* To attach your interface device reference */
  69. dev->dev_id = 0; /* Could be used to identify the chip select line. */
  70. dev->read = spi_reg_read;
  71. dev->write = spi_reg_write;
  72. dev->intf = BMA400_SPI_INTF;
  73. break;
  74. default:
  75. printf("Interface not supported.\r\n");
  76. }
  77. }
  78. void delay_ms(uint32_t period)
  79. {
  80. /* Wait for a period amount of ms*/
  81. }
  82. int8_t i2c_reg_write(void *intf_ptr, uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
  83. {
  84. /* Write to registers using I2C. Return 0 for a successful execution. */
  85. return -1;
  86. }
  87. int8_t i2c_reg_read(void *intf_ptr, uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
  88. {
  89. /* Read from registers using I2C. Return 0 for a successful execution. */
  90. return -1;
  91. }
  92. int8_t spi_reg_write(void *intf_ptr, uint8_t cs, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
  93. {
  94. /* Write to registers using SPI. Return 0 for a successful execution. */
  95. return -1;
  96. }
  97. int8_t spi_reg_read(void *intf_ptr, uint8_t cs, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
  98. {
  99. /* Read from registers using SPI. Return 0 for a successful execution. */
  100. return -1;
  101. }
  102. void print_rslt(int8_t rslt)
  103. {
  104. switch (rslt) {
  105. case BMA400_OK:
  106. /* Do nothing */
  107. break;
  108. case BMA400_E_NULL_PTR:
  109. printf("Error [%d] : Null pointer\r\n", rslt);
  110. break;
  111. case BMA400_E_COM_FAIL:
  112. printf("Error [%d] : Communication failure\r\n", rslt);
  113. break;
  114. case BMA400_E_DEV_NOT_FOUND:
  115. printf("Error [%d] : Device not found\r\n", rslt);
  116. break;
  117. case BMA400_E_INVALID_CONFIG:
  118. printf("Error [%d] : Invalid configuration\r\n", rslt);
  119. break;
  120. case BMA400_W_SELF_TEST_FAIL:
  121. printf("Warning [%d] : Self test failed\r\n", rslt);
  122. break;
  123. default:
  124. printf("Error [%d] : Unknown error code\r\n", rslt);
  125. break;
  126. }
  127. }
  128. float lsb_to_ms2(int16_t val, float g_range, uint8_t bit_width)
  129. {
  130. float half_scale = (float)(1 << bit_width) / 2.0f;
  131. return GRAVITY_EARTH * val * g_range / half_scale;
  132. }
  133. float sensor_ticks_to_s(uint32_t sensor_time)
  134. {
  135. return (float)sensor_time * 0.0000390625f;
  136. }