kinco.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. /*
  2. * @Description:
  3. 该协议一问一答上传,问在task_can中进行
  4. 对外3个接口:
  5. 数据解析,存在结构体
  6. 对外提供结构体查询
  7. 在线计时
  8. 底层 处理完毕
  9. 先给工作模式,再给控制字86 ,再给F,再给转速
  10. * @version:
  11. * @Author: Joe
  12. * @Date: 2021-11-13 21:55:10
  13. * @LastEditTime: 2021-11-13 21:55:11
  14. */
  15. #include "kinco.h"
  16. #include "chassis_bus.h"
  17. #define DBG_TAG "kinco"
  18. #define DBG_LVL DBG_INFO
  19. #include <rtdbg.h>
  20. static MOTOR_TypeDef motor = {0};
  21. #if defined SEND_ADCC_EN
  22. static uint16_t ACC_TIME = 500;
  23. static uint16_t DCC_TIME = 500;
  24. uint8_t get_motor_acc(void)
  25. {
  26. return motor.acc;
  27. }
  28. /****************************************
  29. * 设置加减速
  30. *函数功能 :
  31. *参数描述 : param = 0x00,0xb8:加速度
  32. param = 0x00,0xb9:减速度
  33. value:时间,单位ms
  34. //00 24 00 b9 03 e8 00 00默认1000
  35. *返回值 : 返回发送的can结构体
  36. ****************************************/
  37. struct rt_can_msg send_motor_acc(void)
  38. {
  39. struct rt_can_msg tx_msg;
  40. tx_msg.id = motor.id+0x100;
  41. tx_msg.ide = RT_CAN_STDID; /* 标准格式 */
  42. tx_msg.rtr = RT_CAN_DTR; /* 数据帧 */
  43. tx_msg.len = 8; /* 数据长度为 8 */
  44. tx_msg.data[0] = 0x00; /* 源地址 */
  45. tx_msg.data[1] = 0x24; /* 功能码 */
  46. tx_msg.data[2] = 0x00; /* 寄存器地址 */
  47. tx_msg.data[3] = 0xb8; /* 寄存器地址 */
  48. tx_msg.data[4] = ACC_TIME>>8; /* 时间值 */
  49. tx_msg.data[5] = ACC_TIME; /* 时间值 */
  50. return tx_msg;
  51. }
  52. uint8_t get_motor_dcc(void)
  53. {
  54. return motor.dcc;
  55. }
  56. /****************************************
  57. * 设置加减速
  58. *函数功能 :
  59. *参数描述 : param = 0x00,0xb8:加速度
  60. param = 0x00,0xb9:减速度
  61. value:时间,单位ms
  62. //00 24 00 b9 03 e8 00 00默认1000
  63. *返回值 : 返回发送的can结构体
  64. ****************************************/
  65. struct rt_can_msg send_motor_dcc(void)
  66. {
  67. struct rt_can_msg tx_msg;
  68. tx_msg.id = motor.id+0x100;
  69. tx_msg.ide = RT_CAN_STDID; /* 标准格式 */
  70. tx_msg.rtr = RT_CAN_DTR; /* 数据帧 */
  71. tx_msg.len = 8; /* 数据长度为 8 */
  72. tx_msg.data[0] = 0x00; /* 源地址 */
  73. tx_msg.data[1] = 0x24; /* 功能码 */
  74. tx_msg.data[2] = 0x00; /* 寄存器地址 */
  75. tx_msg.data[3] = 0xb9; /* 寄存器地址 */
  76. tx_msg.data[4] = DCC_TIME>>8; /* 时间值 */
  77. tx_msg.data[5] = DCC_TIME; /* 时间值 */
  78. return tx_msg;
  79. }
  80. #endif /* SEND_ADCC_EN */
  81. #if defined SEND_MODE_EN
  82. /****************************************
  83. * 设置 位置/速度 模式
  84. *函数功能 :
  85. *参数描述 :
  86. value:0x00,0x06:位置模式
  87. 0x00,0x02:速度模式
  88. //00 1e 00 03 00 06 00 00
  89. //00 1e 00 03 00 02 00 00
  90. *返回值 : 返回发送的can结构体
  91. ****************************************/
  92. uint8_t get_motor_mode(void)
  93. {
  94. return motor.mode;
  95. }
  96. struct rt_can_msg send_motor_speed_mode(void)
  97. {
  98. struct rt_can_msg tx_msg;
  99. tx_msg.id = motor.id + 0x600;
  100. tx_msg.ide = RT_CAN_STDID; /* 标准格式 */
  101. tx_msg.rtr = RT_CAN_DTR; /* 数据帧 */
  102. tx_msg.len = 6; /* 数据长度为 8 */
  103. tx_msg.data[0] = 0x2F; /* 源地址 */
  104. tx_msg.data[1] = 0x60; /* 功能码 */
  105. tx_msg.data[2] = 0x60; /* 寄存器地址 */
  106. tx_msg.data[3] = 0x00; /* 寄存器地址 */
  107. tx_msg.data[4] = 0x03; /* 值 */
  108. tx_msg.data[5] = 0x00; /* 值 */
  109. return tx_msg;
  110. }
  111. struct rt_can_msg send_motor_control_mode(void)
  112. {
  113. struct rt_can_msg tx_msg;
  114. tx_msg.id = motor.id + 0x600;
  115. tx_msg.ide = RT_CAN_STDID; /* 标准格式 */
  116. tx_msg.rtr = RT_CAN_DTR; /* 数据帧 */
  117. tx_msg.len = 6; /* 数据长度为 8 */
  118. tx_msg.data[0] = 0x2B; /* 源地址 */
  119. tx_msg.data[1] = 0x40; /* 功能码 */
  120. tx_msg.data[2] = 0x60; /* 寄存器地址 */
  121. tx_msg.data[3] = 0x00; /* 寄存器地址 */
  122. tx_msg.data[4] = 0x0F; /* 值 */
  123. tx_msg.data[5] = 0x00; /* 值 */
  124. return tx_msg;
  125. }
  126. #endif /* SEND_MODE_EN */
  127. #if defined SEND_RPM_EN
  128. /****************************************
  129. * 设置转速
  130. *函数功能 :
  131. *参数描述 :
  132. value:转速值,带符号,最大3000转速
  133. //00 28 00 00 00 64 00 00
  134. *返回值 : 返回发送的can结构体
  135. ****************************************/
  136. void set_motor_rpm(int16_t rpm)
  137. {
  138. motor.rpm = rpm;
  139. }
  140. struct rt_can_msg send_motor_rpm(void)
  141. {
  142. struct rt_can_msg tx_msg;
  143. int32_t dec = 0;
  144. dec = motor.rpm*2730; //编码器的值
  145. tx_msg.id = motor.id+0x600;
  146. tx_msg.ide = RT_CAN_STDID; /* 标准格式 */
  147. tx_msg.rtr = RT_CAN_DTR; /* 数据帧 */
  148. tx_msg.len = 8; /* 数据长度为 8 */
  149. tx_msg.data[0] = 0x23; /* 发送命令 */
  150. tx_msg.data[1] = 0xFF; /* 对象索引 */
  151. tx_msg.data[2] = 0x60; /* 对象索引 */
  152. tx_msg.data[3] = 0x00; /* 对象子索引 */
  153. tx_msg.data[4] = dec; /* 值 */
  154. tx_msg.data[5] = dec>>8; /* 值 */
  155. tx_msg.data[6] = dec>>16; /* 值 */
  156. tx_msg.data[7] = dec>>24; /* 值 */
  157. return tx_msg;
  158. }
  159. #endif /* SEND_RPM_EN */
  160. uint8_t motor_init_ok(void)
  161. {
  162. struct rt_can_msg msg;
  163. if(motor.mode != 3)
  164. {
  165. msg = send_motor_speed_mode();
  166. chassis_bus_write(&msg, sizeof(msg));
  167. return 1;
  168. }
  169. else
  170. {
  171. if(motor.control != 0X0F)
  172. {
  173. msg = send_motor_control_mode();
  174. chassis_bus_write(&msg, sizeof(msg));
  175. return 1;
  176. }
  177. else
  178. return 0;
  179. }
  180. }
  181. uint8_t motor_msg_parse(struct rt_can_msg *msg)
  182. {
  183. uint8_t temp = 1;
  184. uint16_t svd;
  185. if(msg->ide!=RT_CAN_STDID)
  186. return temp;
  187. if(msg->id == motor.id + 0x580) /* 定时上传 */
  188. {
  189. temp = 0;
  190. svd = (msg->data[1]<<8) + msg->data[2];
  191. switch(svd)/* 功能码 */
  192. {
  193. case 0x6060: //工作模式
  194. motor.mode = msg->data[4]; //
  195. break;
  196. case 0x4060: //控制字
  197. motor.control = msg->data[4]; //
  198. break;
  199. default:
  200. break;
  201. }
  202. }
  203. // else
  204. // if(msg->id == 0x0700) /*即发即回:主站发送,从站回复,以0x700为id,功能码+1,进行状态和参数信息交换*/
  205. // {
  206. // temp = 0;
  207. // if(msg->data[0] == motor.id) /* 源地址 */
  208. // {
  209. // if(msg->data[1] ==0x1F)/* 功能码 */
  210. // {
  211. // if(msg->data[2]==0x00 && msg.data[3]==0x03) /* 速度模式地址 */
  212. // {
  213. // if(msg.data[5] == mode_pos)
  214. // motor.mode = mode_pos;
  215. // else
  216. // if(msg.data[5] == mode_speed)
  217. // motor.mode = mode_speed;
  218. // }
  219. // }
  220. // else
  221. // if(msg.data[1] ==0x25)/* 功能码 */
  222. // {
  223. // if(msg.data[2]==0x00 && msg.data[3]==0xb8) /* 加速度地址 */
  224. // {
  225. // motor.acc = 1;
  226. // }
  227. // else
  228. // if(msg.data[2]==0x00 && msg.data[3]==0xb9) /* 减速度地址 */
  229. // {
  230. // motor.dcc = 1;
  231. // }
  232. // }
  233. // }
  234. // }
  235. //数据解析
  236. return temp;
  237. }
  238. uint8_t get_motor_err(void)
  239. {
  240. return motor.err;
  241. }
  242. struct rt_can_msg send_motor_reset(void)
  243. {
  244. struct rt_can_msg tx_msg;
  245. tx_msg.id = motor.id+0x100;
  246. tx_msg.ide = RT_CAN_STDID; /* 标准格式 */
  247. tx_msg.rtr = RT_CAN_DTR; /* 数据帧 */
  248. tx_msg.len = 8; /* 数据长度为 8 */
  249. tx_msg.data[0] = 0x00; /* 源地址 */
  250. tx_msg.data[1] = 0x21; /* 功能码 */
  251. tx_msg.data[2] = 0x00; /* 寄存器地址 */
  252. tx_msg.data[3] = 0x11; /* 寄存器地址 */
  253. tx_msg.data[4] = 0x00; /* 值 */
  254. tx_msg.data[5] = 0x01; /* 值 */
  255. tx_msg.data[6] = 0x00;
  256. tx_msg.data[7] = 0x01;
  257. return tx_msg;
  258. }
  259. static void motor_param_init(void)
  260. {
  261. motor.mode = 0;
  262. motor.id = 0x7a;
  263. motor.err = 0;
  264. motor.rpm = 0;
  265. }
  266. /****************************************
  267. * motor_init
  268. *函数功能 : 配置初始化
  269. *参数描述 : 无
  270. *返回值 : 无
  271. ****************************************/
  272. int motor_init(void)
  273. {
  274. motor_param_init();
  275. return RT_EOK;
  276. }
  277. INIT_APP_EXPORT(motor_init);