STM32F103 CubeMX 使用IIC 控制 AS5600芯片读取角度信息
1. 硬件连接
MCU | 模块 | 功能 |
---|---|---|
3V3 | VCC | 3.3V 电源 |
GND | GND | 电源地 |
Out | PWM/模拟电压输出 | |
DIR | 旋转方向(接地=顺时针数值增加;接VCC=顺时针数值减小) | |
PB6 | SCL | IIC通信时钟线 |
PB7 | SDA | IIC通信数据线 |
GPO | 模式选择(内部上拉,接地=编程模式B) |
2. CubeMX生成代码
基本上配置情况就如图所示,时钟配置成了72M
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");
}
这个是读数据需要发送的内容,先发送地址,后开始读取数据
对特定地址写数据,就是下面的框图
这个是芯片内部的寄存器列表,以及对应的功能。
这里设备的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. 后记
磁铁需要买径向磁铁,如果不是的话,需要将磁铁竖在下面,才能正常读取到磁铁的信息。