STM32 软件I2C方式读取MT6701磁编码器获取角度例程

STM32 软件I2C方式读取MT6701磁编码器获取角度例程


📙MT6701 IIC接口电路

在这里插入图片描述
在这里插入图片描述

  • 🔖 第八引脚注意是直接接到VCC,而不是使用电阻上拉。(其内部是有上拉电阻到VCC的)

⛳MT6701 I2C 读取角度操作

MT6701做为I2C从机的地址是b’0000110(这一地址可以通过编程改为b’1000110 )。14位绝对角度数据(2的14次方,16384)保存在0x03和0x04寄存器中,请按照如图-20所示的读取0x03和0x04的角度数据。
注意:要先读0x03,再读0x04。
在这里插入图片描述

⛳注意事项

  • ✨在MT6701芯片和径向磁铁一定要保持稳定的空间距离,一旦空间距离有较大的变化,在读取MT6701芯片寄存器数据就可能出现最大值情况。在检测时,芯片和径向磁铁轴向和径向都需要相对稳定。
    在这里插入图片描述

📗读取代码实现部分

//函数:u8 MT6701_ReadOneByte(u8 ReadAddr)
//功能:从MT6701模块读取一个字节的数据
//参数:ReadAddr    要读取的地址
//返回:读取到的数据
static u8 MT6701_ReadOneByte(u8 ReadAddr)
{                  
    u8 temp=0;                                                                                   
  IIC_Start();  
    IIC_Send_Byte((0x06<<1)|0x00);       //
    IIC_Wait_Ack(); 
  IIC_Send_Byte(ReadAddr);   //
    IIC_Wait_Ack();        
    IIC_Start();              
    IIC_Send_Byte((0x06<<1)|0x01);           //           
    IIC_Wait_Ack();     
  temp=IIC_Read_Byte(0);           
  IIC_Stop();//       
    return temp;
}
//读2个字节数据,获取原始角度
u16 MT6701_ReadTwoByte(u8 higher,u8 lower)
{
	u16 TwoByte_Data = 0;
	u16 hi_Data = 0,lo_Data = 0;
	//Read the first byte (higher address)
	hi_Data = MT6701_ReadOneByte(higher);
	//Read the second byte (lower address)
	lo_Data = MT6701_ReadOneByte(lower);
	//Combine the two bytes into a single 16-bit value
		TwoByte_Data  = (uint16_t)(lo_Data>> 2);
		TwoByte_Data |= ((uint16_t)hi_Data << 6);
	//Return the 16-bit value
	return TwoByte_Data;
}

在这里插入图片描述

  • 📝main函数代码
int main(void)
{

    u16 i = 0;
    u16 raw_num = 0;
    float Angle = 0.0f;
    u8 addr = 0;
    u8 ack;
    u8 read = 0;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
    delay_init(); //延时函数初始化
    uart_init(115200);	//串口初始化为115200
    printf("MT6701 test\r\n");
    printf("Scanning I2C bus:\r\n");
    LED_Init();	//初始化与LED连接的硬件接口
    IIC_Init();
    for(addr = 0 ; addr < 255 ; addr++) {
        IIC_Start();
        IIC_Send_Byte(addr);	//
        ack = IIC_Wait_Ack();
        if(ack == 0 && (read % 2 == 0)) {
            printf("write addr = 0x%x\r\n", addr);
            read++;
        } else if(ack == 0 && read % 2 == 1) {
            printf("read addr = 0x%x\r\n", addr);
            read++;
        }
        IIC_Stop();
    }

    //for(i=0x00;i<0xFF;i++)
    // {
    //	IIC_Start();
    //	IIC_Send_Byte(i);
    //	if(IIC_ACK_Read()==1)
    //	{
    //	printf("%x\r\n",i);
    //	count=1;
    //	}
    //	IIC_Stop();
    //	delay_ms(1);
    // }
    // if(count==0) printf("No IIC device found!\r\n");
    // count=0;
    while(1) {

        delay_ms(10);
        if(++i > 100) {
            raw_num = MT6701_ReadTwoByte(0x03, 0x04); //读取两个寄存器的值
            Angle = (float)(raw_num / 16384.0f) * 360.0f ; //对寄存器值进行处理得到角度值
            printf("MT6701 Raw_num:%d,Angle:%.1f \r\n", raw_num, Angle);
            LED0 = !LED0; //提示系统正在运行
            i = 0;
        }

    }
}

📚驱动测试代码

链接:https://pan.baidu.com/s/1YRTLFoUJvrdWfcs6dL-qdg?pwd=fsif 
提取码:fsif
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F0是ST公司推出的一款32位ARM Cortex-M0微控制器系列。关于STM32F0的I2C通信,以下是一个16进制例程的代码示例: #include "stm32f0xx.h" void I2C_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; // 开启GPIOB和I2C1时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); // 配置GPIOB引脚为I2C模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 配置I2C1 I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_Init(I2C1, &I2C_InitStructure); // 使能I2C1 I2C_Cmd(I2C1, ENABLE); } void I2C_WriteByte(uint8_t address, uint8_t reg, uint8_t data) { // 等待I2C1空闲 while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); // 发送START信号 I2C_GenerateSTART(I2C1, ENABLE); // 等待START信号被发送完毕 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // 发送设备地址和写命令 I2C_Send7bitAddress(I2C1, address, I2C_Direction_Transmitter); // 等待设备地址被发送完毕 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // 发送寄存器地址 I2C_SendData(I2C1, reg); // 等待寄存器地址被发送完毕 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // 发送数据 I2C_SendData(I2C1, data); // 等待数据被发送完毕 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // 发送STOP信号 I2C_GenerateSTOP(I2C1, ENABLE); } uint8_t I2C_ReadByte(uint8_t address, uint8_t reg) { uint8_t data; // 等待I2C1空闲 while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); // 发送START信号 I2C_GenerateSTART(I2C1, ENABLE); // 等待START信号被发送完毕 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // 发送设备地址和写命令 I2C_Send7bitAddress(I2C1, address, I2C_Direction_Transmitter); // 等待设备地址被发送完毕 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // 发送寄存器地址 I2C_SendData(I2C1, reg); // 等待寄存器地址被发送完毕 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // 发送RESTART信号 I2C_GenerateSTART(I2C1, ENABLE); // 等待RESTART信号被发送完毕 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // 发送设备地址和读命令 I2C_Send7bitAddress(I2C1, address, I2C_Direction_Receiver); // 等待设备地址被发送完毕 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); // 禁用ACK I2C_AcknowledgeConfig(I2C1, DISABLE); // 清除ADDR标志位 (void)I2C1->SR2; // 发送STOP信号 I2C_GenerateSTOP(I2C1, ENABLE); // 等待数据接收完毕 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); // 读取数据 data = I2C_ReceiveData(I2C1); // 使能ACK I2C_AcknowledgeConfig(I2C1, ENABLE); return data; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值