介绍
MLX90363是一款多功能,通用的,非接触式的三维霍尔传感器;能够保证在汽车、工业、医疗和消费类中的测量线性位移,角度旋转和3D位置检测。
MLX90363可以完成各种通用的,灵活设计的应用开发。通过内部的微处理器,MLX90363可以实现串行通讯(SPI)。应用的设计范围是没有限制的,只取决于设计者的想象力。无论是3维,旋转角度还是线性位移,都可以通过在客户端微处理器中的嵌入式软件实现。所有在芯片内部的原始信号和处理信号都可以通过串行口来通讯。这样外部嵌入式的微处理器就可以直接读到Bx,By和Bz的信息。从芯片内的温度传感器和内部诊断功能中读到数据也能以数字的方式来传输。编程也是以同样的方式实现。
MLX90363特点和优势
三轴™磁强计(BX,BY,BZ)
鲁棒位置传感的芯片信号处理
高速串行接口(SPI兼容 - 全双工)
增强自我诊断功能
5V和3V的应用程序兼容
14位输出分辨率
48位身份证号码
单芯片 - SO8封装符合RoHS
双芯片(全冗余) - 采用TSSOP16封装符合RoHS
关键点:14位输出精度,高速串行接口,供电电压5V或者3.3V
1。硬件电路
SPI接口连到MCU处理器
2.软件读取传感器数值
查看官方数据手册
读取角度经过两步:
- 主机发送GET1到从机,从机返回主机NOP指令请求
- 主机接着发给从机NOP指令,从机返回GET1数据
再看上面数据手册GET1指令,GET1指令每次发送一次需要500ms,请求去转换数据耗时65ms,所以读取数据一次耗时要大于565ms,主函数中使用定时器定时大于565ms循环读数据
GET1指令 00 00 FF FF 00 00 13 EA
NOP(空)指令 00 00 AA AA 00 00 D0 AB
关于读出来角度数据处理方法:
看官方数据手册,角度存在LSB(最低位)里,每次读8位数据,传感器精度是14位,读前两位数据为一个角度,单位是360度/2的14次方
完整代码如下:
const float f32_lsb_to_dec_degrees = 0.02197;//·Ö±æÂÊ 360/2^14 = 0.02197
//issue GET1 message
u8_spi_write_buffer[0] = 0x00;
u8_spi_write_buffer[1] = 0x00;
u8_spi_write_buffer[2] = 0xFF;
u8_spi_write_buffer[3] = 0xFF;
u8_spi_write_buffer[4] = 0x00;
u8_spi_write_buffer[5] = 0x00;
u8_spi_write_buffer[6] = 0x13;
u8_spi_write_buffer[7] = 0xEA;
ChipSelctEnable();
for (i = 0; i < 8; i++)
{
u8_spi_read_buffer[i] = SPI_SendByte(SPI_SOURCE, u8_spi_write_buffer[i]);
}
ChipSelctDisable();
SysTick_Delay_Ms(1);//ÑÓʱ1ms
//issue NOP message
u8_spi_write_buffer[0] = 0x00;
u8_spi_write_buffer[1] = 0x00;
u8_spi_write_buffer[2] = 0xAA;
u8_spi_write_buffer[3] = 0xAA;
u8_spi_write_buffer[4] = 0x00;
u8_spi_write_buffer[5] = 0x00;
u8_spi_write_buffer[6] = 0xD0;
u8_spi_write_buffer[7] = 0xAB;
ChipSelctEnable();
for (i = 0; i < 8; i++)
{
u8_spi_read_buffer[i] = SPI_SendByte(SPI_SOURCE, u8_spi_write_buffer[i]);
}
ChipSelctDisable();
//Extract and convert the angle to degrees
//remove error bits and shift to high byte
/*********************/
u16_angle_lsb = (u8_spi_read_buffer[1] & 0x3F) << 8;//¸ß6λ
//add LSB of angle
u16_angle_lsb = u16_angle_lsb + u8_spi_read_buffer[0];//¸ß6λ+ µÍ8λ
/***************/
//convert to decimal degrees
f32_angle_degrees = u16_angle_lsb * f32_lsb_to_dec_degrees;