正点原子开发板 alientek_develop_board cancmder
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.

210 lines
7.5 KiB

2 years ago
  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include "sdk/os/zos.hpp"
  7. // #include "sdk/os/zos.hpp"
  8. #define ZSTRUCT(name, ...) \
  9. typedef struct { \
  10. __VA_ARGS__ \
  11. } name;
  12. namespace iflytop {
  13. namespace feite {
  14. typedef enum {
  15. kping = 0x01,
  16. kread = 0x02,
  17. kwrite = 0x03,
  18. kasyncWrite = 0x04,
  19. } cmd_e;
  20. typedef enum {
  21. kServoMode = 0, // λ���ŷ�ģʽ 42 �ŵ�ַ�����Ƶ���λ��
  22. kMotorMode = 1, // ��������ģʽ 46 �ŵ�ַ�����ٶ������Ƶ����ٶ� BIT15 Ϊ����λ
  23. kOpenMotorMode = 2, // Ť�ص���ģʽ 44 �ŵ�ַ�����ƣ�1000��Ť��
  24. kStepMotorMode = 3, // ��������ģʽ
  25. } run_mode_e; // reg:33
  26. typedef enum {
  27. kRegFirmwareMainVersion = 0, // �̼����汾��
  28. kRegFirmwareSubVersion = 1, // �̼��ΰ汾��
  29. kRegServoMainVersion = 3, // �������汾��
  30. kRegServoSubVersion = 4, // �����ΰ汾��
  31. kRegServoId = 5, // ID
  32. kRegServoBaudRate = 6, // ������
  33. kRegServoDelay = 7, // ������ʱ
  34. kRegServoAckLevel = 8, // Ӧ��״̬����
  35. kRegServoMinAngle = 9, // ��С�Ƕ�����
  36. kRegServoMaxAngle = 11, // �����Ƕ�����
  37. kRegServoMaxTemp = 13, // �����¶�����
  38. kRegServoMaxVoltage = 14, // ����������ѹ
  39. kRegServoMinVoltage = 15, // ����������ѹ
  40. kRegServoMaxTorque = 16, // ����Ť��
  41. kRegServoPhase = 18, // ��λ
  42. kRegServoUnloadCondition = 19, // �����
  43. kRegServoLedAlarmCondition = 20, // LED ��������
  44. kRegServoP = 21, // P ����ϵ
  45. kRegServoD = 22, // D ΢��ϵ
  46. kRegServoI = 23, // I
  47. kRegServoMinStart = 24, // ������
  48. kRegServoCwDeadZone = 26, // ˳ʱ�벻������
  49. kRegServoCcwDeadZone = 27, // ��ʱ�벻����
  50. kRegServoProtectCurrent = 28, // ��������
  51. kRegServoAngleResolution = 30, // �Ƕȷֱ�
  52. kRegServoCalibration = 31, // λ��У�� BIT11Ϊ����λ����ʾ����������BIT0~10λ��ʾ��Χ0-2047��
  53. kRegServoRunMode = 33, // ����ģʽ
  54. kRegServoProtectTorque = 34, // ����Ť��
  55. kRegServoProtectTime = 35, // ����ʱ��
  56. kRegServoOverloadTorque = 36, // ����Ť��
  57. kRegServoSpeedP = 37, // �ٶȱջ�P��������
  58. kRegServoOverloadTime = 38, // ��������ʱ��
  59. kRegServoSpeedI = 39, // �ٶȱջ�I���ֲ���
  60. kRegServoTorqueSwitch = 40, // Ť�ؿ���
  61. kRegServoAcc = 41, // ���ٶ�
  62. kRegServoTargetPos = 42, // Ŀ��λ��
  63. kRegServoRunTime = 44, // ����ʱ��
  64. kRegServoRunSpeed = 46, // �����ٶ�
  65. kRegServoTorqueLimit = 48, // ת������
  66. kRegServoLockFlag = 55, // ����־
  67. kRegServoCurrentPos = 56, // ��ǰλ��
  68. kRegServoCurrentSpeed = 58, // ��ǰ�ٶ�
  69. kRegServoCurrentLoad = 60, // ��ǰ���� bit10Ϊ����λ
  70. kRegServoCurrentVoltage = 62, // ��ǰ��ѹ
  71. kRegServoCurrentTemp = 63, // ��ǰ�¶�
  72. kRegServoAsyncWriteFlag = 64, // �첽д��־
  73. kRegServoStatus = 65, // ����״̬
  74. kRegServoMoveFlag = 66, // �ƶ���־
  75. kRegServoCurrentCurrent = 69, // ��ǰ����
  76. kRegServoCheckSpeed = 80, // 80 �ƶ������ٶ�
  77. kRegServoDTime = 81, // 81 D����ʱ��
  78. kRegServoSpeedUnit = 82, // 82 �ٶȵ�λϵ��
  79. kRegServoMinSpeedLimit = 83, // 83 ��С�ٶ�����
  80. kRegServoMaxSpeedLimit = 84, // 84 �����ٶ�����
  81. kRegServoAccLimit = 85, // 85 ���ٶ�����
  82. kRegServoAccMultiple = 86, // 86 ���ٶȱ���
  83. } reg_add_e;
  84. #pragma pack(1)
  85. ZSTRUCT(ping_cmd_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t cmd; uint8_t checksum;)
  86. ZSTRUCT(ping_resp_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t status; uint8_t checksum;)
  87. ZSTRUCT(receipt_header_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t status; uint8_t data[];)
  88. ZSTRUCT(cmd_header_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t cmd; uint8_t data[];)
  89. #pragma pack()
  90. }; // namespace feite
  91. using namespace feite;
  92. class FeiTeServoMotor {
  93. public:
  94. #pragma pack(1)
  95. typedef struct {
  96. uint16_t pos; // 56 ��ǰλ�� (0->4096)
  97. int16_t vel; // 58 �з��� bit15Ϊ����λ 0.732RPM
  98. int16_t torque; // 60 Ť��:0.1%
  99. } status_t;
  100. typedef struct {
  101. uint16_t pos; // 56 ��ǰλ�� (0->4096)
  102. int16_t vel; // 58 �з��� bit15Ϊ����λ 0.732RPM
  103. int16_t torque; // 60 �з��� bit10Ϊ����λ Ť��:0.1%
  104. uint8_t voltage; // 62 ��ѹ:0.1v
  105. uint8_t temperature; // 63 �¶�:1��
  106. uint8_t __pad0; // 64 ռλ
  107. uint8_t state; // 65 ����״̬ Bit0:��ѹ Bit1:������ Bit2:�¶� Bit3:���� Bit4:�Ƕ� Bit5:����
  108. uint8_t moveflag; // 66 �ƶ���־
  109. uint8_t __pad1; // 67
  110. uint8_t __pad2; // 68
  111. uint16_t current; // 69 ��ǰ���� ��λ:6.5mA
  112. } detailed_status_t;
  113. #pragma pack()
  114. private:
  115. UART_HandleTypeDef* m_uart;
  116. DMA_HandleTypeDef* m_hdma_rx;
  117. DMA_HandleTypeDef* m_hdma_tx;
  118. uint8_t m_txbuf[128] = {0};
  119. uint8_t m_rxbuf[128] = {0};
  120. public:
  121. void initialize(UART_HandleTypeDef* uart, DMA_HandleTypeDef* hdma_rx, DMA_HandleTypeDef* hdma_tx);
  122. bool ping(uint8_t id);
  123. bool readversion(uint8_t id, uint8_t& mainversion, uint8_t& subversion, uint8_t& miniserv_mainversion, uint8_t& miniserv_subversion);
  124. bool setmode(uint8_t id, run_mode_e runmode);
  125. run_mode_e getmode(uint8_t id);
  126. bool getmode(uint8_t id, run_mode_e& runmode);
  127. // kRegServoTorqueSwitch
  128. bool setTorqueSwitch(uint8_t id, bool on);
  129. bool getTorqueSwitch(uint8_t id, bool& on);
  130. bool getNowPos(uint8_t id, int16_t& pos);
  131. bool setTargetPos(uint8_t id, int16_t pos);
  132. bool getServoCalibration(uint8_t, int16_t& poscalibration);
  133. bool reCalibration(int id, int16_t pos);
  134. bool triggerAysncWrite(uint8_t id);
  135. /**
  136. * @brief ת
  137. *
  138. * @param id
  139. * @param speed ٶ
  140. * @param torque Ť 0->1000 0/1000ΪŤ
  141. * @return true
  142. * @return false
  143. */
  144. bool rotate(uint8_t id, int16_t speed, uint16_t torque = 0);
  145. /**
  146. * @brief ƶָλ
  147. *
  148. * @param id
  149. * @param pos
  150. * @param speed
  151. * @param torque
  152. * @return true
  153. * @return false
  154. */
  155. bool moveTo(uint8_t id, int16_t pos, int16_t speed, uint16_t torque);
  156. bool moveWithTorque(uint8_t id, int16_t torque);
  157. bool read_status(uint8_t id, status_t* status);
  158. void dump_status(status_t* status);
  159. bool read_detailed_status(uint8_t id, detailed_status_t* detailed_status);
  160. void dump_detailed_status(detailed_status_t* detailed_status);
  161. bool getMoveFlag(uint8_t id, uint8_t& moveflag);
  162. public:
  163. bool write_u8(uint8_t id, feite::reg_add_e add, uint8_t regval);
  164. bool write_u16(uint8_t id, feite::reg_add_e add, uint16_t regval);
  165. bool write_s16(uint8_t id, feite::reg_add_e add, uint8_t signbitoff, int16_t regval);
  166. bool async_write_u8(uint8_t id, feite::reg_add_e add, uint8_t regval);
  167. bool async_write_u16(uint8_t id, feite::reg_add_e add, uint16_t regval);
  168. bool async_write_s16(uint8_t id, feite::reg_add_e add, uint8_t signbitoff, int16_t regval);
  169. bool read_u8(uint8_t id, feite::reg_add_e add, uint8_t& regval);
  170. bool read_u16(uint8_t id, feite::reg_add_e add, uint16_t& regval);
  171. bool read_s16(uint8_t id, feite::reg_add_e add, uint8_t signbitoff, int16_t& regval);
  172. public:
  173. bool write_reg(uint8_t id, bool async, uint8_t add, uint8_t* data, uint8_t len);
  174. bool read_reg(uint8_t id, uint8_t add, uint8_t* data, uint8_t len);
  175. bool tx_and_rx(uint8_t* tx, uint8_t txdatalen, uint8_t* rx, uint8_t expectrxsize, uint16_t overtimems);
  176. private:
  177. uint8_t checksum(uint8_t* data, uint8_t len);
  178. uint8_t checksum_packet(uint8_t* data, uint8_t len);
  179. };
  180. } // namespace iflytop