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

IC-MU磁绝对值编码器的SPI通讯和码盘数据处理

  • 前言
  • 一、硬件连接
  • 二、STM32 cubmx配置模式
  • 三、软件代码及思路
    • 1.寄存器指令介绍
    • 2.代码介绍
      • 1初始声明和定义
      • 2激活寄存器
      • 3编码器初始化函数
      • 4数据读取
      • 5角度计算
      • 6主函数读取角度
  • 总结

前言

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读取到数值变化,基本就算成功了,剩下的就无非是处理一下

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

  1. STM32环境下AS5048A14位磁旋转编码器SPI通讯调试记录——我学到的东西、遇到的问题、解决的过程

    ❤ 2019.3.16 事情是这样的. 在很多天以前,老师接了个项目,问我有没有意向,我谨慎的表达了我对新事物的好奇心,对新知识的求知欲,同时又委婉的表达了我的能力有限的实际情况,然后我以为事情就这么 ...

  2. U8G2库移植到STM32平台上

    U8G2库简介 U8g2是嵌入式设备的单色图形库,一句话简单明了.主要应用于嵌入式设备,包括我们常见的单片机: 建议先看这篇博客的介绍,写的比较好u8g2库的使用 这篇博客介绍了对于u8g2的使用,但 ...

  3. android 智能设备管理,基于Android平台上BLE的智能家居控制系统设计与实现

    摘 要:基于智能家居无线控制的市场需求,以集成了CSR1010低功耗蓝牙芯片的智能插座为例,在Android平台上设计了一套基于蓝牙4.0通信协议的智能家居控制系统,实现了对此智能插座的无线通断电控制 ...

  4. mysql gprs 程序_基于STM32控制的GPS定位与GPRS发送数据(程序源码)

    一个用STM32控制的GPS与GPRS程序,GPS使用ublox的GPS,GPRS使用SIM800E,主要实现每隔几分钟(间隔时间由服务器设定,默认5分钟)将模块的定位结果数据发送到服务器中,服务器返 ...

  5. c语言单片机制作自动售卖机,基于STM32单片机的自动售水售卖机系统设计-RFID-(电路图+程序源码)...

    2019-150.STM32自动售水系统设计-RFID-LCD12864-RELAY-BELL-KEY 本设计由STM32F103C8T6单片机核心板电路+RFID模块电路+LCD12864液晶显示模 ...

  6. 基于STM32F103的USB学习笔记38 - Mass Storage之SPI Flash做U盘

    1. 将整个Flash作为U盘的空间 Flash大小为4MB,SPI NorFlash的Sector大小为4KB,所以MSC_MEMORY_BLOCK_SIZE设置为4096.. 3个函数的实现如下, ...

  7. STM32毕业设计——基于STM32+MQTT+WiFi技术的智能家居系统设计与实现(毕业论文+程序源码)——智能家居系统

    基于STM32+MQTT+WiFi技术的智能家居系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于STM32+MQTT+WiFi技术的智能家居系统设计与实现,文章末尾附有本毕业设计的论文 ...

  8. 基于STM32人群定位,调速智能风扇设计

    基于STM32人群定位,调速智能风扇设计(论文,源码,流程图,设计报告) 1.本系统采用 STM32 , ATmega16 , AT89S52 三款单片机为控制器, 分为主控台和工 作区两部分. 2. ...

  9. 基于STM32单片机的直流电机PWM调速(Proteus仿真+程序)

    编号:9 基于STM32单片机的直流电机PWM调速 功能描述: 由 STM32单片机+液晶1602显示模块+键盘模块+L298N电机驱动模块+直流电机 1.采用STM32F103单片机为主控制器 2. ...

最新文章

  1. Python实现贪吃蛇小游戏(双人模式)
  2. vscode: Visual Studio Code 常用快捷键
  3. 59 Celery架构
  4. ML之LiR:利用LiR线性回归算法(自定义目标函数MSE和优化器GD)对Boston房价数据集(两特征+归一化)进行回归预测
  5. PS教程第二十四课:魔法棒
  6. echarts柱形图x轴y轴互换_数控机床在加工零件时,突然出现X、Y、Z轴失控?如何处理...
  7. 1-1. 虚拟机控制
  8. 科兴生物董事长:两针建立免疫记忆 三针后抗体提升十倍
  9. sqlerror.java 1074_java.sql.SQLException: Before start of result set异常
  10. java 优秀开源项目
  11. 历时2年《爱上Android》出版了
  12. lxml简单用法 解析网页
  13. JDBC实战(一)JDBC概述
  14. 关于RS232芯片和RS485芯片共用一个STM32串口的情况下如何设计电路
  15. 农产品管理系统-毕设
  16. 使用excel导入功能时日期数据变成数字的解决
  17. AI计算机视觉产品中长尾用户,基于长尾理论的AI写作具体分析
  18. TensorFlow练习13: 制作一个简单的聊天机器人
  19. c语言编写一个简单的答题系统
  20. 埃尔米特多项式 (Hermite Polynomials)简介(1)

热门文章

  1. 洛谷 1078 文化之旅
  2. MySQL增删改查常用语句命令
  3. 【计算机图形学实验四——简单几何形体的平移、缩放、旋转等几何变换】
  4. CTF每日一题之ACII码编码
  5. sql注入pythonpoco_SQL注入原理与解决方法代码示例
  6. uIP学习的参考资料
  7. osg自定义操作器实现视图缩放
  8. Python数据处理035:结构化数据分析工具Pandas之Pandas概览
  9. 《Microduino实战》——3.2 “Hello World!”—— 开启编程之旅
  10. compat-wireles的理解