HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程
- 📍相关篇《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