地址:深圳市罗湖区文锦广场文盛中心1401
邮箱:wawa209@126.com
MT6701是麦歌恩(MagnTek)公司的磁性角度传感器芯片,提供14Bit 0~360°单圈绝对角度检测,拥有 ABZ/PWM/模拟量/I2C/SSI 等多种信息输出方式,还可根据磁场强度的瞬时变化提供非接触式按压检测功能。能够以较低的成本来替代传统光电编码器,可应用于绝对值角度输出、闭环步进电机BLDC电机旋转角度检测、机器人关节、非接触按键、非接触电位器等场合。
MT6701提供 ABZ/UVW/PWM/模拟量/I2C/SSI 等多种信息输出方式,建议优先选择 I2C/SSI 数字接口使用。
I2C除了获取角度外,还可用于对其内部 EEPROM编程,来更改 ABZ/UVW/模拟量/PWM 的配置参数和校准参数。
其 SSI 与SPI兼容,仅需要 SCK、MISO、CS 三个IO。
型号列表
MT6701CT 封装为 SOP-8
MT6701QT 封装为 QFN 3x3
后面的尾缀 STD、AKD、AKE、ACD、A200…等,区别仅在于出厂时内部烧录的EEPROM配置不同,用户拿到手后可二次编程来适配自己的应用场景。且其EEPROM支持多次擦写,可根据自己的场合进行灵活配置。(其EEPROM真的大赞,完全不用担心像AS5047P的OTP仅能编程一次的尴尬)
如果仅使用 I2C/SSI 接口,则不必担心其EEPROM参数对使用的影响。EEPROM多用来配置 ABZ/UVW/PWM/模拟量 的参数和校准参数,不会对 I2C/SSI 读角度有干涉。
另外SOP-8封装的MT6701的I2C模式电路,是兼容AS5600的,快扔掉以前的AS5600,换上性能与价格更好的MT6701。(TB上现在太多的AS5600翻新片,特别便宜的
一定要留意很容易中奖)
磁极安装方式
用于检测旋转角度的磁铁,必须为 径向充磁 方式,多使用 直径6-8mm、厚度2-5mm的钕铁硼强磁。
强磁与芯片的垂直高度应控制在 0.5-2mm的大概范围(实际可以更远一些)
MT6701.c
#include "MT6701.h" unsigned char mt6701_write_reg(unsigned char reg, unsigned char value) { return HAL_I2C_Mem_Write(&hi2c1, MT6701_SLAVE_ADDR, reg, I2C_MEMADD_SIZE_8BIT, &value, 1, MT6701_Timeout); } unsigned char mt6701_write_regs(unsigned char reg, unsigned char *value, unsigned char len) { return HAL_I2C_Mem_Write(&hi2c1, MT6701_SLAVE_ADDR, reg, I2C_MEMADD_SIZE_8BIT, value, len, MT6701_Timeout); } unsigned char mt6701_read_reg(unsigned char reg, unsigned char* buf, unsigned short len) { return HAL_I2C_Mem_Read(&hi2c1, MT6701_SLAVE_ADDR, reg, I2C_MEMADD_SIZE_8BIT, buf, len, MT6701_Timeout); } void mt6701_delay(unsigned int ms) { HAL_Delay(ms); } // 14Bit角度信息,存储在0x03[13:6]、0x04[5:0]两个寄存器中,高位在前,原始读数0~16383,对应0-360° void i2c_mt6701_get_angle(int16_t *angle, float *angle_f) { uint8_t temp[2]; mt6701_read_reg(MT6701_REG_ANGLE_14b, temp, 2); *angle = ((int16_t)temp[0] << 6) | (temp[1] >> 2); *angle_f = (float)*angle * 360 / 16384; }
MT6701.h
#ifndef __MT6701_H__ #define __MT6701_H__ #include "stm32f1xx_hal.h" #include "i2c.h" #include <stdio.h> #define MT6701_SLAVE_ADDR 0x06 << 1 #define MT6701_Timeout 50 #define MT6701_REG_ANGLE_14b 0x03 // 14Bit角度信息,存储在0x03[13:6]、0x04[5:0]两个寄存器中,高位在前,原始读数0~16383 #define mt6701_log printf void i2c_mt6701_get_angle(int16_t *angle, float *angle_f); #endif
main.c
#include "main.h" #include "i2c.h" #include "usart.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include <stdio.h> #include "MT6701.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ int fputc(int ch,FILE *f) { HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF); return ch; } /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_I2C1_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ printf("-------------------- MT6701 angle test --------------------\r\n"); HAL_Delay(200); int16_t angle; float angle_f; /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { i2c_mt6701_get_angle(&angle, &angle_f); printf("angle = %d\t%.03f\r\n", angle, angle_f); HAL_Delay(30); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
连接 PA6、PA7 至 MT6701 的 I2C。PA9(TXD) 至 USB转TTL 模块的 RX。
可读出0~360°的绝对角度信息,如下图所示。
(值得一提的是,我测试其数据输出波动为±1LSB,真14Bit,只要磁极不动,其输出是一点都不会变的,效果非常好。因为以前测试过TLE5012 15Bit ±2LSB,AS5047P 14Bit ±4LSB,AS5600 10Bit都很抖。MT6701 真14BIt不说,MAX 55,000RPM,系统延时<5us,如果手册数据当真,结合其价位来看,绝对是性价比碾压的存在)
如未见输出信息。请保证 Use MicroLIB 已经被勾选,并重定向了 fputc函数。
PUSH 按钮输出就不说了,需要机械结构的配合,自己也用不上。有兴趣可以看下 smartknob
开源项目,其中用到了MT6701,不过依旧没有用到MT6701的按钮检测,他的按压用压力传感器和HX711实现的。
产品
应用
服务
资讯
公司