/sw/airborne/modules/ins/ahrs_chimu_uart.c

https://bitbucket.org/tamasszabo/paparazzi_mavlink · C · 103 lines · 69 code · 24 blank · 10 comment · 6 complexity · 7ff56e3929f03a59416d3cd05b16e30c MD5 · raw file

  1. /*
  2. C code to connect a CHIMU using uart
  3. */
  4. #include <stdbool.h>
  5. // Output
  6. #include "state.h"
  7. // For centripedal corrections
  8. #include "subsystems/gps.h"
  9. #include "subsystems/ahrs.h"
  10. #include "generated/airframe.h"
  11. #if CHIMU_DOWNLINK_IMMEDIATE
  12. #ifndef DOWNLINK_DEVICE
  13. #define DOWNLINK_DEVICE DOWNLINK_AP_DEVICE
  14. #endif
  15. #include "mcu_periph/uart.h"
  16. #include "messages.h"
  17. #include "subsystems/datalink/downlink.h"
  18. #endif
  19. #include "ins_module.h"
  20. #include "imu_chimu.h"
  21. #include "led.h"
  22. CHIMU_PARSER_DATA CHIMU_DATA;
  23. INS_FORMAT ins_roll_neutral;
  24. INS_FORMAT ins_pitch_neutral;
  25. void ahrs_init(void)
  26. {
  27. ahrs.status = AHRS_UNINIT;
  28. uint8_t ping[7] = {CHIMU_STX, CHIMU_STX, 0x01, CHIMU_BROADCAST, MSG00_PING, 0x00, 0xE6 };
  29. uint8_t rate[12] = {CHIMU_STX, CHIMU_STX, 0x06, CHIMU_BROADCAST, MSG10_UARTSETTINGS, 0x05, 0xff, 0x79, 0x00, 0x00, 0x01, 0x76 }; // 50Hz attitude only + SPI
  30. uint8_t quaternions[7] = {CHIMU_STX, CHIMU_STX, 0x01, CHIMU_BROADCAST, MSG09_ESTIMATOR, 0x01, 0x39 }; // 25Hz attitude only + SPI
  31. // uint8_t rate[12] = {CHIMU_STX, CHIMU_STX, 0x06, CHIMU_BROADCAST, MSG10_UARTSETTINGS, 0x04, 0xff, 0x79, 0x00, 0x00, 0x01, 0xd3 }; // 25Hz attitude only + SPI
  32. // uint8_t euler[7] = {CHIMU_STX, CHIMU_STX, 0x01, CHIMU_BROADCAST, MSG09_ESTIMATOR, 0x00, 0xaf }; // 25Hz attitude only + SPI
  33. new_ins_attitude = 0;
  34. ins_roll_neutral = INS_ROLL_NEUTRAL_DEFAULT;
  35. ins_pitch_neutral = INS_PITCH_NEUTRAL_DEFAULT;
  36. CHIMU_Init(&CHIMU_DATA);
  37. // Request Software version
  38. for (int i=0;i<7;i++) {
  39. InsUartSend1(ping[i]);
  40. }
  41. // Quat Filter
  42. for (int i=0;i<7;i++) {
  43. InsUartSend1(quaternions[i]);
  44. }
  45. // 50Hz
  46. CHIMU_Checksum(rate,12);
  47. InsSend(rate,12);
  48. }
  49. void ahrs_align(void)
  50. {
  51. ahrs.status = AHRS_RUNNING;
  52. }
  53. void parse_ins_msg( void )
  54. {
  55. while (InsLink(ChAvailable())) {
  56. uint8_t ch = InsLink(Getch());
  57. if (CHIMU_Parse(ch, 0, &CHIMU_DATA)) {
  58. if(CHIMU_DATA.m_MsgID==0x03) {
  59. new_ins_attitude = 1;
  60. RunOnceEvery(25, LED_TOGGLE(3) );
  61. if (CHIMU_DATA.m_attitude.euler.phi > M_PI) {
  62. CHIMU_DATA.m_attitude.euler.phi -= 2 * M_PI;
  63. }
  64. struct FloatEulers att = {
  65. CHIMU_DATA.m_attitude.euler.phi,
  66. CHIMU_DATA.m_attitude.euler.theta,
  67. CHIMU_DATA.m_attitude.euler.psi
  68. };
  69. stateSetNedToBodyEulers_f(&att);
  70. #if CHIMU_DOWNLINK_IMMEDIATE
  71. DOWNLINK_SEND_AHRS_EULER(DefaultChannel, DefaultDevice, &CHIMU_DATA.m_attitude.euler.phi, &CHIMU_DATA.m_attitude.euler.theta, &CHIMU_DATA.m_attitude.euler.psi);
  72. #endif
  73. }
  74. }
  75. }
  76. }
  77. void ahrs_update_gps( void )
  78. {
  79. }