你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
STMCU小助手 发布时间:2023-2-25 17:59
前言
ic-mu基本情况介绍

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

325acfd031684154a51541ebaf3bc1f5.png

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

一、硬件连接

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

二、STM32 cubmx配置模式
STM32G491配置cubemx

b31de8a144684fd8815c3aea74271bba.png


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

896f63f11e5f4a62b6e64e9527c395a0.png

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

2e692f827e4048f38f0a6020450c06ec.png


SPI通道要设置为高速
除此之外还需要设置片选信号,默认为高电平

e8715427ead043cd984ccaaf608c5208.png

三、软件代码及思路
首先需要对整体进行说明,需要将编码器激活,配置在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初始声明和定义
  1. #define    SPI_IC_MU_CS_LOW();       HAL_GPIO_WritePin(ABS_ENCODER_CSN_GPIO_Port, ABS_ENCODER_CSN_Pin, GPIO_PIN_RESET);
  2. #define          SPI_IC_MU_CS_HIGH() ;     HAL_GPIO_WritePin(ABS_ENCODER_CSN_GPIO_Port, ABS_ENCODER_CSN_Pin, GPIO_PIN_SET);

  3. uint16_t SPI_SendHalfWord(uint16_t HalfWord)
  4. {
  5.   
  6.   SPITimeout = SPIT_LONG_TIMEOUT;
  7.   /* Loop while DR register in not emplty */
  8.   while (__HAL_SPI_GET_FLAG( &hspi1,  SPI_FLAG_TXE ) == RESET)
  9.   {
  10.     if((SPITimeout--) == 0) return 0;
  11.   }
  12.   /* Send Half Word through the SPIx peripheral */
  13.   WRITE_REG(hspi1.Instance->DR, HalfWord);

  14.   SPITimeout = SPIT_LONG_TIMEOUT;
  15.   /* Wait to receive a Half Word */
  16.   while (__HAL_SPI_GET_FLAG( &hspi1, SPI_FLAG_RXNE ) == RESET)
  17.    {
  18.     if((SPITimeout--) == 0) return 0;
  19.    }
  20.   /* Return the Half Word read from the SPI bus */
  21.   return READ_REG(hspi1.Instance->DR);
  22.   
  23. }
复制代码

2激活寄存器
激活后才能对寄存器有操作
  1. void ACTIVATE_FUN(void)
  2. {
  3.   uint32_t ICMU_Temp = 0;
  4.   SPI_IC_MU_CS_LOW();
  5.   ICMU_Temp= SPI_SendHalfWord(0xB083);
  6.   SPI_IC_MU_CS_HIGH();
  7.    Delay(100);
  8. }
复制代码

3编码器初始化函数
初始化发送0xB083激活编码器,编码器配置为单圈14位,具体见数据手册
初始化完成后可删除函数,状态会固化在配套eeprom种,不会丢失
  1. void Init_ICMU(void)
  2. {
  3.    ACTIVATE_FUN();
  4.   uint32_t ICMU_Temp = 0, ICMU_Temp1=0;
  5.   SPI_IC_MU_CS_LOW();
  6.   ICMU_Temp= SPI_SendHalfWord(0xCF00);
  7. ICMU_Temp1= SPI_SendHalfWord(0x8E20);
  8.   SPI_IC_MU_CS_HIGH();
  9.    Delay(100);
  10. }
复制代码

4数据读取
编码器数据读取,读取指令为0xA6
  1. uint32_t SPI_SDAD_transmission_Fun ( void)
  2. {
  3.        
  4.         uint32_t Temp = 0 , Temp1 = 0, Temp2 = 0 , Temp3 = 0 ;
  5.   ACTIVATE_FUN();
  6.        
  7.    /* 开始通讯:CS低电平 */
  8.    SPI_IC_MU_CS_LOW();
  9.         Temp1=SPI_SendHalfWord(0xA6FF);
  10.         Temp2=SPI_SendHalfWord(0xFFFF);
  11.        
  12.        
  13.          /* 结束通讯:CS高电平*/
  14.    SPI_IC_MU_CS_HIGH();
  15.      
  16. //  Temp = (  (Temp1 << 16) | (Temp2 << 8) | Temp3  )>> 5 ; //读出数据,右移5位,共24位,有效位为19位  
  17.    Temp=  (Temp1 << 16| Temp2) >> 13;   //总体32位 19位的话需右移13位
  18.           Delay(1000);
  19.          return Temp;
  20. }
复制代码

5角度计算
角度我用了11位,初始默认存在一个数值因此将他减掉了,然后按照360度进行划分
  1. float Position_Calce()
  2. {
  3.     uint32_t  a ;
  4.           double b;
  5.           float  c ;
  6.                 uint32_t  www ;
  7.                 double  n ;
  8.      a=SPI_SDAD_transmission_Fun ();
  9.       n=((a-0x00053000)/2047);//计算角度
  10.        b= 360.000* ((double)(a-0x53000)/2047);
  11.       
  12.                         return b;                       
  13.   
  14. }
复制代码

6主函数读取角度
  1. float position_fk_f=0;  //位置计算
  2.        
  3. while (1)
  4.     {
  5.                   position_fk_f=        Position_Calce();
  6.                   }
复制代码

总结

当你转动电机轴能通过SPI发送0xA6读取到数值变化,基本就算成功了,剩下的就无非是处理一下
————————————————
版权声明:超级馒头神


收藏 评论0 发布时间:2023-2-25 17:59

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版