Zen的小站

小舟从此逝,江海寄余生

0%

【模块】as5600

as5600 是磁编码器,一般用于电机测转速

简介

这个模块有三种读取方法,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

/*
注意:AS5600的地址0x36是指的是原始7位设备地址,而ST I2C库中的设备地址是指原始设备地址左移一位得到的设备地址
*/

#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 //12bit Resolution

#define AS5600_RAW_ANGLE_REGISTER 0x0C


void bsp_as5600Init(void);
uint16_t bsp_as5600GetRawAngle(void);
float bsp_as5600GetAngle(void);

#endif /* __BSP_AS5600_H */

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();

多想多做,发篇一作

-------------本文结束感谢您的阅读-------------
// 在最后添加