简介
这个模块有三种读取方法,adc、pwm、i2c,但是我只搞出来了一种,i2c
使用方法就是在上面放一个扁平的磁铁,旋转,这里数值就会相应增大或减小
代码
as5600.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #ifndef __AS5600_H__ #define __AS5600_H__
#include "i2c.h"
#define AS5600_I2C_HANDLE hi2c1
#define I2C_TIME_OUT_BASE 10 #define I2C_TIME_OUT_BYTE 1
#define AS5600_RAW_ADDR 0x36 #define AS5600_ADDR (AS5600_RAW_ADDR << 1) #define AS5600_WRITE_ADDR (AS5600_RAW_ADDR << 1) #define AS5600_READ_ADDR ((AS5600_RAW_ADDR << 1) | 1)
#define AS5600_RESOLUTION 4096
#define AS5600_RAW_ANGLE_REGISTER 0x0C
void bsp_as5600Init(void); uint16_t bsp_as5600GetRawAngle(void); float bsp_as5600GetAngle(void);
#endif
|
as5600.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include "bsp_as5600.h"
#define abs(x) ((x)>0?(x):-(x)) #define _2PI 6.28318530718
static float angle_data_prev; //上次位置 static float full_rotation_offset; //转过的整圈数
void bsp_as5600Init(void) { /* init i2c interface */ /* init var */ full_rotation_offset = 0; angle_data_prev = bsp_as5600GetRawAngle(); }
static int i2cWrite(uint8_t dev_addr, uint8_t *pData, uint32_t count) { int status; int i2c_time_out = I2C_TIME_OUT_BASE + count * I2C_TIME_OUT_BYTE; status = HAL_I2C_Master_Transmit(&AS5600_I2C_HANDLE, dev_addr, pData, count, i2c_time_out); return status; }
static int i2cRead(uint8_t dev_addr, uint8_t *pData, uint32_t count) { int status; int i2c_time_out = I2C_TIME_OUT_BASE + count * I2C_TIME_OUT_BYTE; status = HAL_I2C_Master_Receive(&AS5600_I2C_HANDLE, (dev_addr | 1), pData, count, i2c_time_out); return status; }
uint16_t bsp_as5600GetRawAngle(void) { uint16_t raw_angle; uint8_t buffer[2] = {0}; uint8_t raw_angle_register = AS5600_RAW_ANGLE_REGISTER; i2cWrite(AS5600_ADDR, &raw_angle_register, 1); i2cRead(AS5600_ADDR, buffer, 2); raw_angle = ((uint16_t)buffer[0] << 8) | (uint16_t)buffer[1]; return raw_angle; }
float bsp_as5600GetAngle(void) { float angle_data = bsp_as5600GetRawAngle(); float d_angle = angle_data - angle_data_prev; if(abs(d_angle) > (0.8 * AS5600_RESOLUTION)) { full_rotation_offset += (d_angle > 0 ? -_2PI : _2PI); } angle_data_prev = angle_data; return (full_rotation_offset + (angle_data / (float)AS5600_RESOLUTION)*_2PI); }
|
使用
初始化 bsp_as5600Init();
读取角度 angle = bsp_as5600GetAngle();
多想多做,发篇一作