STM32 SPI接口读取磁编码器MT6816
STM32 SPI 磁编码器 MT6816
近在调试FOC的代码,当前在处理电角度的代码,基于此,梳理下相关的内容。
1、MT6816是麦歌恩公司的一款磁编码器,支持ABZ、PWM、SPI 等多种接口,我这里使用的是SPI,SPI可以直接读出角度相关的绝对数据。SPI接口支持三线式和四线式。 我这里使用的是4线全双工模式,STM32作为Master。
2、接下来看软件相关的内容,首先是SPI相关的配置,这里参考datasheet给的数据,使用的是模式3(CPOL=1,CPHA=1),数据传输开始于CSN的下降沿,结束于CSN的上升沿,在时钟的上升沿进行数据采样;
3、下图是时序参数,我这里用STM32单片机来处理,SPI1的挂载在APB2总线168MHz,对APB2总线16分频作为SCK,SCK的时钟为5.25MBits/s,满足时钟周期的最小值;
4、这里是MT6816四线SPI协议的时序,可以看出,每个寄存器的读取都使用一个完整的16位(2字节)SPI传输,并且CSN控制这个完整的16位周期。
5、寄存器0x03-0x05是角度和报警相关信息,具体如下
6、相关的读取代码如下,使用的是HAL库的SPI传输函数HAL_SPI_TransmitReceive,发送两个字节读取一个字节的有效数据。 两次读取完成,做一次数据的拼接,高字节的8bit和低字节的高6bit。
uint16_t MT6816_ReadDigitalValue(void)
{
uint8_t tx_buffer[2];
uint8_t rx_buffer[2];
uint8_t data_high = 0x00;
uint8_t data_low = 0x00;
tx_buffer[0] = 0x80 | 0x03;
tx_buffer[1] = 0x00;
MT6816_CS_Low();
HAL_SPI_TransmitReceive(&hspi1, tx_buffer, rx_buffer, 2, HAL_MAX_DELAY);
MT6816_CS_High();
data_high = rx_buffer[1];
tx_buffer[0] = 0x80 | 0x04;
tx_buffer[1] = 0x00;
MT6816_CS_Low();
HAL_SPI_TransmitReceive(&hspi1, tx_buffer, rx_buffer, 2, HAL_MAX_DELAY);
MT6816_CS_High();
data_low = rx_buffer[1];
uint16_t raw_angle = ((uint16_t)data_high << 6) | (data_low >> 2);
return raw_angle;
}
7、STM32CUBE 相关的SPI的配置

8、以下是示波器抓取的时钟和数据信号和串口调试助手接收到的数据
9、总结:(1)这里的数据读取是阻塞式的,耗时也比较长,用于FOC的电流环还需要调整,使用其他的模式,这里先做调试;(2)读取的数据需要再做相关的校验和报警处理。
更多推荐



所有评论(0)