2.62 AS5600 磁性编码器模块(来自 W 的贡献)
2.62.1 模块来源
采购链接: https://m.tb.cn/h.54IVjIZ?tk=KnfpdA3exND 资料下载:(基于该模块的资料,百度云链接等) 链接:https://pan.baidu.com/s/1QGhOSZKCzpOejOFSlV5NPQ?pwd=aefv 提取码:aefv
**实物展示图**2.62.2 规格参数
工作电压:3.3v-5v工作电流:6.5mA通信方式:IIC、PWM引脚数量:7 Pin(2.54mm 间距排针)其余外设:径向磁铁
相关数据手册
2.62.3 模块原理
AS5600 磁编码器内部包含一个磁场传感器和一个磁场发生器。磁场发生器产生一个磁场,而磁场传感器检测磁场的变化。当磁场发生器旋转或移动时,磁场传感器会检测到磁场的变化,并将其转换为电信号输出。通过对这些电信号进行处理,可以确定磁场发生器的位置,从而确定旋转角度或线性位移。
2.62.4 移植工程
本次工程基于梁山派基本工程模板,使用 IIC 通信实现读取磁铁旋转角度的功能。
2.62.4.2 移植步骤
IIC 通信头文件及宏文件定义
根据 IIC 通信模板,在 bsp_IIC.c 文件中添加如下代码
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频240Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: 普烈
* 修改日期: 2023年09月19日
* 功能介绍: 移植AS5600磁性编码器模块
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
//bsp_IIC.c文件
#include "bsp_IIC.h"
#include "systick.h"
#include "bsp_usart.h"
/******************************************************************
* 函 数 名 称:iic_gpio_config
* 函 数 说 明:初始化IIC通信
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:立创开发板
* 备 注:无
******************************************************************/
void iic_gpio_config(void)
{
/* 使能时钟 */
rcu_periph_clock_enable(RCU_SCL);
rcu_periph_clock_enable(RCU_SDA);
/* 配置SCL为输出模式 */
gpio_mode_set(PORT_SCL,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_SCL);
/* 配置为开漏输出 50MHZ */
gpio_output_options_set(PORT_SCL,GPIO_OTYPE_OD,GPIO_OSPEED_50MHZ,GPIO_SCL);
/* 配置SDA为输出模式 */
gpio_mode_set(PORT_SDA,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_SDA);
/* 配置为开漏输出 50MHZ */
gpio_output_options_set(PORT_SDA,GPIO_OTYPE_OD,GPIO_OSPEED_50MHZ,GPIO_SDA);
}
/******************************************************************
* 函 数 名 称:IIC_Start
* 函 数 说 明:发送一个IIC起始信号
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:立创开发板
* 备 注:无
******************************************************************/
void IIC_Start(void)
{
SDA_OUT();//设置SDA为输出模式
SDA(1);
SCL(1);
delay_us(5);
SDA(0);
delay_us(5);
SCL(0);
delay_us(5);
}
/******************************************************************
* 函 数 名 称:IIC_Stop
* 函 数 说 明:发送一个IIC结束信号
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:立创开发板
* 备 注:无
******************************************************************/
void IIC_Stop(void)
{
SDA_OUT();
SCL(0);
SDA(0);
SCL(1);
delay_us(5);
SDA(1);
delay_us(5);
}
/******************************************************************
* 函 数 名 称:IIC_Send_Ack
* 函 数 说 明:发送一个IIC应答信号
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:立创开发板
* 备 注:无
******************************************************************/
void IIC_Send_Ack(void)
{
SDA_OUT();
SCL(0);
SDA(1);
SDA(0);
SCL(1);
delay_us(5);
SCL(0);
SDA(1);
}
/******************************************************************
* 函 数 名 称:IIC_Send_Nack
* 函 数 说 明:发送一个IIC非应答信号
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:立创开发板
* 备 注:无
******************************************************************/
void IIC_Send_Nack(void)
{
SDA_OUT();
SCL(0);
SDA(0);
SDA(1);
SCL(1);
delay_us(5);
SCL(0);
SDA(0);
}
/******************************************************************
* 函 数 名 称:IIC_Wait_Ack
* 函 数 说 明:发送一个IIC等待应答信号
* 函 数 形 参:无
* 函 数 返 回:应答返回0 非应答返回1
* 作 者:立创开发板
* 备 注:无
******************************************************************/
unsigned char IIC_Wait_Ack(void)
{
char ack = 0;
unsigned char ack_flag = 10;
SCL(0);
SDA(1);
SDA_IN();
delay_us(5);
SCL(1);
delay_us(5);
while( (SDA_GET()==1) && ( ack_flag ) )
{
ack_flag--;
delay_us(5);
}
//非应答
if( ack_flag <= 0 )
{
IIC_Stop();
return 1;
}
else//应答
{
SCL(0);
SDA_OUT();
}
return ack;
}
/******************************************************************
* 函 数 名 称:IIC_Send_Byte
* 函 数 说 明:通过IIC发送一个字节
* 函 数 形 参:一个8位字节
* 函 数 返 回:无
* 作 者:立创开发板
* 备 注:无
******************************************************************/
//发送一个字节
void IIC_Send_Byte(uint8_t dat)
{
int i = 0;
SDA_OUT();
SCL(0);
for( i = 0; i < 8; i++ )
{
SDA( (dat & 0x80) >> 7 );
delay_us(1);
SCL(1);
delay_us(5);
SCL(0);
delay_us(5);
dat<<=1;
}
}
/******************************************************************
* 函 数 名 称:IIC_Read_Byte
* 函 数 说 明:接收一个字节
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:立创开发板
* 备 注:无
******************************************************************/
unsigned char IIC_Read_Byte(void)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
SCL(0);
delay_us(5);
SCL(1);
delay_us(5);
receive<<=1;
if( SDA_GET() )
{
receive |= 1;
}
}
SCL(0);
return receive;
}
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
在 bsp_IIC.h 文件中添加如下代码
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频240Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: 普烈
* 修改日期: 2023年09月19日
* 功能介绍: 移植AS5600磁性编码器模块
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
//bsp_IIC.h 宏定义文件
#ifndef _BSP_IIC_H
#define _BSP_IIC_H
#include "gd32f4xx.h"
#include "systick.h"
//SDA端口移植
#define RCU_SDA RCU_GPIOB
#define PORT_SDA GPIOB
#define GPIO_SDA GPIO_PIN_9
//SCL端口移植
#define RCU_SCL RCU_GPIOB
#define PORT_SCL GPIOB
#define GPIO_SCL GPIO_PIN_8
//设置SDA输出模式
#define SDA_OUT() gpio_mode_set(PORT_SDA,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_SDA)
//设置SDA输入模式
#define SDA_IN() gpio_mode_set(PORT_SDA,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_SDA)
//获取SDA引脚的电平变化
#define SDA_GET() gpio_input_bit_get(PORT_SDA,GPIO_SDA)
//SDA与SCL输出
#define SDA(x) gpio_bit_write(PORT_SDA,GPIO_SDA, (x?SET:RESET) )
#define SCL(x) gpio_bit_write(PORT_SCL,GPIO_SCL, (x?SET:RESET) )
void iic_gpio_config(void);
void AS5600_receive_data(void);
#endif
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
** 阅读手册,确定通信方式**
根据官方手册 P17,可以看到读取数据的通信方式如下
总结一下与传感器端和梁山派之间数据传输的顺序:
1:梁山派发送一个起始信号;传感器接收到一个起始信号;
2、3:梁山派向传感器的通信地址 0110110 写入一个 0,写作 10 进制为 0x36<<1;传感器接收到这个值;
4:梁山派等待接收传感器的应答信号;传感器接收到值后发送一个应答信号;
5:梁山派向传感器发送需要读取的储存器地址 0x0c,具体参考手册第 18 页;
6:梁山派发送地址之后,等待传感器应答;传感器接收到储存器地址之后,发送一个应答信号;
7:梁山派重新发送一个起始信号;传感器等待接收下一个起始信号;
8、9:梁山派向传感器的通信地址 0110110 写入一个 1,写作 10 进制为(0x36<<1)+1;传感器接收这个值
10:梁山派等待接收传感器的应答信号;传感器接收到值后发送一个应答信号;
11:梁山派接收传感器数据;传感器发送角度储存器中的数据;
12:梁山派接收数据后发送一个应答信号;传感器接收到应答信号后发送下一个数据;
......
15:最后一个数据传输完毕后,传感器会发送一个非应答信号;梁山派终止通信
编写代码,完成数据读取函数
在 bsp_IIC.c 文件中添加以下函数,并在 bsp_IIC.h 中进行宏定义
/******************************************************************
* 函 数 名 称:AS5600_receive_data
* 函 数 说 明:与设备进行连接,接收一串数据
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:普烈
* 备 注:无
******************************************************************/
void AS5600_receive_data(void)
{
uint8_t data_msb = 0;
uint8_t data_lsb = 0;
uint8_t ck = 0;
uint16_t data = 0;
IIC_Start();//1:发送起始信号
IIC_Send_Byte(0x36<<1); // 2、3:梁山派向传感器的通信地址0110110写入一个0
IIC_Wait_Ack(); // 4:梁山派等待接收传感器的应答信号
IIC_Send_Byte(0x0c); // 5:梁山派向传感器发送需要读取的储存器地址0x0c
IIC_Wait_Ack(); // 6:梁山派发送地址之后,等待传感器应答;
IIC_Start(); // 7:梁山派重新发送一个起始信号;
IIC_Send_Byte((0x36<<1)+1); // 8、9:梁山派向传感器的通信地址0110110写入一个1
IIC_Wait_Ack(); // 10:梁山派等待接收传感器的应答信号;
/*
AS5600的角度信息在传输时会将数据分为高位、低位传输,所以角度信息需要读取两次
在传输完角度信息之后,会再发送一个校验位,所以需要再读取一次
*/
data_msb = IIC_Read_Byte();// 读取第一个字节:角度数据高位
IIC_Send_Ack(); // 发送应答
data_lsb = IIC_Read_Byte();// 读取第二个字节:角度数据低位
IIC_Send_Ack(); // 发送应答
ck = IIC_Read_Byte(); // 读取第三个字节:校验位
IIC_Stop(); // 停止通信
// 将高位字符左移8位后加上低位字符,组合成完整角度信息
data = (data_msb<<8)+data_lsb;
// 因为AS5600的精度是12位,所以传感器传输的值范围为0-4095
// 所以将 data/4095.0*360.0 得到0-360的角度信息
printf("data:%.4f\r\n",data/4095.0*360.0);
}
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
2.62.5 移植验证
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频240Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: 普烈
* 修改日期: 2023年09月19日
* 功能介绍: 移植AS5600磁性编码器模块
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "bsp_led.h"
#include "sys.h"
#include "bsp_usart.h"
#include "bsp_key.h"
#include "bsp_base_timer.h"
#include "bsp_pwm.h"
#include "stdlib.h"
#include "string.h"
#include "bsp_IIC.h"
/*!
\brief toggle the led every 500ms
\param[in] none
\param[out] none
\retval none
*/
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
systick_config(); // 初始化时钟
usart_gpio_config(115200U); // 初始化串口通信
iic_gpio_config(); // 初始化IIC通信
delay_1ms(100); // 等待100ms,等待通信完成初始化
while(1) {
AS5600_receive_data(); // 调用函数
delay_1ms(100); // 等待100ms
}
}
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
56
57
案例现象:
打开串口检测软件,当磁铁顺时针旋转时,角度数值增大,逆时针旋转时角度数值减小。
PS:视频中旋转的是带有径向磁铁的电机,为保证数据准确,请保证磁铁与编码器的位置相对固定。
移植成功示例工程,见下方文件 。