Skip to content

STM32F103 CubeMX 使用IIC 控制 AS5600芯片读取角度信息

1. 硬件连接

MCU模块功能
3V3VCC3.3V 电源
GNDGND电源地
OutPWM/模拟电压输出
DIR旋转方向(接地=顺时针数值增加;接VCC=顺时针数值减小)
PB6SCLIIC通信时钟线
PB7SDAIIC通信数据线
GPO模式选择(内部上拉,接地=编程模式B)

2. CubeMX生成代码

基本上配置情况就如图所示,时钟配置成了72M alt text

3. 编写代码

串口重定向 将串口的代码重新使用了printf来输出, 将串口的printf,转换成了hex来输出

C
#include <stdio.h>
 //重定向c库函数printf到串口USARTx,重定向后可使用printf函数
 int fputc(int ch, FILE *f)
 {
     /* 发送一个字节数据到串口USARTx */
     HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
     return (ch);
 }
 
 void ShowHex(uint8_t *buf,uint8_t len)
{
    uint8_t i;
    printf("hex = ");
    for( i = 0; i < len; i++){
        printf(" %02X",buf[i]); //使用前导0补齐
        //printf(" %2X",buf[i]);  //使用前导空格补齐
        //printf(" %X",buf[i]);  //输出最短的16进制格式
    }
    printf( "\r\n");
}

这个是读数据需要发送的内容,先发送地址,后开始读取数据

alt text

对特定地址写数据,就是下面的框图 alt text

这个是芯片内部的寄存器列表,以及对应的功能。 alt text

这里设备的7bit地址是:0x36,发送的数据有补上第八位 0x0c 是读数据的起始地址 I2C_MEMADD_SIZE_8BIT :单个的位数,有16和8两个,这个取决于设备的位数,常见的都是8位 I2C_Buffer_Read :是一个数组的地址,也是C中的指针地址,函数会将这个地址给到相关的值。 4:一次读取的位数 50:表示等待的延时,通讯不稳定的时候会有影响。

后面的jiaodu就是将读取到的数据,进行计算,得到相关的角度信息。

C
  while (1)
  {
      uint16_t jiaodu = 0;
      uint8_t I2C_Buffer_Read[4] ={0};
      HAL_I2C_Mem_Read(&hi2c1, 0x6c,0x0C,I2C_MEMADD_SIZE_8BIT,I2C_Buffer_Read,4,50);
      //12位的数据处理成 角度数据
         jiaodu = I2C_Buffer_Read[0] << 8;
        jiaodu = jiaodu | I2C_Buffer_Read[1];
        jiaodu = jiaodu * 0.08789;
      printf("%u,",jiaodu);
     // ShowHex(I2C_Buffer_Read,4);
      HAL_Delay(50);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

4. 后记

磁铁需要买径向磁铁,如果不是的话,需要将磁铁竖在下面,才能正常读取到磁铁的信息。