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

这篇具有很好参考价值的文章主要介绍了STM32通过SPI方式读取MT6816磁编码器绝对位置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CUBEMX基本配置:

调试方式:SW

mt6816,stm32,单片机,arm

系统时钟配置:

mt6816,stm32,单片机,arm

CS引脚配置:

mt6816,stm32,单片机,arm

SPI参数配置:

mt6816,stm32,单片机,arm

串口配置:

mt6816,stm32,单片机,arm

生成代码:

然后点右上角生成代码。

代码:

源文件:

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

MT6816_SPI_Signal_Typedef	mt6816_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_Typedef	mt6816;

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(GPIOA,GPIO_PIN_4,1) 
#define MT6816_SPI_CS_L()		 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,0) 
#define MT6816_SPI_Get_HSPI		    (hspi1)
#define MT6816_Mode_SPI		        (0x03)	


typedef struct{
	uint16_t	sample_data;	
	uint16_t	angle;				
	bool		no_mag_flag;	
	bool		pc_flag;			
}MT6816_SPI_Signal_Typedef;

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

typedef struct{
	uint16_t	angle_data;			
	uint16_t	rectify_angle;		
	bool			rectify_valid;		
}MT6816_Typedef;

extern MT6816_Typedef	mt6816;
					
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

mt6816,stm32,单片机,arm

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

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

最后就完成了对MT6816绝对位置的读取。文章来源地址https://www.toymoban.com/news/detail-682846.html

到了这里,关于STM32通过SPI方式读取MT6816磁编码器绝对位置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32通过编码器控制小车行驶指定的距离

    主控芯片为stm32f407,通过编码器计算行驶距离,pid闭环控制,程序源码中包含上一期的pid速度控制。使用本程序所需知道的条件:编码器一周几个脉冲,电机的减速比和车轮的直径。 (注:免费源码链接,请点赞关注私信) 视频介绍;行驶距离120厘米,换算编码器脉冲共3103个

    2024年04月23日
    浏览(28)
  • STM32(HAL)--使用定时器TIM的Encoder Mode来读取旋钮编码器的脉冲数

    目录 一 旋钮编码器相关知识 二 STM32CubeMx配置 三 程序编写 3.1 相关函数介绍 3.2 程序编写 四 实验结果 旋转编码器是一种位置传感器,输出脉冲信号可以用来确定编码器的旋转角度和旋转方向。 编码器中有两个开关,当旋钮旋转后,开关会依次导通,开关结构图如下图所示

    2024年02月15日
    浏览(52)
  • matlab读取pwm波数据,不用timer的方法,这里可以参考。Matlab/Simulink之STM32开发-编码器测速

    这里提供了一个不用timer的方法,可以参考: https://blog.csdn.net/weixin_36967309/article/details/88699830 Matlab/Simulink之STM32开发-编码器测速

    2024年01月18日
    浏览(54)
  • STM32编码器模式(带方向/正交编码)

    看前说明 :这里重点介绍的时STM32的定时器编码器模式,是根据STMF10x参考手册,如果有使用过编码器或编码器不一样的可以直接跳过前面的编码器介绍,直接看理论分析与程序部分。 这里需要注意的参数 输出脉冲线数:1024线: 编码器每旋转一周输出的脉冲的个数 ,这个数

    2023年04月24日
    浏览(55)
  • stm32-编码器测速

    编码电机 旋转编码器 A,B相分别接通道一和二的引脚,VCC,GND接单片机VCC,GND 以前的代码是通过触发外部中断,然后在中断函数里手动进行计次。使用编码器接口的好处就是节约软件资源。对于频繁执行,操作简单的任务,一般设计一个硬件电路模块来自动完成。 使用定时器

    2024年03月19日
    浏览(48)
  • STM32——TIM编码器接口

    Encoder Interface 编码器接口 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲, 自动控制CNT自增或自减 ,从而指示编码器的位置、旋转方向和旋转速度 每个高级定时器和通用定时器都拥有 1个编码器接口 ,C8T6拥有4个编码器接口 两个输入引脚

    2024年01月19日
    浏览(41)
  • STM32 TIM编码器接口

    单片机学习! 目录 文章目录 前言 一、编码器接口简介 1.1 编码器接口作用 1.2 编码器接口工作流程 1.3 编码器接口资源分布 1.4 编码器接口输入引脚 二、正交编码器 2.1 正交编码器功能 2.2 引脚作用 2.3 如何测量方向 2.4 正交信号优势 2.5 执行逻辑 三、编码器定时器框图 3.1 编

    2024年04月14日
    浏览(45)
  • STM32 ABZ编码器模式详解

            本文旨在记录和说明STM32CubeIde中ABZ编码器的配置。本人作为STM32新手,在使用STM32时,太多的意义不明的配置项让我摸不着头脑,查阅资料并在这里记录,如果有不对的,欢迎各位大佬指正。         本文硬件使用ST官方提供的NUCLEO-G474RE+X-NUCLEO-IHM16M1,记录ABZ的配

    2024年02月19日
    浏览(63)
  • STM32 EC11 旋转编码器

    代码在最后,复制可直接食用 以及我的电路图 在研究EC11的时序之前首先要了解一点,EC11按旋转的输出动作可以分为两种。一种是转两格,A、B对C端输出一个完整脉冲(转一格就只是由低电平-高电平或由高电平-低电平);另一种就是转一格,A、B对C端输出一个完整脉冲。

    2024年02月02日
    浏览(39)
  • stm32霍尔编码器电机测速原理

            本次选用的编码器电机为13线的霍尔编码器电机,电机减速比为30:1,转动一圈输出13*30=390个脉冲。轮胎直径为75mm,轮胎周长为pi*d=3*75=225mm.定时器采用四倍频计数,则一圈输出390*4=1560个脉冲。具体编码器知识这里就不多说了。          根据测速原理:假设编

    2024年02月15日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包