【FOC控制】英飞凌TC264无刷驱动方案simplefoc移植(5)-磁编码器移植AS5600 软件IIC

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

【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适配无电机,可按以下方面进行操作: ### 硬件连接 - **电源连接**:为TC264开发板和无电机驱动器提供合适的电源。通常,TC264开发板使用5V或3.3V电源,而无电机驱动器可能需要更高的电压,如12V、24V等,要确保电源的稳定性和极性正确。 - **信号连接**:将TC264的PWM输出引脚连接到无电机驱动器的PWM输入引脚,用于控制电机的转速。同时,连接电机驱动器的反馈信号引脚(如霍尔传感器信号)到TC264的GPIO引脚,以便获取电机的位置和状态信息。 ### 软件编程 - **初始化PWM模块**:在TC264的代码中,初始化PWM模块并设置合适的频率和占空比。以下是一个简单的示例代码,使用Infineon的DAVE IDE进行PWM初始化: ```c #include <Ifx_Types.h> #include <IfxCpu.h> #include <IfxScuWdt.h> #include <IfxGtm_PwmHl.h> #define PWM_FREQUENCY 20000 // PWM频率为20kHz #define PWM_PERIOD (IFXCPU_CORE_FREQUENCY / PWM_FREQUENCY) IfxGtm_PwmHl pwmHandle; void initPwm(void) { IfxGtm_PwmHl_Config pwmConfig; IfxGtm_PwmHl_initModuleConfig(&pwmConfig, &MODULE_GTM); pwmConfig.base.frequency = PWM_FREQUENCY; pwmConfig.base.period = PWM_PERIOD; pwmConfig.base.dutyCycle = 0; // 初始占空比为0 IfxGtm_PwmHl_initModule(&pwmHandle, &pwmConfig); IfxGtm_PwmHl_start(&pwmHandle); } ``` - **读取霍尔传感器信号**:编写代码读取连接到TC264 GPIO引脚的霍尔传感器信号,以确定电机的位置和状态。根据霍尔传感器的输出,可以实现电机的换相控制。以下是一个简单的示例代码: ```c #include <IfxGpio.h> #define HALL_SENSOR_PIN_1 &MODULE_P00, 0 #define HALL_SENSOR_PIN_2 &MODULE_P00, 1 #define HALL_SENSOR_PIN_3 &MODULE_P00, 2 uint8_t readHallSensors(void) { uint8_t hallState = 0; if (IfxGpio_getPinState(HALL_SENSOR_PIN_1) == IFX_GPIO_PIN_STATE_HIGH) { hallState |= 0x01; } if (IfxGpio_getPinState(HALL_SENSOR_PIN_2) == IFX_GPIO_PIN_STATE_HIGH) { hallState |= 0x02; } if (IfxGpio_getPinState(HALL_SENSOR_PIN_3) == IFX_GPIO_PIN_STATE_HIGH) { hallState |= 0x04; } return hallState; } ``` - **实现换相控制**:根据霍尔传感器的信号,编写换相控制算法,通过改变PWM信号的输出顺序来控制电机的转动。换相控制算法通常基于电机的电气原理和霍尔传感器的输出逻辑。 ### 调试与优化 - **示波器检测**:使用示波器检测PWM信号和霍尔传感器信号的波形,确保信号的频率、占空比和时序符合要求。 - **电机测试**:逐步增加PWM信号的占空比,观察电机的转动情况。如果电机无法正常转动或出现异常噪音,检查硬件连接和软件代码是否存在问题。 - **参数调整**:根据电机的实际运行情况,调整PWM频率、占空比和换相控制算法的参数,以优化电机的性能。 ### 相关资料获取 - **官方文档**:逐飞科技的官方网站可能提供了TC264开发板的相关资料和教程,包括硬件手册、软件示例代码等。 - **社区论坛**:参与相关的嵌入式开发社区论坛,如ARM Cortex-M论坛、Infineon官方论坛等,与其他开发者交流经验和获取帮助。 - **电机驱动芯片手册**:查阅无电机驱动器的芯片手册,了解其工作原理、接口要求和控制方法。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值