基于STM32的多圈绝对值编码器的调试
1 硬件选型:
本设计主要应用到的模块如下,仅对关键模块进行了特殊说明。
- STM32型号:STM32F103C8T6
- 绝对值编码器:1501磁编码器金属壳(支持多圈和单圈)
- 485转TTL模块(绝对值编码器与MCU数据交互的桥梁)
- ST-LINK V2
- USB转TTL模块(与USART2完成通讯,控制USART1)
- 面包板、跳线(由于时间和环境限制,本设计并未打样PCB,后续时间允许会完善该设计.......)
1.1 接线图


1.2 绝对值编码器:
这款21位绝对式磁编码器适用于17位高性能伺服系统,支持多摩川通信协议,最高通信速率可达2.5Mbps。其引脚定义如下:
| 线颜色 | 说明 |
|---|---|
| 红色 | 5V |
| 黑色 | GND |
| 蓝色 | 485-A |
| 黄色 | 485-B |
| 白色 | PWM(未使用) |
多摩川协议发送指令的格式(具体通讯方式参考商家网站,里面对多摩川协议进行了细致讲解):
角度数据查询示例: 发送指令:1A 返回数据:1A 00 7A 6D 0F 0A 00 00 00 00 08
设备信息查询: 发送指令:92 返回数据:92 89 13 31 75 96 2A 9D 13 75
1.3 485转TTL模块
本设计的485模块,大家在某宝即可购买到,接线的话直接和编码器的 A B引脚相接即可,供电电压为5V。此外,需要注意的是485模块分为本设计中的模块,还有MAX485模块。MAX485模块实现通讯的时候需要注意与MCU相连端还需配置控制器引脚。
2 软件设计
2.1 数据解析(参考商家例程)
①配置串口中断函数
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { received_byte = USART_ReceiveData(USART1);if(tmg_rx_index < 20){tmg_rx_buffer[tmg_rx_index++] = received_byte;}if(tmg_rx_index == tmg_expected_len){tmg_data_ready = 1;Recieve_Flg = 1;}} }
②数据解析
bool tmgDecode_1A(uint8_t *tmgbuf)
{if(tmgbuf[0] != 0x1A) {printf("1A command header error: 0x%02X\r\n", tmgbuf[0]);return false;}if(tmgbuf[10] == crc8_xor_list(0x01, tmgbuf, 10)){SF = tmgbuf[1]; // SFABS = tmgbuf[2] | (tmgbuf[3] << 8) | (tmgbuf[4] << 16); //ABSENID = tmgbuf[5]; // ENIDABM = (int16_t)(tmgbuf[6] | (tmgbuf[7] << 8)); // ABMALMC = tmgbuf[9]; // ALMCreturn true;} else {printf("1A CRC check failed!\r\n");return false;}
}
2.2 数据发送
if(Recieve_Flg2 == 1){printf("USART2 Received: %c (0x%02X)\r\n", receive, receive); resetTmgReceiver();switch(receive) {case 'A': printf("Sending 0x1A via USART1...\r\n");tmgRequest_1A();USART_SendData(USART2, 'A'); break; case 'C':printf("Sending 0x92 via USART1...\r\n");tmgRequest_92();USART_SendData(USART2, 'C'); break;default:printf("Unknown command: %c\r\n", receive);break;}Recieve_Flg2 = 0; }
2.3 实验效果图

本设计参考网站:
高精稳动力-电控就要高精稳,高效·精准·稳定!-GJWdynamics-GJWmotor-深圳乐传动力科技有限公司
http://gjwdoc.longbos.com/#/productdataspecd?srcType=LC-TMG-PROT-c553bc05f5fc426bb479c8fc
