打印

MT6701CT磁编码器烧录

[复制链接]
3083|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
磁编码器|  楼主 | 2024-1-31 14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MT6701是MagnTek推出的新一代基于差分霍尔感应原理的磁性角度编码器芯片。
MT6701感应垂直于芯片表面的磁场分量,随着在芯片表面的1对极充磁的径向磁铁的旋转,
MT6701相应的输出0~360°的角度信号。
MT6701除了提供ABZ/UVW增量输出和Analog/PWM绝对角度输出以外,还通过I²C/SSI接口提供了14 bit的数字量角度输出。
除了旋转角度测量以外,MT6701还提供了一个“按压”输出,以实现单芯片的按钮(旋转+按压)功能。

特征:
-  基于差分霍尔技术,提供0°~360°的绝对角度测量
-  工作电压3.3~5.0V,工作温度-40℃~125℃
-  线性度偏差典型值<±1°,全温度范围内<±1.5°
-  系统延时低至5us以内,最高可支持高达55,000转/分钟的转速
-  提供I²C/SSI接口读取芯片内部14位角度数据
-  增量输出ABZ支持1~1024线任意分辨率
-  增量输出UVW支持1~16任意对极
-  提供12位的PWM输出或模拟输出(12位DAC)
-  专用按压检测输出(感应磁铁和芯片间距的变化),实现单芯片按钮应用
-  内置EEPROM,>1000次的反复编程



(规格书见附件)

型号列表:


编程引脚:

VCC   GND    MODE     SCL    SDA


官方编程器:

(完整说明文档见附件)


上位机界面简述:




目前网络上面MT6701模块种类很多,我们以手机到的两类模块进行烧录演示,陆续公布视频:

模块一:(有预留烧录端口,沉金工艺,做工非常好)


模块二:(未预留烧录口,需要接线进行烧录)



下来我们会以预留烧录端口和没有预留烧录端口的来演示芯片烧录定义...















PB009-6701CT软硬件使用说明_v1.1.pdf

1.83 MB

MT6701_Rev.1.7_中文版.pdf

1.27 MB

使用特权

评论回复

相关帖子

沙发
磁编码器|  楼主 | 2024-1-31 14:52 | 只看该作者
编程软件上位机软件更新

PB009-MT6701QT上位机软件.zip

563.67 KB

使用特权

评论回复
板凳
磁编码器|  楼主 | 2024-2-19 11:51 | 只看该作者
MT6701芯片烧录端口: VCC  GND  MOD  SCL   SDA,




使用特权

评论回复
地板
磁编码器|  楼主 | 2024-3-7 09:21 | 只看该作者
磁编码器芯片磁铁选型和安装指南V1.1.pdf (729.69 KB)
磁铁选型及安装说明:



使用特权

评论回复
5
磁编码器|  楼主 | 2024-3-7 10:54 | 只看该作者
MT6701按压判断例程.zip (6.47 KB)
MT6701CT 例程



使用特权

评论回复
6
磁编码器|  楼主 | 2024-4-15 11:00 | 只看该作者
PT32L007  与 MT6701 iic通讯源代码 分享

/**
  ******************************************************************************
  * @file    MT6701.c
  * @author  Yangzhiqiang@qst
  * @version V1.0
  * @date    2020-5-27
  * @brief    MT6701
  ******************************************************************************
  * @attention
  *
  *
  ******************************************************************************
  */

#include "MT6701.h"
#include "PT32x007x.h"
#include "string.h"


#define MT6701_ADDR               (0x0C)
#define fabs(x)                    (x < 0 ? -x : x)

void delay_us(uint32_t delay)
{
        uint32_t i,j,k;
        for(i=0;i<delay;i++)
        {
                for(j=0;j<100;j++)
                {
                        k++;
                }
        }
}
//---------------------------------------

void Acce_Write_Byte(unsigned int WriteAddr, u8 data)
{
//        int i;
/******************等待从机ready***************/               
        I2C_GenerateEvent(I2C,I2C_Event_Start,DISABLE);
        I2C->CCR |= I2C_CCR_SI | I2C_CCR_ACK;
        I2C_Cmd(I2C,DISABLE);
        I2C_Cmd(I2C,ENABLE);

        I2C_GenerateEvent(I2C,I2C_Event_Start,ENABLE);       
        while(I2C_GetFlagStatus(I2C,I2C_FLAG_StartOk)!= SET);
//        printf("---%s  %d---\n", __func__, __LINE__) ;
        I2C_SendAddr(I2C, MT6701_ADDR);//器件地址,写
        while(I2C_GetFlagStatus(I2C,I2C_FLAG_MASGetAckW)!=SET);
        printf("%s %d\r\n", __func__, __LINE__) ;
        I2C_SendData(I2C,WriteAddr);//发送要写的字地址
        while(I2C_GetFlagStatus(I2C,I2C_FLAG_MDSGetAck)!=SET);
//        printf("---%s  %d---\n", __func__, __LINE__) ;

        I2C_SendData(I2C, data);
        while(I2C_GetFlagStatus(I2C,I2C_FLAG_MDSGetAck) != SET);

                /******************发送停止位***************/
        I2C_GenerateEvent(I2C,I2C_Event_Stop,ENABLE);       
}

//uint8_t I2C_EE_Read(u8* pBuffer,u16 ReadAddr, u16 DeviceAddr, u16 data_size)
uint8_t Acce_Read_Byte(u16 ReadAddr)
{
//        int i;
        uint8_t date = 0 ;
/******************等待从机ready***************/               
//printf("---%s  %d---\n", __func__, __LINE__) ;
        I2C_GenerateEvent(I2C,I2C_Event_Start,ENABLE);
        while(I2C_GetFlagStatus(I2C,I2C_FLAG_StartOk)!= SET);
//        printf("---%s  %d---\n", __func__, __LINE__) ;
        I2C_SendAddr(I2C, MT6701_ADDR);//器件地址,写
        while(I2C_GetFlagStatus(I2C,I2C_FLAG_MASGetAckW)!=SET);
       
        I2C_SendData(I2C,ReadAddr);//发送要读的页地址
        while(I2C_GetFlagStatus(I2C,I2C_FLAG_MDSGetAck)!=SET);
       
        I2C_GenerateEvent(I2C,I2C_Event_Stop,ENABLE);

/******************接收数据***************/               
        I2C_GenerateEvent(I2C,I2C_Event_Start,ENABLE);
        while(I2C_GetFlagStatus(I2C,I2C_FLAG_StartOk)!= SET);

        I2C_SendAddr(I2C, MT6701_ADDR|0x01);//器件地址,读
        while(I2C_GetFlagStatus(I2C,I2C_FLAG_MASGetAckR)!=SET);

        I2C->CCR=I2C_CCR_ACK|I2C_CCR_SI;//主机发送NACK
        while(I2C_GetFlagStatus(I2C,I2C_FLAG_MDGSendNack) != SET);
        date = I2C_ReceiveData(I2C);

        /******************发送停止位***************/
        I2C_GenerateEvent(I2C,I2C_Event_Stop,ENABLE);
       
        return date ;
}
//---------------------------------------
uint8_t MT6813_read_reg(uint8_t Reg)
{
        u8 RegVal = 0;
        RegVal = Acce_Read_Byte(Reg);
        return RegVal;
}

void MT6813_write_reg(uint8_t Reg,uint8_t Val)
{
        Acce_Write_Byte(Reg, Val);
}

void MT6701_INIT(void)
{
        uint8_t Buff[2];

//        Buff[0] = MT6813_read_reg(0x22);
//        if(Buff[0] == 0x60)
//        {
//                printf("RG 0x22=%x\r\n",Buff[0]);
//                return;
//        }
       
        MT6813_write_reg(0x22, 0x60);  //
        delay_us(10) ;
        MT6813_write_reg(0x24, 0x80);  //
        delay_us(10) ;
        MT6813_write_reg(0x27, 0xB8);  
        delay_us(10) ;
       
        Buff[0] = MT6813_read_reg(0x22);
        printf("RG 0x22 C=%x\r\n",Buff[0]);
       
        Buff[0] = MT6813_read_reg(0x24);
        printf("RG 0x24 D=%x\r\n",Buff[0]);
       
        //save eeprom
        MT6813_write_reg(0x09, 0xB3);
        MT6813_write_reg(0x0A, 0x05);
}

short angle_now;
uint8_t MT6701_GetData(uint8_t *Magnet)
{
        uint8_t Buff[6];
        int data;
       
        float angle;
       
        Buff[0] = MT6813_read_reg(0x03);
        Buff[1] = MT6813_read_reg(0x04);
       
        Magnet[0] = Buff[0];
        Magnet[1] = Buff[1];

        data = (short)((Magnet[0]<<8)|(Magnet[1]));
        data = data>>2;
       
        angle = (float)(data*0.022);
        if(angle<0)
        {
                angle = 360+angle;
        }
       
        // if((short)angle != angle_now)
        // {
               
        //         angle_now = (short)angle;
        //         printf("angle=%d\r\n",angle_now);
        // }
       
        printf("angle=%.2f\r\n",angle);
        return angle_now;

}

uint8_t Zero_point_programming(void)
{
        uint8_t Buff[2],ZH,ZL;
        int data ;
       

        Buff[0] = MT6813_read_reg(0x32);
        ZH = Buff[0] & 0xf0;
        MT6813_write_reg(0x32, ZH);
        MT6813_write_reg(0x33, 0x00);

        Buff[0] = MT6813_read_reg(0x03);

        data = (short)((Buff[0]<<8)|(Buff[1]));
        data = data>>2;  //14bit
        data = data>>2;  //12bit

        ZH = ZH | (uint8_t)(data >> 8) ;
        ZL = (uint8_t)(data & 0x0f) ;

        MT6813_write_reg(0x32, ZH);
        MT6813_write_reg(0x33, ZL);

        //save eeprom
        MT6813_write_reg(0x09, 0xB3);
        MT6813_write_reg(0x0A, 0x05);

        Buff[0] =        MT6813_read_reg(0x32);

        if((Buff[0] == ZH) && (Buff[1] == ZL))
        {#ifndef __QMA6100P_H
#define __QMA6100P_H

#include "PT32x007x.h"

#include <stdbool.h>
#include <string.h>


void MT6701_INIT(void);

uint8_t MT6701_GetData(uint8_t *Magnet) ;

//调用零点编程之前必须把机械零点固定好,不要晃动;
uint8_t Zero_point_programming(void);

#endif  /*MT6701*/

                return 1;
        }

        return 0;
       
}





使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

29

帖子

0

粉丝