【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

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





