mt6701_sensor.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "mt6701_sensor.h"
  2. #include "driver/spi_master.h"
  3. static const float ALPHA = 0.4;
  4. static uint8_t tableCRC6[64] = {
  5. 0x00, 0x03, 0x06, 0x05, 0x0C, 0x0F, 0x0A, 0x09,
  6. 0x18, 0x1B, 0x1E, 0x1D, 0x14, 0x17, 0x12, 0x11,
  7. 0x30, 0x33, 0x36, 0x35, 0x3C, 0x3F, 0x3A, 0x39,
  8. 0x28, 0x2B, 0x2E, 0x2D, 0x24, 0x27, 0x22, 0x21,
  9. 0x23, 0x20, 0x25, 0x26, 0x2F, 0x2C, 0x29, 0x2A,
  10. 0x3B, 0x38, 0x3D, 0x3E, 0x37, 0x34, 0x31, 0x32,
  11. 0x13, 0x10, 0x15, 0x16, 0x1F, 0x1C, 0x19, 0x1A,
  12. 0x0B, 0x08, 0x0D, 0x0E, 0x07, 0x04, 0x01, 0x02
  13. };
  14. /*32-bit input data, right alignment, Calculation over 18 bits (mult. of 6) */
  15. static uint8_t CRC6_43_18bit (uint32_t w_InputData)
  16. {
  17. uint8_t b_Index = 0;
  18. uint8_t b_CRC = 0;
  19. b_Index = (uint8_t )(((uint32_t)w_InputData >> 12u) & 0x0000003Fu);
  20. b_CRC = (uint8_t )(((uint32_t)w_InputData >> 6u) & 0x0000003Fu);
  21. b_Index = b_CRC ^ tableCRC6[b_Index];
  22. b_CRC = (uint8_t )((uint32_t)w_InputData & 0x0000003Fu);
  23. b_Index = b_CRC ^ tableCRC6[b_Index];
  24. b_CRC = tableCRC6[b_Index];
  25. return b_CRC;
  26. }
  27. #if SENSOR_MT6701
  28. MT6701Sensor::MT6701Sensor() {}
  29. void MT6701Sensor::init() {
  30. pinMode(PIN_MT_CSN, OUTPUT);
  31. digitalWrite(PIN_MT_CSN, HIGH);
  32. spi_bus_config_t tx_bus_config = {
  33. .mosi_io_num = -1,
  34. .miso_io_num = PIN_MT_DATA,
  35. .sclk_io_num = PIN_MT_CLOCK,
  36. .quadwp_io_num = -1,
  37. .quadhd_io_num = -1,
  38. .max_transfer_sz = 1000,
  39. };
  40. esp_err_t ret = spi_bus_initialize(HSPI_HOST, &tx_bus_config, 1);
  41. ESP_ERROR_CHECK(ret);
  42. spi_device_interface_config_t tx_device_config = {
  43. .command_bits=0,
  44. .address_bits=0,
  45. .dummy_bits=0,
  46. .mode=1,
  47. .duty_cycle_pos=0,
  48. .cs_ena_pretrans=4,
  49. .cs_ena_posttrans=0,
  50. .clock_speed_hz=4000000,
  51. .input_delay_ns=0,
  52. .spics_io_num=PIN_MT_CSN,
  53. .flags = 0,
  54. .queue_size=1,
  55. .pre_cb=NULL,
  56. .post_cb=NULL,
  57. };
  58. ret=spi_bus_add_device(HSPI_HOST, &tx_device_config, &spi_device_);
  59. ESP_ERROR_CHECK(ret);
  60. spi_transaction_.flags = SPI_TRANS_USE_RXDATA;
  61. spi_transaction_.length = 24;
  62. spi_transaction_.rxlength = 24;
  63. spi_transaction_.tx_buffer = NULL;
  64. spi_transaction_.rx_buffer = NULL;
  65. }
  66. float MT6701Sensor::getSensorAngle() {
  67. uint32_t now = micros();
  68. if (now - last_update_ > 100) {
  69. esp_err_t ret=spi_device_polling_transmit(spi_device_, &spi_transaction_);
  70. assert(ret==ESP_OK);
  71. uint32_t spi_32 = (spi_transaction_.rx_data[0] << 16) | (spi_transaction_.rx_data[1] << 8) | spi_transaction_.rx_data[2];
  72. uint32_t angle_spi = spi_32 >> 10;
  73. uint8_t field_status = (spi_32 >> 6) & 0x3;
  74. uint8_t push_status = (spi_32 >> 8) & 0x1;
  75. uint8_t loss_status = (spi_32 >> 9) & 0x1;
  76. uint8_t received_crc = spi_32 & 0x3F;
  77. uint8_t calculated_crc = CRC6_43_18bit(spi_32 >> 6);
  78. if (received_crc == calculated_crc) {
  79. float new_angle = (float)angle_spi * 2 * PI / 16384;
  80. float new_x = cosf(new_angle);
  81. float new_y = sinf(new_angle);
  82. x_ = new_x * ALPHA + x_ * (1-ALPHA);
  83. y_ = new_y * ALPHA + y_ * (1-ALPHA);
  84. } else {
  85. Serial.printf("Bad CRC. expected %d, actual %d\n", calculated_crc, received_crc);
  86. }
  87. last_update_ = now;
  88. }
  89. float rad = -atan2f(y_, x_);
  90. if (rad < 0) {
  91. rad += 2*PI;
  92. }
  93. return rad;
  94. }
  95. #endif