You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
4.1 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "encoder.h"
  2. #include "zboard.h"
  3. #include <stdio.h>
  4. #include "zport.h"
  5. static encoder_light_state_t camera_encoder_state = STANDBY;
  6. static encoder_light_state_t driven_encoder_gear_state = STANDBY;
  7. static uint32_t camera_encoder_lastprocess = 0;
  8. static uint32_t driven_encoder_gear_lastprocess = 0;
  9. static encoder_t m_uarts[] = {
  10. {&camera_encoder, TIM_CHANNEL_1 | TIM_CHANNEL_2}, // 相机编码器
  11. {&driven_encoder_gear, TIM_CHANNEL_1 | TIM_CHANNEL_2} // 从动编码器
  12. };
  13. void encoder_all_start(void)
  14. {
  15. for (uint8_t i = 0; i < (sizeof(m_uarts) / sizeof(encoder_t)); i++)
  16. {
  17. HAL_TIM_Encoder_Start(m_uarts[i].tim_handler, m_uarts[i].tim_channel);
  18. }
  19. }
  20. void encoder_all_stop(void)
  21. {
  22. for (uint8_t i = 0; i < (sizeof(m_uarts) / sizeof(encoder_t)); i++)
  23. {
  24. HAL_TIM_Encoder_Stop(m_uarts[i].tim_handler, m_uarts[i].tim_channel);
  25. }
  26. }
  27. bool encoder_clear_counter(encoder_usage_t encoder)
  28. {
  29. for (uint8_t i = 0; i < (sizeof(m_uarts) / sizeof(encoder_t)); i++)
  30. {
  31. if (encoder == i)
  32. {
  33. __HAL_TIM_GET_COUNTER(m_uarts[i].tim_handler) = 0;
  34. return true;
  35. }
  36. }
  37. return false;
  38. }
  39. void encoder_all_clear_counter(void)
  40. {
  41. for (uint8_t i = 0; i < (sizeof(m_uarts) / sizeof(encoder_t)); i++)
  42. {
  43. __HAL_TIM_GET_COUNTER(m_uarts[i].tim_handler) = 0; // 计数器值重新置位
  44. }
  45. }
  46. bool encoder_read_with_encoder(encoder_usage_t encoder, uint32_t *encoder_value)
  47. {
  48. bool get_encoder_value_flag = false;
  49. switch (encoder)
  50. {
  51. case CAMERA_ENCODER:
  52. *encoder_value += (short)__HAL_TIM_GET_COUNTER(m_uarts[encoder].tim_handler);
  53. __HAL_TIM_GET_COUNTER(m_uarts[encoder].tim_handler) = 0; /* 清零 */
  54. get_encoder_value_flag = true;
  55. break;
  56. case DRIVEN_ENCODER_GEAR:
  57. *encoder_value += (short)__HAL_TIM_GET_COUNTER(m_uarts[encoder].tim_handler);
  58. __HAL_TIM_GET_COUNTER(m_uarts[encoder].tim_handler) = 0; /* 清零 */
  59. get_encoder_value_flag = true;
  60. break;
  61. default:
  62. break;
  63. }
  64. return get_encoder_value_flag;
  65. }
  66. void encoder_light_schedule(void)
  67. {
  68. if (camera_encoder_state == STANDBY)
  69. {
  70. if (sys_haspassedms(camera_encoder_lastprocess) > 500)
  71. {
  72. camera_encoder_lastprocess = HAL_GetTick();
  73. HAL_GPIO_TogglePin(ENCODER_LIGHT_GPIO_Port, ENCODER_LIGHT_Pin);
  74. }
  75. }
  76. if (driven_encoder_gear_state == STANDBY)
  77. {
  78. if (sys_haspassedms(camera_encoder_lastprocess) > 500)
  79. {
  80. driven_encoder_gear_lastprocess = HAL_GetTick();
  81. // HAL_GPIO_TogglePin(ENCODER_LIGHT_GPIO_Port, ENCODER_LIGHT_Pin);
  82. }
  83. }
  84. }
  85. void encoder_set_state(encoder_usage_t encoder, encoder_light_state_t state)
  86. {
  87. /* 主动上报的时候常亮,接收到触发指令直接翻转led,待机中0.5s周期闪烁 */
  88. if (encoder == CAMERA_ENCODER)
  89. {
  90. camera_encoder_state = state;
  91. if (state == STANDBY)
  92. {
  93. camera_encoder_lastprocess = HAL_GetTick();
  94. HAL_GPIO_TogglePin(ENCODER_LIGHT_GPIO_Port, ENCODER_LIGHT_Pin);
  95. }
  96. else if (state == WORKING)
  97. {
  98. /* 如果工作状态的时候触发了genlock等,灯的状态不应该变成待机状态,只有同为待机的时候闪烁,上层写的时候需要加判断 */
  99. HAL_GPIO_WritePin(ENCODER_LIGHT_GPIO_Port, ENCODER_LIGHT_Pin, GPIO_PIN_RESET);
  100. }
  101. }
  102. else if (encoder == DRIVEN_ENCODER_GEAR)
  103. {
  104. driven_encoder_gear_state = state;
  105. if (state == STANDBY)
  106. {
  107. driven_encoder_gear_lastprocess = HAL_GetTick();
  108. // HAL_GPIO_TogglePin(ENCODER_LIGHT_GPIO_Port, ENCODER_LIGHT_Pin);
  109. }
  110. else if (state == WORKING)
  111. {
  112. // HAL_GPIO_WritePin(ENCODER_LIGHT_GPIO_Port, ENCODER_LIGHT_Pin, GPIO_PIN_SET);
  113. }
  114. }
  115. }
  116. encoder_light_state_t encoder_get_state(encoder_usage_t encoder)
  117. {
  118. if (encoder == CAMERA_ENCODER)
  119. {
  120. return camera_encoder_state;
  121. }
  122. else if (encoder == DRIVEN_ENCODER_GEAR)
  123. {
  124. return driven_encoder_gear_state;
  125. }
  126. return ENCODER_STATE_NUMBER_AND_ERR_STATE;
  127. }