??MT6701是麥歌恩(MagnTek)公司的磁性角度傳感器芯片,提供14Bit 0~360°單圈絕對(duì)角度檢測(cè),擁有 ABZ/PWM/模擬量/I2C/SSI
等多種信息輸出方式,還可根據(jù)磁場(chǎng)強(qiáng)度的瞬時(shí)變化提供非接觸式按壓檢測(cè)功能。能夠以較低的成本來(lái)替代傳統(tǒng)光電編碼器,可應(yīng)用于絕對(duì)值角度輸出、閉環(huán)步進(jìn)電機(jī)BLDC電機(jī)旋轉(zhuǎn)角度檢測(cè)、機(jī)器人關(guān)節(jié)、非接觸按鍵、非接觸電位器等場(chǎng)合。
??鑒于其數(shù)據(jù)手冊(cè)的介紹已經(jīng)非常詳細(xì),且有中文PDF版本,建議大家先讀一遍官方手冊(cè):MT6701_Rev.1.6_中文版
??MT6701提供 ABZ/UVW/PWM/模擬量/I2C/SSI
等多種信息輸出方式,建議優(yōu)先選擇 I2C/SSI 數(shù)字接口使用。
??I2C除了獲取角度外,還可用于對(duì)其內(nèi)部 EEPROM編程,來(lái)更改 ABZ/UVW/模擬量/PWM
的配置參數(shù)和校準(zhǔn)參數(shù)。
??其 SSI 與SPI兼容,僅需要 SCK、MISO、CS 三個(gè)IO。
型號(hào)列表
??MT6701CT 封裝為 SOP-8。
??MT6701QT 封裝為 QFN 3x3。
??后面的尾綴 STD、AKD、AKE、ACD、A200…等,區(qū)別僅在于出廠時(shí)內(nèi)部燒錄的EEPROM配置不同,用戶拿到手后可二次編程來(lái)適配自己的應(yīng)用場(chǎng)景。且其EEPROM支持多次擦寫(xiě),可根據(jù)自己的場(chǎng)合進(jìn)行靈活配置。(其EEPROM真的大贊,完全不用擔(dān)心像AS5047P的OTP僅能編程一次的尷尬)
??如果僅使用 I2C/SSI 接口,則不必?fù)?dān)心其EEPROM參數(shù)對(duì)使用的影響。EEPROM多用來(lái)配置 ABZ/UVW/PWM/模擬量
的參數(shù)和校準(zhǔn)參數(shù),不會(huì)對(duì) I2C/SSI 讀角度有干涉。
??另外SOP-8封裝的MT6701的I2C模式電路,是兼容AS5600的,快扔掉以前的AS5600,換上性能與價(jià)格更好的MT6701。(TB上現(xiàn)在太多的AS5600翻新片,特別便宜的一定要留意很容易中獎(jiǎng))
磁極安裝方式
??用于檢測(cè)旋轉(zhuǎn)角度的磁鐵,必須為 徑向充磁
方式,多使用 直徑6-8mm、厚度2-5mm的釹鐵硼強(qiáng)磁。
??強(qiáng)磁與芯片的垂直高度應(yīng)控制在 0.5-2mm的大概范圍(實(shí)際可以更遠(yuǎn)一些)。
I2C接口模式電路
??MT6701 使用 I2C/SSI 接口時(shí),需要將 MODE腳(SOP-8的PIN2)拉高。
??因其芯片內(nèi)部已經(jīng)集成一200K的上拉,MODE腳空置也是可以的。
??使用I2C接口時(shí),還需將 Z腳(SOP-8的PIN8)保持拉高。
I2C讀時(shí)序
??MT6701 的I2C從機(jī)地址,固定為 0x06(STM32需要左移一位,即0x0C)。
??獲取角度時(shí)候,只需從 0x03 寄存器,連續(xù)讀2字節(jié),其中就包含有 14Bit 絕對(duì)角度信息。
測(cè)試電路、在售萬(wàn)能電機(jī)轉(zhuǎn)接板
??測(cè)試過(guò)MT6701后,深被其性價(jià)比折服,結(jié)合以前的AS5047P萬(wàn)能電機(jī)轉(zhuǎn)接板的外形,推出了 MT6701的版本。
??ABZ/UVW/PWM/模擬量/I2C/SSI
接口均已引出,PCB外形可適配 22xx、2606、2804、35xx、6010、6374、36/42/57步進(jìn) 等多種電機(jī)的安裝。
??現(xiàn)已在我TB小店批量售賣(mài),TB店鋪名:芯源藝碼。
資料/原理圖/源碼匯總鏈接:Github-MT6701_Encoder_STM32
STM32 I2C HAL庫(kù)源碼
??這里我使用 STM32F103C8T6,其他型號(hào)的STM32均可,HAL庫(kù)只需改動(dòng)頭文件即可全系列使用。
??STM32CubeMX配置:SWD調(diào)試接口、UART1-115200用作串口打印、I2C1。
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角度信息,存儲(chǔ)在0x03[13:6]、0x04[5:0]兩個(gè)寄存器中,高位在前,原始讀數(shù)0~16383,對(duì)應(yīng)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角度信息,存儲(chǔ)在0x03[13:6]、0x04[5:0]兩個(gè)寄存器中,高位在前,原始讀數(shù)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轉(zhuǎn)TTL 模塊的 RX。
可讀出0~360°的絕對(duì)角度信息,如下圖所示。
(值得一提的是,我測(cè)試其數(shù)據(jù)輸出波動(dòng)為±1LSB,真14Bit,只要磁極不動(dòng),其輸出是一點(diǎn)都不會(huì)變的,效果非常好。因?yàn)橐郧皽y(cè)試過(guò)TLE5012 15Bit ±2LSB,AS5047P 14Bit ±4LSB,AS5600 10Bit都很抖。MT6701 真14BIt不說(shuō),MAX 55,000RPM,系統(tǒng)延時(shí)<5us,如果手冊(cè)數(shù)據(jù)當(dāng)真,結(jié)合其價(jià)位來(lái)看,絕對(duì)是性價(jià)比碾壓的存在)
如未見(jiàn)輸出信息。請(qǐng)保證 Use MicroLIB
已經(jīng)被勾選,并重定向了 fputc函數(shù)。
PUSH 按鈕輸出就不說(shuō)了,需要機(jī)械結(jié)構(gòu)的配合,自己也用不上。有興趣可以看下 smartknob
開(kāi)源項(xiàng)目,其中用到了MT6701,不過(guò)依舊沒(méi)有用到MT6701的按鈕檢測(cè),他的按壓用壓力傳感器和HX711實(shí)現(xiàn)的。
小結(jié)
??對(duì)于 MT6701 這顆芯片個(gè)人表示強(qiáng)烈推薦,因其硬件電路簡(jiǎn)潔、使用簡(jiǎn)單(較AS5047P、TLE5012來(lái)說(shuō))、可靈活配置輸出方式( ABZ/UVW/PWM/模擬量/I2C/SSI
全部支持,已經(jīng)不能再全了,很難想象僅僅一顆SOP-8就能提供如此全面的功能,輸出參數(shù)還可EEPROM編程,yyds)、輸出角度精準(zhǔn)(個(gè)人測(cè)試絕大多數(shù)為±1LSB,真14位)、性能優(yōu)異(真14Bit,MAX 55,000RPM,系統(tǒng)延時(shí)<5us,結(jié)合它的價(jià)位簡(jiǎn)直殺瘋了)等諸多優(yōu)點(diǎn)。
??除了以上優(yōu)異的性能,MT6701的生產(chǎn)公司,麥歌恩微電子現(xiàn)已正式加入矽睿科技,矽??萍汲钟宣湼瓒魑㈦娮?6.75%的股權(quán)。值得一說(shuō)的是矽睿也是個(gè)寶貝公司,主要生產(chǎn)MEMS器件,其下的 QMI8658、QMC8610 我也用在過(guò)產(chǎn)品上,過(guò)幾星期會(huì)批量一批尺寸兼容MPU6050模塊的10DOF模組,供各位開(kāi)發(fā)學(xué)習(xí)使用。
??算是個(gè)小預(yù)告吧,先來(lái)張圖片,QMI8658A + QMC6310u + SPL07。I2C / SPI 通信接口。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-786055.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-786055.html
到了這里,關(guān)于MT6701磁編碼器使用指南,14Bit單圈絕對(duì)值,I2C stm32 HAL庫(kù)讀角度,兼容AS5600的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!