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

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


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

📑功能概要

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

🛠STM32CubeMX工程配置

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

在这里插入图片描述

📙业务代码完善

  • 📄main函数内容:
int main(void)
{

  /* USER CODE BEGIN 1 */

	uint8_t Raw_num[2];
    // Read angular measurements
    uint16_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 2
		AS5600 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 */
}
  • 🌿开启串口打印,在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;
}
  • 🔖串口输出:
    -在这里插入图片描述

📚测试工程

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

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-31 06:22:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-31 06:22:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-31 06:22:07       87 阅读
  4. Python语言-面向对象

    2024-03-31 06:22:07       96 阅读

热门阅读

  1. EXCEL VBA 多sheet批量转转PDF

    2024-03-31 06:22:07       34 阅读
  2. 简单图论的知识

    2024-03-31 06:22:07       32 阅读
  3. Docker 搭建 Blockbridge

    2024-03-31 06:22:07       41 阅读
  4. 【软考】防火墙技术

    2024-03-31 06:22:07       36 阅读
  5. 【阅读笔记】《克拉克森的农场》

    2024-03-31 06:22:07       32 阅读
  6. Linux下使用vim文本编辑器

    2024-03-31 06:22:07       32 阅读
  7. ChatGPT指引:借助ChatGPT撰写学术论文的技巧

    2024-03-31 06:22:07       34 阅读
  8. ajax的优缺点有哪些?

    2024-03-31 06:22:07       38 阅读