【FOC控制】英飞凌TC264无刷驱动方案simplefoc移植(5)-磁编码器移植
经过测试发现霍尔编码器的效果不太行,因为霍尔编码器读到的角度是离散的,导致由角度算得的速度也是离散的,二使用simplefoc最关键的数据就是角度和速度,所以我决定使用磁编码器完成下面的操作。

关于霍尔编码器的移植可以参考我之前的文章
一、【FOC控制】英飞凌TC264无刷驱动方案simplefoc移植(1)-霍尔编码器移植
二、 逐飞科技TC264开源库
一、编码器选择
这里选用的一款常见的磁编码器,这款编码器在simplefoc的库中,arduino中比较常见。

引脚图
引脚含义
二、通讯方式 I²C接口
AS5600支持双线快速模式加I²C-slave
AS5600始终作为I²C总线上的从设备运行。通过开路漏极I/O连接到总线SDA和输入SC
主机MCU(主)启动数据传输,AS5600的地址是0x36(二进制的,0110110)。

三、TC264测试全部程序
3-1初始化定义
宏定义数据:
包括设备的地址,磁编码器的线数,角度寄存器的高位,角度寄存器的低位。
全局变量:
调用所需的函数:
/******************************************************************************/
#define Slave_Addr 0x36
#define AS5600_CPR 4096
#define RAW_Angle_Hi 0x0C
#define RAW_Angle_Lo 0x0D
/******************************************************************************/
extern long cpr; //电机极对数
extern float full_rotation_offset;//周期角度 圈数
extern long _angle_data_prev;// 更新角度时的前一次角度数据
extern unsigned long velocity_calc_timestamp;//前一次计算的速度的时刻
extern float _angle_prev;//更新速度时的前一次角度
/******************************************************************************/
void AS5600_Init ( void );
float as5600_getAngle(void);
float as5600_getVelocity(void);
/******************************************************************************/
3-2初始化函数
iic总线初始化,这里使用的软件iic初始化,软件iic的程序在展示。
清除圈数和角度数据
void AS5600_Init ( void )
{
IIC_Init();
_angle_data_prev = 0;
full_rotation_offset = 0;
velocity_calc_timestamp=0;
cpr=AS5600_CPR;
}
3-3 as5600原始数据读取
读取原始数据的时候,直接读取从设备中寄存器中的数据,寄存器的地址 RAW_Angle_Hi 0x0C RAW_Angle_Low 0x0D
因为iic总线一次读的数据是八位的,而实际的角度数据是一个十六位的数据,所以我们只需要读取两次iic总线的数据,然后通过移位加或的操作(dh<<8)+dl就可以得到原始数据了。
/***************************************************************************/
uint8 AS5600_ReadOneByte(uint8 addr)
{
uint8 temp;
IIC_Start();
IIC_SendByte(Slave_Addr<<1);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte((Slave_Addr<<1)+1);
IIC_WaitAck();
temp=IIC_ReadByte(0);
IIC_Stop();
return temp;
}
/***************************************************************************/
uint16 AS5600_ReadRawAngleTwo(void)
{
uint8 dh,dl;
IIC_Start();
IIC_SendByte(Slave_Addr<<1);
IIC_WaitAck();
IIC_SendByte(RAW_Angle_Hi);
IIC_WaitAck();
IIC_Start();
IIC_SendByte((Slave_Addr<<1)+1);
IIC_WaitAck();
dh=IIC_ReadByte(1); //1-ack for next byte
dl=IIC_ReadByte(0); //0-end trans
IIC_Stop();
return ((dh<<8)+dl);
}
/***************************************************************************/
3-5角度解算
角度解算的逻辑是,先读取编码器原始数据,然后计算角度的变化量,如果角度的变化量fabs(d_angle) > (0.8*cpr),那么这个时候就认为磁编码器又转过了一圈。
磁编码器一般为增量式编码器,即从0->4096->0,会有一个4096的跳变,二计算角度需要将这个变化检测出来。
最后就是通过计算得出角度,注意此时的单位为弧度!!!!
/******************************************************************************/
float as5600_getAngle(void)
{
float angle_data,d_angle;
float return_speed;
angle_data = AS5600_ReadRawAngleTwo();
// tracking the number of rotations
// in order to expand angle range form [0,2PI] to basically infinity
d_angle = angle_data - _angle_data_prev;
// if overflow happened track it as full rotation
if(fabs(d_angle) > (0.8*cpr) ) full_rotation_offset += d_angle > 0 ? -_2PI : _2PI;
// save the current angle value for the next steps
// in order to know if overflow happened
_angle_data_prev = angle_data;
// return the full angle
// (number of full rotations)*2PI + current sensor angle
// printf ( "angle:%0.2f,%0.2f, ", angle_data,d_angle);
return_speed = (full_rotation_offset + (( angle_data / (

本文详细介绍了如何在英飞凌TC264平台上移植和使用磁编码器AS5600进行FOC控制。内容涵盖编码器选择、I²C通讯、初始化程序、角度和速度解算,以及软件IIC的实现。通过磁编码器替代霍尔编码器以提高角度和速度的连续性,从而优化FOC控制效果。
最低0.47元/天 解锁文章
2023

被折叠的 条评论
为什么被折叠?



