STM32 FOC 电机启动问题

最近STM32 SDK5.3控制电机,有时启动不了,电流很大就是不转动,电机内部嗡嗡的响,用手也转不动。然后断电用手轻轻转动一点 再上电又能正常运转 。如果启动之后,只要不断电控制正反转或停止/启动都正常 ,断电之后再次启动可能就不转了,电流很大(还好我用了限流3A的电源,不然很容易烧掉)。

以下是启动失败后的电流波形,电流到了最大值

img

以下是正常启动后的电流波形,电流正常

img

既然只是上电第一次启动时出现这个问题,检查你的启动控制是不是有问题(或者电机的启动)

该回答通过自己思路及引用到各个渠道搜索综合及思考,得到内容具体如下:

这种情况可能是由于电机的起始转矩较高导致的。在电机启动时,电流会突然增加,以克服电机静止状态下的惯性,这可能会导致过大的电流,导致电机无法正常启动。电机嗡嗡的响声可能是由于电机转子被卡住,无法转动。

您可以尝试以下方法来解决这个问题:

1. 增加启动电流斜升时间: 在启动时,逐渐增加电流来减少电机的起始转矩。可以通过增加启动电流的斜升时间来实现。在STM32的FOC库中,可以通过修改电机参数结构体中的电流斜升时间参数来实现。

2. 调整PID参数:PID控制器的参数对电机启动和运行的效果有很大的影响。调整PID控制器的参数,以适应电机的启动和运行,可以提高电机的启动和运行效率。

3. 检查电机和电源:检查电机是否存在损坏或过热等问题。同时,确保电源电压和电流足够大,以支持电机的启动和运行。

4. 检查编码器和霍尔传感器:编码器和霍尔传感器的正确安装和配置对电机的启动和运行至关重要。请确保它们已正确安装和配置。

5. 调整启动模式:在STM32的FOC库中,有多种启动模式可供选择。根据您的应用场景,选择最合适的启动模式,以提高电机的启动效率。

希望以上方法能够帮助您解决问题。

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

该回答引用ChatGPT
从问题描述和波形图看,启动失败后的电机电流持续不断,而正常启动后的电机电流明显有速度控制的规律,应该是启动阶段出现了问题。

根据电路方案和代码的实现情况,可能存在以下原因:

1. 电机启动的起始位置不正确:当电机的转子在某些特定位置时,电机线圈的电流可能很大,这可能导致启动失败。因此,在启动之前,需要确保电机的起始位置正确,并在启动时控制转矩和电流。可以使用霍尔传感器或编码器来获取电机的位置信息。

2. 启动时电流过大:启动阶段的电流往往比运行阶段的电流大得多,因为运行时电机已经旋转,而启动时需要克服静摩擦和惯性等阻力。如果过早的应用高电压或者较大的电流,则可能会烧坏电机或者电机驱动器。

3. PID参数不正确:PID控制器是FOC控制中的核心,它用来根据实时反馈进行调节以控制电机的速度和位置。PID参数不正确会导致启动困难或运行不稳定。需要对PID参数进行调试以获得更好的稳态性和过渡性能。

4. 系统响应速度不够快:在启动和运行电机时,需要快速响应系统的变化,以确保控制精度和运行效率。如果控制器响应速度过慢,则可能导致启动失败或电机运行不稳定。需要确保控制器具有足够的计算能力和速度。

以下是FOC控制的C代码的示例,用来展示如何控制电机的速度并解决启动问题:

c
// FOC控制示例代码
#define PWM_RES 12 // PWM分辨率
#define PWM_FREQ 20000 // PWM频率
#define VOLTAGE_LIMIT 24.0 // 电压限制
#define CURRENT_LIMIT 5.0 // 电流限制
#define MOTOR_POLES 8 // 电机极数
#define MOTOR_RES 0.01 // 电机内阻
#define PID_KP 12.0 // PID控制器P参数
#define PID_KI 0.8 // PID控制器I参数
#define PID_KD 5.0 // PID控制器D参数

float torque = 0.0; // 转矩值
float speed = 0.0; // 电机速度
float current = 0.0; // 电机电流
float voltage = 0.0; // 电机电压
float pid_target = 100.0; // PID控制目标(速度)
float pid_error = 0.0; // PID控制误差
float pid_derivative = 0.0; // PID控制微分项
float pid_integral = 0.0; // PID控制积分项
float pid_output = 0.0; // PID控制输出
float position = 0.0; // 电机位置
float phase = 0.0; // 电机电位角
float angle = 0.0; // 电机转子角度

// 初始化FOC控制器
void FOC_Init(){
// 初始化PWM输出和ADC输入
// ...

// 初始化PID控制器
PID_Init(PID_KP, PID_KI, PID_KD, PWM_FREQ);

// 初始化霍尔传感器或编码器
// ...
}

// 执行FOC控制
void FOC_Control(){
// 获取电机位置和电位角
position = Get_Position();
phase = position / (2 * PI);

// 获取电机转子角度
angle = Get_Angle();

// 计算电机速度
speed = Get_Speed(angle);

// 执行PID控制
pid_error = pid_target - speed;
pid_derivative = PID_Derivative(pid_error);
pid_integral = PID_Integral(pid_error);
pid_output = PID_Output(pid_error, pid_derivative, pid_integral);

// 计算电机转矩
torque = pid_output;

// 计算电机电流
current = torque / (MOTOR_POLES * MOTOR_RES);

// 检查电流是否达到限制
if (current > CURRENT_LIMIT){
current = CURRENT_LIMIT;
}

// 计算电机电压
voltage = current * MOTOR_RES * MOTOR_POLES;

// 检查电压是否达到限制
if (voltage > VOLTAGE_LIMIT){
voltage = VOLTAGE_LIMIT;
}

// 控制PWM输出
Set_PWM(voltage);
}


上述代码中,PID控制器被用于调节电机的速度,从而动态地控制转矩和电流。典型的PID控制器通常包括三个部分:比例项(P项)、积分项(I项)和微分项(D项),它们分别用于响应系统的稳态、过渡和振荡特性。PID控制器的输出通常被用作电机的控制量,如电压或电流。

此外,代码还需要实现霍尔传感器或编码器用于获取电机的位置信息,并计算电机的速度和转子角度。在启动阶段,需要确保电机处于正确的起始位置,并逐渐增加电压和电流,以克服关键摩擦力和惯性等。

最后需要注意,FOC控制是一项复杂的技术,需要掌握电机结构、控制算法和电路设计等多个方面的知识。在实际应用中,需要认真分析问题,并适时进行实验和调试,以获得最佳的控制效果。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个问题可能是因为电机的初始位置问题导致的,一旦初始位置不正确,电机将无法启动。

建议您进行如下尝试:

  1. 检查电机的机械结构,以确保电机轴与传感器轴对齐且转子无阻碍。通过手动插入电机轴来检查机械结构的正确性。

  2. 检查您的编码器或霍尔传感器的接线,并确保它们与您的代码实现相匹配。也请确保您的电机模型与电机实际参数匹配。

  3. 尝试增加函数motor_start()的最大旋转速度的时间值,如PI_PARAM_MAX_MECH_RPM, 这将确保在规定的时间内将电机高速旋转到正确的机械位置。在初始化时,增加启动反转延迟。例如:

motor_pwm_n_set_duty(dutycycle);
delay_us(start_delay); //请根据您的实际应用而调整
motor_pwm_n_set_duty(-dutycycle);
  1. 或者在开始启动电机后检查get_el_angle()get_mec_angle()(在beta.html中查找)的值,以确保它们在特定时间内增加。

  2. 检查软件中是否存在错误以及任何其他问题。

希望这些解答对您有所帮助,要详细的代码,请告诉我您使用的是哪个电机驱动库。
如果我的回答解决了您的问题,请采纳!

  1. 你的电角度计算是怎样计算的,电角度就算不对,合成的力矩角度就不对,这样的话很容易就出现你的那种现象!

  2. 推荐你阅读下我之前整理的foc的几篇博客吧,肯定对你有一定的帮助,欢迎交流!

  3. 心机吃不了热豆腐,只有真正弄懂了才能快速解决问题!

以下内容部分参考ChatGPT模型:

首先,这种情况有可能是由于电机内部出现故障导致的。建议先检查电机是否有损坏或者接触不良的情况。

另外,也有可能是控制程序的问题。建议检查程序中是否存在以下情况:

  1. 启动时没有正确初始化电机控制器,导致电机无法正常启动。
  2. 控制程序中存在死区(Deadzone),导致电机无法启动或者启动困难。
  3. 控制程序中存在误差过大的情况,导致电机无法启动或者启动困难。

具体解决思路可以参考以下步骤:

  1. 检查电机是否有损坏或者接触不良的情况。
  2. 确认控制程序中是否正确初始化电机控制器,并检查是否存在死区或误差过大的情况。
  3. 如果有问题,可以逐步排查和修改程序,重新测试电机启动情况。

以下是一些可能有用的代码示例:

  1. 初始化电机控制器:
void motor_init(void)
{
  // 初始化 GPIO 和定时器等硬件
  // 设置 PWM 周期和占空比等参数
  // 启动定时器
}
  1. 检查死区:
void motor_control(int speed)
{
  // 根据速度计算 PWM 占空比
  // 如果 PWM 占空比小于死区,设置为死区
  // 更新 PWM 输出
}
  1. 检查误差过大:
void motor_control(int speed)
{
  // 根据速度计算 PWM 占空比
  // 如果 PWM 占空比与上一次的差值过大,设置为上一次的值加上最大变化量
  // 更新 PWM 输出
}
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^