近在调试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)读取的数据需要再做相关的校验和报警处理。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐