MT6701磁编码器I2C读取(基于stm32hall)
本人在学习FOC电机控制的时候学习到了一款mt6701磁编码器正好巩固一下I2C的知识。教程非常详细易入手有不足之处望指正。推荐博客MT6701磁编码器使用指南14Bit单圈绝对值I2C stm32 HAL库读角度兼容AS5600_Mark_md的博客-CSDN博客文章目录概要整体架构流程硬件连接技术细节小结概要MT6701 是一款基于磁感应的绝对式编码器支持 I2C / PWM 输出常用于电机控制、机器人等场景。整体架构流程硬件层由 MT6701 磁编码器与 STM32 微控制器组成通过 I2C 总线进行通信驱动层基于 STM32 HAL 库实现 I2C 数据读写设备层对 MT6701 寄存器进行封装提供统一的角度读取接口应用层则对获取的角度数据进行处理与输出。系统的数据流程为磁铁旋转产生磁场变化MT6701 进行采样并计算角度值STM32 通过 I2C 读取原始数据后进行解析最终转换为实际角度并输出。硬件连接MT6701 STM32VCC - 3.3VGND - GNDSDA - I2C SDASCL - I2C SCL注意在使用mt6701 I2C读取的时候需要将mode上拉SDA和SCL也需要上拉电阻如果你是用的是买的模块的话这个通常自带。技术细节首先使用STM32cubemx.配置I2C。1.此处省略系统核心配置由于我使用的是stlink进行烧录所以sys选择debug为serial wire开启RCC高速时钟和低速时钟。2.接下来是I2C:此处使用的是I2C1对应的通道SDA和SCL是PB6,PB7下面参数设置默认速度100k就足够了。3.接下来为了调试再配置一个串口USART1.选择异步通信模式,波特率停止位等按需修改。4.最后generate code 再编写我们的角度读取代码。首先要了解I2C这里是我看铁头山羊总结的关于i2c知识最核心的原理部分其实就是寄存器的读取和调用MT6701 内部通过霍尔传感器阵列检测磁场变化并实时计算出当前磁铁的旋转角度。该角度值以数字形式存储在芯片内部寄存器中。STM32 作为 I2C 主机通过 I2C 总线向 MT6701 发送读请求指定需要访问的角度寄存器地址。MT6701 在接收到请求后将对应寄存器中的数据高字节和低字节返回给 STM32。最后就是stm32拼接高低位获得完整数据。5.新建一个encoder.c和.h文件#include encoder.h #define MT6701_I2C_HANDLE hi2c1 #define MT6701_ADDR 0x06 #define I2C_TIMEOUT_MS 100 #define ANGLE_REG_HIGH 0x03//14bit数据起始 // 内部静态函数通过 I2C 连续读取 n 个字节 static uint8_t i2c_read_bytes(uint8_t start_reg, uint8_t *out, uint8_t len) { if (HAL_I2C_Master_Transmit(MT6701_I2C_HANDLE, MT6701_ADDR 1, start_reg, 1, I2C_TIMEOUT_MS) ! HAL_OK) return 1; if (HAL_I2C_Master_Receive(MT6701_I2C_HANDLE, MT6701_ADDR 1, out, len, I2C_TIMEOUT_MS) ! HAL_OK) return 1; return 0; } void get_mt6701_angle(int16_t *raw_angle, float *deg_angle) { uint8_t buffer[2] {0}; // 读取 地址 0x03 和 0x04 if (i2c_read_bytes(ANGLE_REG_HIGH, buffer, 2) ! 0) { *raw_angle 0; *deg_angle 0.0f; return; } // 拼合 14 位数据 uint16_t combined ((uint16_t)buffer[0] 6) | (buffer[1] 2); // 方向取反 combined 16383 - combined; *raw_angle (int16_t)combined; *deg_angle (float)combined * 360.0f / 16384.0f; }#ifndef __MT6701_H__ #define __MT6701_H__ #include stm32f1xx_hal.h #include i2c.h #include stdio.h #define MT6701_I2C_ADDR 0x06 // 7位器件地址 #define I2C_READ_TIMEOUT_MS 100 #define ANGLE_DATA_START_REG 0x03 #define DEBUG_PRINT printf void get_mt6701_angle(int16_t *raw_angle, float *deg_angle); #endif首先内部函数i2c_read_bytes()MT6701 的指定寄存器地址开始连续读取len个字节。从这里需要查阅芯片手册mt6701作为I2C的从机地址HAL 库的DevAddress参数需要将 7 位地址左移 1 位。主函数get_mt6701_angle()从寄存器0x03开始读取 2 字节分别对应角度数据的高 8 位buffer[0]和低 8 位buffer[1]。最后数据拼接MT6701 的角度数据是14 位有效值分布在两个寄存器中代码中的方向取反是我测试的时候发现顺时针角度递减所以添加的这个可以根据调试结果选择。6.主函数main这里我添加了通信成功失败打印方便调试7.结果由于我没有固定磁铁所以角度还是有点抖磁铁必须与 MT6701 芯片中心同轴对齐并保持稳定的轴向位置1-3mm距离。小结本文实现了基于 STM32 HAL 的 MT6701 I2C 角度读取并验证了其稳定性与可行性。核心在于正确理解 I2C 寄存器读取机制及角度数据转换方法同时结合合理的硬件设计才能获得可靠的测量结果。该方案可直接应用于各类角度检测与电机控制系统中。