基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

ic-mu基本情况介绍

IC_MU是一款离轴的1.28mm磁编码器,主要用于电机控制居多,当作磁编码器,优势是能使用多种通讯协议(SPI,BISS,SSI),但是目前中文网上使用资料较少,因此我自己写一篇关于IC_MU的SPI通讯读取方式的文章,读取芯片为stm32G4系列,然后代码在stm32G4和stm32F1系列基本通用。
芯片基本介绍如下
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、硬件连接

按最小系统连接。IC-mu需连接eeprom存储角度,供电为5V

二、STM32 cubmx配置模式

STM32G491配置cubemx
在这里插入图片描述

如图几个关键点
1数值格式:可以选8bit,但是我觉得16比特配置更方便,如果要配8bit只需将数据拆分即可
2波特率 没有明确要求,12M以下都可以
3SPI模式,SPI一共4种模式

在这里插入图片描述

IC_MU只支持模式0和模式3,如上图所示采用模式3 CPOL选择High CPHA选择2Edge

在这里插入图片描述
SPI通道要设置为高速

除此之外还需要设置片选信号,默认为高电平
在这里插入图片描述

三、软件代码及思路

首先需要对整体进行说明,需要将编码器激活,配置在SPI通讯模式

1.寄存器指令介绍

0xB083 Activate,激活
0xA6FF Position Read 位置读取命令

0x8A Register Read (Continuous) 寄存器读取(连续)
0xCF Register Write(Continuous) 寄存器写入(连续)
0x9C Read Status 读取状态寄存器 指令
0x97 Register Read(Single) 寄存器读取(单次)
0xD2 Register Write(Single) 寄存器写入(单次)

2.代码介绍

对片选进行宏定义,然后对SPI数据传输底层函数进行定义

1初始声明和定义

#define    SPI_IC_MU_CS_LOW();       HAL_GPIO_WritePin(ABS_ENCODER_CSN_GPIO_Port, ABS_ENCODER_CSN_Pin, GPIO_PIN_RESET);
#define 	 SPI_IC_MU_CS_HIGH() ;     HAL_GPIO_WritePin(ABS_ENCODER_CSN_GPIO_Port, ABS_ENCODER_CSN_Pin, GPIO_PIN_SET);

uint16_t SPI_SendHalfWord(uint16_t HalfWord)
{
  
  SPITimeout = SPIT_LONG_TIMEOUT;
  /* Loop while DR register in not emplty */
  while (__HAL_SPI_GET_FLAG( &hspi1,  SPI_FLAG_TXE ) == RESET)
  {
    if((SPITimeout--) == 0) return 0;
  }
  /* Send Half Word through the SPIx peripheral */
  WRITE_REG(hspi1.Instance->DR, HalfWord);

  SPITimeout = SPIT_LONG_TIMEOUT;
  /* Wait to receive a Half Word */
  while (__HAL_SPI_GET_FLAG( &hspi1, SPI_FLAG_RXNE ) == RESET)
   {
    if((SPITimeout--) == 0) return 0;
   }
  /* Return the Half Word read from the SPI bus */
  return READ_REG(hspi1.Instance->DR);
  
}

2激活寄存器

激活后才能对寄存器有操作

void ACTIVATE_FUN(void)
{
  uint32_t ICMU_Temp = 0;
  SPI_IC_MU_CS_LOW();
  ICMU_Temp= SPI_SendHalfWord(0xB083);
  SPI_IC_MU_CS_HIGH();
   Delay(100);
}

3编码器初始化函数

初始化发送0xB083激活编码器,编码器配置为单圈14位,具体见数据手册
初始化完成后可删除函数,状态会固化在配套eeprom种,不会丢失

void Init_ICMU(void)
{
   ACTIVATE_FUN();
  uint32_t ICMU_Temp = 0, ICMU_Temp1=0;
  SPI_IC_MU_CS_LOW();
  ICMU_Temp= SPI_SendHalfWord(0xCF00);
 ICMU_Temp1= SPI_SendHalfWord(0x8E20);
  SPI_IC_MU_CS_HIGH();
   Delay(100);
}

4数据读取

编码器数据读取,读取指令为0xA6

uint32_t SPI_SDAD_transmission_Fun ( void)
{
	
	uint32_t Temp = 0 , Temp1 = 0, Temp2 = 0 , Temp3 = 0 ;
  ACTIVATE_FUN();
	
   /* 开始通讯:CS低电平 */
   SPI_IC_MU_CS_LOW();
	Temp1=SPI_SendHalfWord(0xA6FF);
	Temp2=SPI_SendHalfWord(0xFFFF);
	
	
	 /* 结束通讯:CS高电平*/
   SPI_IC_MU_CS_HIGH();
     
 //  Temp = (  (Temp1 << 16) | (Temp2 << 8) | Temp3  )>> 5 ; //读出数据,右移5位,共24位,有效位为19位  
   Temp=  (Temp1 << 16| Temp2) >> 13;   //总体32位 19位的话需右移13位
	  Delay(1000);
	 return Temp;
}

5角度计算

角度我用了11位,初始默认存在一个数值因此将他减掉了,然后按照360度进行划分

float Position_Calce()
{
    uint32_t  a ;
	  double b;
	  float  c ;
		uint32_t  www ;
		double  n ;
     a=SPI_SDAD_transmission_Fun ();
      n=((a-0x00053000)/2047);//计算角度
       b= 360.000* ((double)(a-0x53000)/2047);
       
			return b;			
  
}

6主函数读取角度

	float position_fk_f=0;  //位置计算
	
 while (1)
    {
	  	position_fk_f=	Position_Calce();
	  	}

总结

当你转动电机轴能通过SPI发送0xA6读取到数值变化,基本就算成功了,剩下的就无非是处理一下

  • 25
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
STM32编码器是一种用于计数和测量转动或线性运动的设备。它可以通过硬件编码器接口连接到STM32微控制器上。编码器通过测量脉冲信号来计数运动的次数。根据引用中所提到的,STM32的硬件编码器具有智能的特性,它能够容许抖动并在连续产生脉冲时进行计数。通过选择不同的定时器接口,可以实现编码器的正向/反向计数。例如,定时器3可以通过PC6和PC7引脚连接编码器。 使用STM32编码器的基本步骤与开发其他STM32部件的操作相似。首先,需要打开时钟并配置输入滤波和边沿检测以生成相应的脉冲信号。然后,根据需要配置编码器的工作模式,如正向计数、反向计数等。如果要使用中断功能,还需要打开相应的中断。具体的代码示例可以参考引用中提供的STM32编码器的示例代码。 另外,引用提供了一些关于使用STM32编码器的注意事项。例如,编码器有一个转速上限,超过这个上限将无法正常工作。此外,编码器的输出一般是开漏的,因此需要在单片机的IO上拉输入状态。在初始化定时器后,CNT寄存器的值将是编码器的位置信息,正转时CNT会增加,反转时CNT会减少。如果需要多圈计数,可以使用溢出中断来实现。此外,可以通过软件设置滤波来优化输入脚的信号。如果没有绝对位置信号,可以使用码盘的零位置信号结合定时器捕获输入来找到初始位置。 总之,STM32编码器是一种用于计数和测量运动的设备,通过选择不同的定时器接口和配置编码器的工作模式,可以实现所需的计数方式。在使用编码器时,需要注意一些硬件的限制和配置方面的注意事项。根据具体的应用需求,可以灵活选择编码器的功能和算法来满足需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级馒头神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值