HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程

2024-04-05 03:36

本文主要是介绍HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程


  • 📍相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》

✨stm32使用硬件I2C去读取角度数据,通过STM32CubeMX工具配置工程,读取角度数据,只需要调用一个函数,即可完成数据的读取。了解函数的用法以及从设备地址命令,上手十分快速和简单。

  • 📌AS5600资料:https://pan.baidu.com/s/15UMUH5_ppb2FTju7AJgFyw

📗AS5600寄存器描述

  • 📄AS5600寄存器汇总:
    在这里插入图片描述
  • 🌿ZPOS/MPOS/MANG寄存器:这些寄存器用于配置开始位置(ZPOS)和停止位置(MPOS)或最大角度(MANG)。默认范围为全0到360度,但当配置了一个较窄的范围时,输出的全分辨率将自动缩放到所配置的角度范围。角度范围必须大于18度。
  • 🌿ANGLE/RAW ANGLE 寄存器(0x0c,0x0d):RAW角度寄存器包含未缩放和未修改的角度。缩放后和过滤后的输出值在角度寄存器中可用。(原始值范围:0 - 4095)
  • 🌿ANGLE角度值(0x0e,0x0f):角度值范围:0-360
  • 🌿STATUS 状态寄存器:状态寄存器提供指示AS5600的当前状态的位。(当前磁场强度)
    在这里插入图片描述
  • 🌿AGC寄存器:AS5600在一个闭环中使用自动增益控制来补偿由于温度变化、IC和磁体之间的气隙以及磁体退化而引起的磁场强度的变化。AGC寄存器表示增益。对于最健壮的性能,增益值应该在其范围的中心。物理系统的气隙可以被调整以达到这个值。在5V操作中,AGC范围为0-255次。在3.3V模式下,AGC范围减少到0-128个计数。
  • 🌿MAGNITUDE寄存器:MAGNITUDE寄存器表示内部CORDIC的幅度值。
  • 🌿Burn_Angle命令(ZPOS,MPOS):MCU可以使用BURN_ANGLE命令执行ZPOS和MPOS的永久编程。要执行BURN_ANGLE命令,请将值0x80写入寄存器0xFF。BURN_ANGLE命令最多可以执行3次。ZMCO显示了ZPOS和MPOS被永久写入的多少次。

  • 🌿磁场Bz和典型的间隙
    在这里插入图片描述

典型的间隙在0.5 mm到3 mm之间,这取决于所选的磁铁。一个更大和更强的磁铁允许一个更大的气隙。使用AGC值作为导轨,通过调整磁体与AS5600之间的距离,使AGC值在其范围的中心,可以找到最佳的气隙。当使用直径为6mm的磁铁时,参考磁铁的旋转轴从包装中心的最大允许位移为0.25 mm。

📑功能概要

  • 🖍首先对AS5600设备地址进行扫描,并打印设备地址,然后从指定设备的指定寄存器地址读取2个字节数据。

🛠STM32CubeMX工程配置

  • 🌿勾选I2C,参数默认即可。
    在这里插入图片描述
  • 🌿使能一路串口,方便查看数据信息。

在这里插入图片描述

📙业务代码完善

  • 📄main函数内容:
int main(void)
{/* USER CODE BEGIN 1 */uint8_t Raw_num[2];// Read angular measurementsuint16_t Angle = 0;/* 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_I2C1_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */printf("Scanning I2C bus:\r\n");HAL_StatusTypeDef result;uint8_t i;for (i=1; i<128; i++){/** the HAL wants a left aligned i2c address* &hi2c1 is the handle* (uint16_t)(i<<1) is the i2c address left aligned* retries 2* timeout 2AS5600 i2c address:(0x6c = 0x36 << 1)*/result = HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(i<<1), 2, 2);if (result != HAL_OK) // HAL_ERROR or HAL_BUSY or HAL_TIMEOUT{printf("."); // No ACK received at that address}if (result == HAL_OK){printf("0x%X", i); // Received an ACK at that address}}printf("\r\n");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1) {/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_I2C_Mem_Read(&hi2c1, AS5600_SLAVE_ADDRESS, addr_in, I2C_MEMADD_SIZE_8BIT, Raw_num, 2,100);int value = (Raw_num[0]<<8)|Raw_num[1];Angle = (value * 360)/4096;//换算成角度printf("Angle = %d degrees.\n", Angle);HAL_Delay(500);}/* USER CODE END 3 */
}
  • 🔖或者根据上面的寄存器,读取角度寄存器值:HAL_I2C_Mem_Read(&hi2c1, AS5600_SLAVE_ADDRESS, addr_in, I2C_MEMADD_SIZE_8BIT, 0x0e, 2,100);
  • 🌿开启串口打印,在usart.c中添加一下内容:(在调用printf的地方,包含stdio.h头文件,Keil option中勾选MicroLib选项)
#include <stdio.h>
//使用printf()发送数据,需要对printf函数进行重定向,且只能使用USART1。
// 重定向fputc函数,使用printf()发送数据
int fputc(int ch, FILE *f)
{// 参数1:串口句柄,参数2:要发送的数据;参数3:要发生数据的长度;参数4:超时等待时间HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 100);return ch;
}
  • 🔖串口输出:
    -在这里插入图片描述

📚HAL_I2C_Mem_Read(阻塞方式)读取测试工程

  • 🔖基于stm32f103
链接:https://pan.baidu.com/s/1aN1n26SNdVSn6Q1CcaKrgg?pwd=48ok 
提取码:48ok

📗HAL_I2C_Mem_Read_DMA和HAL_I2C_Mem_Read_IT方式读取数据

  • 🔧在STM32CubeMX中,配置I2C时,在DMA选项中,添加RX配置:
    在这里插入图片描述
  • 🌿勾选事件中断
    在这里插入图片描述
  • 🔖完成以上参数内容配置后,在工程代码中可以使用HAL_I2C_Mem_Read_DMAHAL_I2C_Mem_Read_IT函数都可以读取角度原始数据值。
  • 🌿添加读I2C设备是否在线函数。(可以省略,默认只查询一次。)
HAL_StatusTypeDef I2C_WaitUntilDeviceReady(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint32_t Timeout){uint32_t tickstart = HAL_GetTick();                 //获取当前时间while(HAL_GetTick()-tickstart <= Timeout){          //如果没有超时就一直尝试if(HAL_I2C_IsDeviceReady(&hi2c1, DevAddress,1, Timeout) == HAL_OK){   //如果准备好了就returnreturn HAL_OK;}}return HAL_TIMEOUT;                                 //否则return一个错误
}
  • 🌾main函数内容
int main(void)
{/* USER CODE BEGIN 1 */uint8_t Raw_num[2];// Read angular measurementsuint16_t Angle = 0;/* 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_DMA_Init();MX_I2C1_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */printf("Scanning I2C bus:\r\n");HAL_StatusTypeDef result;uint8_t i;for (i=1; i<128; i++){/** the HAL wants a left aligned i2c address* &hi2c1 is the handle* (uint16_t)(i<<1) is the i2c address left aligned* retries 2* timeout 2AS5600 i2c address:(0x6c = 0x36 << 1)*/result = HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(i<<1), 2, 2);if (result != HAL_OK) // HAL_ERROR or HAL_BUSY or HAL_TIMEOUT{printf("."); // No ACK received at that address}if (result == HAL_OK){printf("0x%X", i); // Received an ACK at that address}}printf("\r\n");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1) {/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(I2C_WaitUntilDeviceReady(&hi2c1,AS5600_SLAVE_ADDRESS, 5)==HAL_OK)//检测设备是否在线,设置5ms超时HAL_I2C_Mem_Read_DMA(&hi2c1, AS5600_SLAVE_ADDRESS, addr_in, I2C_MEMADD_SIZE_8BIT, Raw_num, 2);int value = (Raw_num[0]<<8)|Raw_num[1];Angle = (value * 360)/4096;//换算成角度printf("Angle = %d degrees.\n", Angle);HAL_Delay(500);}/* USER CODE END 3 */
}

这篇关于HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877546

相关文章

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动