【FOC控制】英飞凌TC264无刷驱动方案simplefoc移植(6)- foc速度闭环控制

本文详细介绍了基于英飞凌TC264的三相无刷电机FOC(磁场定向控制)的移植过程,包括电机选择、电机参数初始化、FOC初始化、PID控制、主函数调用和速度闭环控制。通过电机的选择、零点偏移量和极对数检测,实现了电机稳定低速转动。同时,文章讨论了PID控制器的设置,以及如何在速度模式下进行闭环控制,确保电机的精确运行。最终,通过主函数调用move()和loopFOC()函数,实现了电机的动态控制。

【FOC控制】英飞凌TC264无刷驱动方案simplefoc移植(6)- foc速度闭环控制

一、电机选择

FOC可以实现电机在低速的时候,可以稳定的转动,为了适应编码器,我这里选择一款全新的三相无刷电机,云台电机,型号2804 ,无限位,可以360度连续运转,不带驱动板,运转时低功耗,DC24V时电流才60MA,转速是5050转,扭力还挺好的,静音,低功耗,适合长时间运转。

在这里插入图片描述极对数是7

在这里插入图片描述

二、电机参数初始化

首先设置必要的参数,供电电压12v,电压模式,速度模式

    voltage_power_supply=12;   //V
    voltage_limit=6;           //V,最大值需小于12/1.732=6.9
    velocity_limit=20;         //rad/s angleOpenloop() and PID_angle() use it
    voltage_sensor_align=1;    //V     alignSensor() and driverAlign() use it,大功率电机0.5-1,小功率电机2-3
    torque_controller=Type_voltage;  //当前只有电压模式
    controller=Type_velocity;  //Type_angle; //Type_torque;    //
    target=1;

电机初始化函数,配置电机极对数,我选用的电机极对数7,电机旋转的方向为不确定。

/******************************************************************************/
void Motor_init(void)
{
   
   
	printf("MOT: Init\r\n");
	
//	new_voltage_limit = current_limit * phase_resistance;
//	voltage_limit = new_voltage_limit < voltage_limit ? new_voltage_limit : voltage_limit;
	if(voltage_sensor_align > voltage_limit) voltage_sensor_align = voltage_limit;
	
	pole_pairs=7;
	sensor_direction=UNKNOWN;
	
	//M1_Enable;
	printf("MOT: Enable driver.\r\n");
}
/******************************************************************************/

三、FOC初始化

这是整个步骤最关键的一步,往往很多时候,错误都是卡在了这里 alignSensor();

/******************************************************************************/
void Motor_initFOC(void)
{
   
   
    alignSensor();    //检测零点偏移量和极对数

    //added the shaft_angle update
    angle_prev=as5600_getAngle();  //as5600_getVelocity(),make sure velocity=0 after power on
    systick_delay_ms(STM0,5);

    shaft_velocity = shaftVelocity();  //必须调用一次,进入主循环后速度为0
    systick_delay_ms(STM0,5);
    shaft_angle = shaftAngle();// shaft angle
    if(controller==Type_angle)target=shaft_angle;//角度模式,以当前的角度为目标角度,进入主循环后电机静止

    systick_delay_ms(STM0,200);
}

首先执行的函数为alignSensor( )
先使得,电机按照正弦规律转一定角度,记录中值角度
然后,电机按照正弦规律反方向转一定角度,记录终值角度
然后计算两次角度的差值,判断电机运动,进而判断电机方向和检测电机极对数
最后计算一次零点偏移角度,以后的角度都从当前角度开始算,
关闭电机。


/******************************************************************************/
int alignSensor(void)
{
   
   
    long i;
    float angle;
    float mid_angle,end_angle;
    float moved;

    printf("MOT: Align sensor.\r\n");

    // find natural direction
    // move one electrical revolution forward

    for(i=0; i<=500; i++)
    {
   
   
        angle = _3PI_2 + _2PI * i / 500.0;
        setPhaseVoltage(voltage_sensor_align, 0,  angle);
        systick_delay_ms(STM0,2);
    }

    mid_angle = (float)as5600_getAngle();

    for(i=500; i>=0; i--)
    {
   
   
        angle = _3PI_2 + _2PI * i / 500.0 ;
        setPhaseVoltage(voltage_sensor_align, 0,  angle);
        systick_delay_ms(STM0,2);
    }

    end_angle = (float)as5600_getAngle();
    setPhaseVoltage(0, 0, 0);
    systick_delay_ms(STM0,200);

    printf("mid_angle=%f\r\n",mid_angle);
    printf("end_angle=%f\r\n",end_angle);


    systick_delay_ms(STM0,200);

    moved =  fabs(mid_angle - end_angle);
    if((mid_angle == end_angle)||(moved < 0.02))  //相等或者几乎没有动
    {
   
   
        printf("MOT: Failed to notice movement loop222.\r\n");
        IfxCcu6_setT12CompareValue
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值