麦歌恩代理

当前位置: 首页 - 服务 - 技术支持 - STM32通过SPI方式读取MT6816磁编码器绝对位置
联系我们 / Contact
深圳市威立胜电子有限公司
咨询热线:13510581182

地址:深圳市罗湖区文锦广场文盛中心1401
邮箱:wawa209@126.com

STM32通过SPI方式读取MT6816磁编码器绝对位置 数据手册

CUBEMX基本配置:

调试方式:SW

在这里插入图片描述

系统时钟配置:

在这里插入图片描述

CS引脚配置:

在这里插入图片描述

SPI参数配置:

在这里插入图片描述

串口配置:

在这里插入图片描述

生成代码:在这里插入图片描述在这里插入图片描述

然后点右上角生成代码

代码:

源文件:

#include "mt6816.h"
#include "stdio.h"

MT6816_SPI_Signal_Typedefmt6816_spi;

void REIN_MT6816_SPI_Signal_Init(void)
{
mt6816_spi.sample_data = 0;
mt6816_spi.angle = 0;
}

void RINE_MT6816_SPI_Get_AngleData(void)
{
uint16_t data_t[2];
uint16_t data_r[2];
uint8_t h_count;
data_t[0] = (0x80 | 0x03) << 8;
data_t[1] = (0x80 | 0x04) << 8;
for(uint8_t i=0; i<3; i++){
//读取SPI数据
MT6816_SPI_CS_L();
HAL_SPI_TransmitReceive(&MT6816_SPI_Get_HSPI, (uint8_t*)&data_t[0], (uint8_t*)&data_r[0], 1, HAL_MAX_DELAY);
MT6816_SPI_CS_H();
MT6816_SPI_CS_L();
HAL_SPI_TransmitReceive(&MT6816_SPI_Get_HSPI, (uint8_t*)&data_t[1], (uint8_t*)&data_r[1], 1, HAL_MAX_DELAY);
MT6816_SPI_CS_H();
mt6816_spi.sample_data = ((data_r[0] & 0x00FF) << 8) | (data_r[1] & 0x00FF);
//奇偶校验
h_count = 0;
for(uint8_t j=0; j<16; j++){
if(mt6816_spi.sample_data & (0x0001 << j))
h_count++;
}
if(h_count & 0x01){
mt6816_spi.pc_flag = false;
}
else{
mt6816_spi.pc_flag = true;
break;
}
}
if(mt6816_spi.pc_flag){
mt6816_spi.angle = mt6816_spi.sample_data >> 2;
mt6816_spi.no_mag_flag = (bool)(mt6816_spi.sample_data & (0x0001 << 1));
}
}

MT6816_Typedefmt6816;

float REIN_MT6816_Get_AngleData()
{
RINE_MT6816_SPI_Get_AngleData();
mt6816.angle_data = mt6816_spi.angle;   
}



头文件:

#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <spi.h>
#include <main.h>

#define MT6816_SPI_CS_H()     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,1) 
#define MT6816_SPI_CS_L() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,0) 
#define MT6816_SPI_Get_HSPI    (hspi1)
#define MT6816_Mode_SPI        (0x03)


typedef struct{
uint16_tsample_data;
uint16_tangle;
boolno_mag_flag;
boolpc_flag;
}MT6816_SPI_Signal_Typedef;

void REIN_MT6816_SPI_Signal_Init(void);
void RINE_MT6816_SPI_Get_AngleData(void);

typedef struct{
uint16_tangle_data;
uint16_trectify_angle;
boolrectify_valid;
}MT6816_Typedef;

extern MT6816_Typedefmt6816;
float REIN_MT6816_Get_AngleData();

#endif


重定向printf,添加到main.c即可

#include "mt6816.h"
#include "stdio.h"
int fputc(int ch, FILE *File)
{
    while((USART1->SR & 0X40) == 0);
    USART1->DR = (uint8_t)ch;
    return ch;
}



编译记得勾选Use Micro LIB

在这里插入图片描述


循环中放入以下代码即可:

printf("%.2f\r\n", 360/4096*REIN_MT6816_Get_AngleData());
     HAL_Delay(1000);


附注:

以上所有文字及图片均来源于网络,如有侵权,请联系删除

相关文章
客户服务中心
0755-83986875
地址:深圳市罗湖区文锦广场文盛中心1401
邮箱:wawa209@126.com
联系电话:13510581182(周经理)
                 0755-83986875(总机)
二维码
友情链接: MagnTek麦歌恩 电子产品世界 电子发烧友 极客网 电子应用设计 屹晶微电子 电子工程网
Copyright 2022 深圳市威立胜电子有限公司    备案号:粤ICP备2022137744号-1