HAL STM32 SSI/SPI方式读取MT6701磁编码器获取角度例程

HAL STM32 SSI/SPI方式读取MT6701磁编码器获取角度例程


  • 📍相关篇《HAL STM32 I2C方式读取MT6701磁编码器获取角度例程》
  • 📌当前最新MT6701数据手册:https://www.magntek.com.cn/upload/MT6701_Rev.1.8.pdf
  • 📜SSI协议读角度,时序和数据关系
    在这里插入图片描述
    在这里插入图片描述

SSI方式完全可以使用3个IO配置为输入输出模式(两个配置为输出,一个配置为输入),通过SSI协议,读取电平状态,实现对数据解析。

  • 📝SSI核心代码实现:(参考《STM32 HAL库 驱动 MT6701 磁编码器》)
#define Loss_of_Track       4
#define Button_Detected     3
#define Field_Weak          2
#define Field_Strong        1
#define Normal              0/** SSI 方式读取信息* mode == 0 返回角度信息,0~360 浮点数* mode == 1 返回磁场信息*/
double ReadDataSSI(uint8_t mode)
{uint8_t RawData[25] = {0};uint16_t angle = 0;double fangle = 0;HAL_GPIO_WritePin(SSI_CSN_GPIO_Port,SSI_CSN_Pin,GPIO_PIN_RESET);        //起始信号Delay_us(2);HAL_GPIO_WritePin(SSI_CLK_GPIO_Port,SSI_CLK_Pin,GPIO_PIN_RESET);        //跳过第一个时钟沿Delay_us(2);HAL_GPIO_WritePin(SSI_CLK_GPIO_Port,SSI_CLK_Pin,GPIO_PIN_SET);Delay_us(2);for(uint8_t i = 0; i < 25; i++)                                                                 //读取数据{HAL_GPIO_WritePin(SSI_CLK_GPIO_Port,SSI_CLK_Pin,GPIO_PIN_RESET);RawData[i] = HAL_GPIO_ReadPin(SSI_DI_GPIO_Port,SSI_DI_Pin);HAL_GPIO_WritePin(SSI_CLK_GPIO_Port,SSI_CLK_Pin,GPIO_PIN_SET);Delay_us(2);}HAL_GPIO_WritePin(SSI_CSN_GPIO_Port,SSI_CSN_Pin,GPIO_PIN_SET);          //结束信号for(uint8_t i = 0; i < 14; i++)angle += RawData[i] * (2 << (13 - i));fangle = (double)(angle * 180.0) / 16384.0;     //角度信息switch (mode){case 0:return fangle;case 1:{if(RawData[14])return Loss_of_Track;else if(RawData[15])return Button_Detected;else if(RawData[16])return Field_Weak;else if(RawData[17])return Field_Strong;elsereturn Normal;}default:return 0;}
}
  • 🌿引脚配置:
    在这里插入图片描述

📚SSI测试工程

链接:https://pan.baidu.com/s/1es233q_NBo_s_fLkgbmTjw?pwd=r90i 
提取码:r90i

⛳SPI方式

📗STM32 SPI参数配置:
  • 🌿STM32CubeMX中SPI基本配置信息:(其中Data Size,这里选择配置的是8位,配置16位也是可以的,不过软件编程上就与8位的编程代码就不同,不通用)。
    在这里插入图片描述

  • SPI串行同步时钟可以设置为不同的极性(Clock Polarity ,CPOL)与相位(Clock Phase ,CPHA)。

  • 时钟的极性(CPOL)用来决定在总线空闲时,同步时钟(SCK)信号线上的电位是高电平还是低电平。

  • 当时钟极性为0时(CPOL=0),SCK信号线在空闲时为低电平;当时钟极性为1时(CPOL=1),SCK信号线在空闲时为高电平;

  • 时钟的相位(CPHA)用来决定何时进行信号采样。

  • 当时钟相位为1时(CPHA=1),在SCK信号线的第二个跳变沿进行采样;这里的跳变沿究竟是上升沿还是下降沿,取决于时钟的极性。当时钟极性(CPOL)为0时,取下降沿;当时钟极性(CPOL)为1时,取上升沿;如下图:
    在这里插入图片描述

  • 🔖设置依据:根据手册SSI协议,可知:CLK空闲状态为low,决定CPOL配置为low,推荐CLK下降沿采集数据,那就配置CPHA为2,在SCK信号线的第二个跳变沿进行采样。
    在这里插入图片描述


  • 🌾 补充:
    • 当时钟相位为0时(CPHA=0),在SCK信号线的第一个跳变沿进行采样。跳变沿同样与时钟极性有关:当时钟极性为0时,取上升沿;当时钟极性为1时,取下降沿;如下图:
      在这里插入图片描述
  • 对应:
    在这里插入图片描述

SPI数据读取和转换实现

void MT6701_Read_RAW(uint8_t* pBuffer)   
{ uint16_t i; MT6701_CSN_CLR;//MT6701_CSN=0  //片选 for (i = 0; i < 4; i++){ pBuffer[i]=SPIx_ReadWriteByte(0xFF);    //循环读入字节数据  }	MT6701_CSN_SET;  //MT6701_CSN=1
} /*!*  @brief  Return position of encoder*  @return Angle value of encoder position*/
float angleRead( void ){float angle_f = 0.0f;uint8_t data[3];uint16_t angle_u16;MT6701_Read_RAW(data);angle_u16  = (uint16_t)(data[1] >> 2);angle_u16 |= ((uint16_t)data[0] << 6);angle_f =  (float)angle_u16 * (360.0f/16384.0f);return angle_f;
}
  • 🎉优化处理
//angle_raw返回原始角度数据,angle转换后的角度值:0-360,field_status磁场强度;
void mt6701_read(uint16_t*angle_raw, float*angle, uint8_t*field_status)
{float angle_f = 0.0f;uint8_t status;uint8_t data[3];uint16_t angle_u16;MT6701_Read_RAW(data);angle_u16 = (uint16_t)(data[1] >> 2); //原始值angle_u16 |= ((uint16_t)data[0] << 6);status = (data[2] >> 6);status |= (data[1] & 0x03) << 2;if(angle_raw != NULL) {*angle_raw = angle_u16;}if(angle != NULL) {angle_f = (float)angle_u16 * (360.0f / 16384.0f);*angle = angle_f;}if(field_status != NULL) {*field_status = status & 0x03;}
}
  • 🔖测试效果:
    在这里插入图片描述

📚SPI测试代码

链接:https://pan.baidu.com/s/1X3vUEo5mW3vEGRbXftowxw?pwd=7o6g 
提取码:7o6g

📙读取24位数据并CRC校验功能测试

  • 📝代码实现部分:
 unsigned int Angle = 0;
uint32_t AngleIn24bits = 0;
uint8_t Spi_TxData[4]={0x83,0xff,0xff,0xff};///03 04 05 寄存器存角度
uint8_t Spi_pRxData[4]={0};uint32_t ReadAngle(void)
{//Read in Burst modeHAL_GPIO_WritePin(MT6701_CS_GPIO_Port, MT6701_CS_Pin, GPIO_PIN_RESET);///CSN LOW   HAL_SPI_TransmitReceive(&hspi1, &Spi_TxData[0], &Spi_pRxData[0],0x03,0xffff);HAL_GPIO_WritePin(MT6701_CS_GPIO_Port, MT6701_CS_Pin, GPIO_PIN_SET);///CSN HIGHAngleIn24bits= (Spi_pRxData[0]<<16)|(Spi_pRxData[1]<<8)|(Spi_pRxData[2]);//   AngleIn14bits >>= 10;return (AngleIn24bits);	    
}
uint8_t crc6(uint8_t *data, uint8_t length)  
{  uint8_t i;  uint8_t crc = 0;    // Initial value  while(length--)  {  crc ^= *data++; // crc ^= *data; data++;for (i=6; i>0; --i)  { if (crc & 0x20)crc = (crc << 1) ^ 0x03;elsecrc = (crc << 1);}}  return crc&0x3f;  
} int main(void)
{/* USER CODE BEGIN 1 */uint8_t s[3];uint8_t crcvalue = 0;uint32_t AngleInHex = 0;float angle=0.0f;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_SPI1_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */AngleInHex = ReadAngle();s[0]=AngleInHex>>18;s[1]=AngleInHex>>12;s[2]=AngleInHex>>6;if(crc6(s, 3)==(AngleInHex&0x3f)){   printf("\r\nReadcrc=0x%x\r\n",AngleInHex&0x3F);printf("Cacucrc=0x%x\r\n",crc6(s, 3)&0x3F);printf("%.2f\r\n",(AngleInHex>>10)*360/16384.0);printf("%X\r\n",AngleInHex);HAL_Delay(5);printf("\n-------------------\n");HAL_Delay(5);}else{printf("\r\nReadcrc=0x%x\r\n",AngleInHex&0x3F);printf("Cacucrc=0x%x\r\n",crc6(s, 3)&0x3F);printf("CRC check error!\r\n");printf("%.2f\r\n",(AngleInHex>>10)*360/16384.0);HAL_Delay(5);printf("\n\r--------------------\n\r");}HAL_Delay(500);}/* USER CODE END 3 */
}
  • 📄打印测试

在这里插入图片描述
在这里插入图片描述

📚读取数据并带CRC校验测试工程

链接:https://pan.baidu.com/s/1p-tUWT0P2aetlLwCr9X-IQ?pwd=1epn 
提取码:1epn

📘SPI +DMA读取数据并带CRC校验测试工程

  • 🥕基于读取数据并带CRC校验测试工程版本基础上调整而来的。
链接:https://pan.baidu.com/s/1GCT23_lJC4ocbHautazoxg?pwd=9kvi 
提取码:9kvi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【stomp实战】搭建一套websocket推送平台

前面几个小节我们已经学习了stomp协议&#xff0c;了解了stomp客户端的用法&#xff0c;并且搭建了一个小的后台demo&#xff0c;前端页面通过html页面与后端服务建立WebSocket连接。发送消息给后端服务。后端服务将消息内容原样送回。通过这个demo我们学习了前端stomp客户端的…

剑指 Offer 03.:数组中重复的数字

剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。…

DIN特征加权、POSO特征增强、SENET特征选择

本文转自&#xff1a;DIN、POSO、SENet 聊聊推荐模型中常用的Attention-腾讯云开发者社区-腾讯云 一、前言 聊起模型结构的时候&#xff0c;经常听做推荐的同学说&#xff1a; "这里加了个self-attention" "类似于一个SENet" "一个魔改的POSO"…

第6章 Mybatis高级查询(详解篇)

第6章 Mybatis高级查询_详解篇 1. 一对一映射1.1 自动映射(关联的嵌套结果映射)1.2 使用 resultMap 配置一对一映射resultMap复用1.3 association 标签的嵌套结果映射resultMap复用1.4 association标签的嵌套查询结构分析嵌套查询加载方式延迟记载注意事项延迟记载:利用@Respon…

[Visual Studio 报错] error 找不到指定的 SDK“Microsoft

[Visual Studio 2022 报错] error : 找不到指定的 SDK“Microsoft.NET.Sdk.Web” 问题描述&#xff1a; 在新电脑上安装了VS2022&#xff0c;打开现有项目的解决方案后的时候报了这个错&#xff0c;所有projet文件都加载失败,如图所示&#xff1a; 报错分析及解决 打开项目配…

经验丰富也被裁了,失业快2年找不到工作?

前几天徐工说&#xff0c;他有个邻居&#xff0c;最近逮到他总是要跟他扯上几句。 原因是徐工一直是做嵌入式开发&#xff0c;而他一直做纯软件开发&#xff0c;具体不知道做后端还是前端。 他说&#xff0c;他至少有半年没上班了&#xff0c;之前在一家龙头物流公司上班。 碰上…

Netty websocket配置wss

录音配置https 导致ws连不上 Slf4j Component public class NettyServer {/*** 启动** throws InterruptedException*/private void start() throws InterruptedException {bossGroup new NioEventLoopGroup();workGroup new NioEventLoopGroup();ServerBootstrap bootstrap…

STM32 HAL库F103系列之DAC实验(二)

DAC输出正弦波实验 实验简要 1&#xff0c;功能描述 通过DAC1通道1(PA4)输出正弦波&#xff0c;然后通过DS100示波器查看波形 2&#xff0c;使用定时器7 TRGO事件触发转换 TEN1位置1、TSEL1[2:0]010 3&#xff0c;关闭输出缓冲 BOFF1位置1 4&#xff0c;使用DMA模式 DMAE…

SLMs之Phi-3:Phi-3的简介、安装和使用方法、案例应用之详细攻略

SLMs之Phi-3&#xff1a;Phi-3的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年4月23日&#xff0c;微软发布Phi-3&#xff0c;这是微软推出的一款新的开源AI模型家族Phi-3。背景痛点&#xff1a;小语言模型(SLM)尽管规模不大&#xff0c;但在语言理解、代码…

盲盒商城小程序(有米就出)

一款前端采用uniapp&#xff0c;后端采用Django框架开发的小程序&#xff0c;包含后台管理&#xff0c;如有人需要可联系演示功能&#xff08;个人开发&#xff0c;可商用/学习&#xff09;。 部分截图如下&#xff1a;

设备驱动-随记

1. dma_alloc_coherent函数是用于在Linux内核中为设备驱动程序分配用于DMA操作的内存区域的函数。DMA是指通过外部设备直接访问系统内存的过程&#xff0c;它通常用于设备之间的数据传输&#xff0c;比如网络数据包的接收和发送&#xff0c;磁盘I/O等。 这个函数在linux/dma-…

【刷题】C++ 版刷题指南

C 刷题指南&#xff08;自用&#xff09; 小tips&#xff1a;includestruct节点io输入输出练习其它 库输入迭代器stringvectordeque&#xff08;双端队列&#xff09;优先队列priority\_queue优先队列 tuple优先队列 结构体&#xff08;自定义排序&#xff09; mapsetpairtup…

文件摆渡:安全、高效的摆渡系统助力提升效率

很多组织和企业都会通过网络隔离的方式来保护内部的数据&#xff0c;网络隔离可以是物理隔离&#xff0c;也可以是逻辑隔离&#xff0c;如使用防火墙、VPN、DMZ等技术手段来实现&#xff0c;隔离之后还会去寻找文件摆渡方式&#xff0c;来保障日常的业务和经营需求。 进行网络隔…

Python的一些高级用法

Python的高级用法涵盖了更深入的编程技巧、设计模式、并发编程、性能优化等方面。以下是Python的一些高级用法&#xff1a; 1.装饰器 用于修改函数或类的行为的函数&#xff0c;常用于日志记录、性能分析等。 def my_decorator(func):def wrapper():print("Something i…

数据库变更时,OceanBase如何自动生成回滚 SQL

背景 在开发中&#xff0c;数据的变更与维护工作一般较频繁。当我们执行数据库的DML操作时&#xff0c;必须谨慎考虑变更对数据可能产生的后果&#xff0c;以及变更是否能够顺利执行。若出现意外数据丢失、操作失误或语法错误等情况&#xff0c;我们必须迅速将数据库恢复到变更…

jsp+springboot+java二手车交易管理系统258u6

设计而成的系统要有以下目标&#xff1a;管理员和用户能够跳转到不同的页面当中。因此要把系统的目标设置为如下几项&#xff1a; (1) 系统在操作上不能过于复杂。 (2) 用户对应着不同的角色 (3) 设计完成的数据库要有能够处理并发和安全的作用 (4) 设计完成的管理…

Python——目标检测标签中的英文名转化为对应的类别编号

Yolov5进行目标检测流程在下文中已做说明&#xff1a; Python——一文详解使用yolov5进行目标检测全流程&#xff08;无需gpu&#xff09;_yolo不用gpu-CSDN博客 在Yolov5使用中中&#xff0c;标签数据里类别的中文名&#xff0c;需要转换成类别编号。相关代码如下&#x…

亚马逊云科技提高企业生产力神器Amazon Q评测分析

一年一度的全球云计算春晚&#xff0c;亚马逊云科技Re:invent在2023年11月27于Vegas震撼来袭&#xff0c;其中最令人关注的就是CEO Adam在Keynote中分享的内容。其中一个新内容就是提升生产力神器: Amazon Q&#xff0c;可以说它重新定义了企业的工作模式。那具体它神在哪里呢&…

设计模式- 代理模式(Proxy Pattern)结构|原理|优缺点|场景|示例

设计模式&#xff08;分类&#xff09; 设计模式&#xff08;六大原则&#xff09; 创建型&#xff08;5种&#xff09; 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型&#xff08;7种&#xff09; 适配器…

Python构建学生信息管理系统:网站路由补充和首次运行

在之前的内容中&#xff0c;我们已经完成了学生信息管理系统&#xff08;Student Information Management System, SIMS&#xff09;的需求分析、环境搭建、数据库创建、项目结构的初始化&#xff0c;以及运行。正常做下来的朋友&#xff0c;会发现项目运行后输入http://127.0.…