【动手学电机驱动】STM32-FOC(9)无感 FOC 电机转速调节

STM32-FOC(1)STM32 电机控制的软件开发环境
STM32-FOC(2)STM32 导入和创建项目
STM32-FOC(3)STM32 三路互补 PWM 输出
STM32-FOC(4)IHM03 电机控制套件介绍
STM32-FOC(5)基于 IHM03 的无感方波控制
STM32-FOC(6)基于 IHM03 的无感FOC 控制
STM32-FOC(7)MCSDK Pilot 上位机控制与调试
STM32-FOC(8)MCSDK Profiler 电机参数辨识
STM32-FOC(9)无感 FOC 电机转速调节

【动手学电机驱动】STM32-FOC(9)无感 FOC 电机转速调节

    • [1. 开发环境](#1. 开发环境)
    • [2. 硬件连接与快速运行](#2. 硬件连接与快速运行)
    • [3. 无感 FOC 转速调节程序开发](#3. 无感 FOC 转速调节程序开发)
      • [3.1 配置电机控制包](#3.1 配置电机控制包)
      • [3.2 图形化配置](#3.2 图形化配置)
      • [3.3 代码编辑、编译与调试](#3.3 代码编辑、编译与调试)
      • [3.4 上位机监控](#3.4 上位机监控)
    • [4. API 函数说明](#4. API 函数说明)
      • [4.1 电机启动函数 MC_StartMotor1](#4.1 电机启动函数 MC_StartMotor1)
      • [4.2 电机停止函数 MC_StopMotor1](#4.2 电机停止函数 MC_StopMotor1)
      • [4.3 电机调速函数 MC_ProgramSpeedRampMotor1](#4.3 电机调速函数 MC_ProgramSpeedRampMotor1)

此前我们已经学习了 STM32G4 MCU 编程的基本操作,实现了 3路互补带死区 PWM波的生成。

P-NUCLEO-IHM03 STM32电机控制套件使用FOC算法,为三相、低压和低电流的 BLDC 或 PMSM 电机提供电机控制解决方案。

本节从 STM32 电机控制包配置开始,在基于 IHM03 电机控制套件的无感 FOC 电机控制基础上,介绍使用 API 对电机进行调速,转速在 500 ~ 1000RPM 切换。

1. 开发环境

  1. 硬件要求
  • Windows PC
  • X-NUCLEO-IHM16M1 电机驱动扩展板
  • STM32 Nucleo 开发板
  • 直流电源,输出电压 12 VDC
  • 三相直流无刷电机
  • USB Type-A 或 Type-c 至 Micro-B 连接线缆
  1. 系统要求:
  • Windows 操作系统(Windows 7、Windows 8 和 Windows 10)、Linux 64-bit 或 macOS
  • USB Type-A 或 Type-c 至 Micro-B 连接线缆,用于将STM32 Nucleo板连接到 PC
  1. 开发工具
  • STM32 电机控制 SDK:X-CUBE-MCSDK
  • STM32 图形化配置工具:STM32CubeMX
  • 集成开发环境 IDE,可以选择一下三者之一:
    • STM32 集成开发环境(STM32CubeIDE)
    • Keil 开发套件(MDK-ARM-STR)
    • IAR 嵌入式开发环境(IAR-EWARM)

2. 硬件连接与快速运行

  1. X-NUCLEO-IHM16M1 电机驱动板必须通过位于两侧的 CN7 和 CN10 连接器插接到 NUCLEO-G431RB 控制板上, 堆叠如下图所示。

    NUCLEO-G431RB 板上的两个按钮(蓝色用户按钮B1和黑色重置按钮B2)必须保持未覆盖状态。

  2. 将三条电机线 U、V、W 连接到 X-NUCLEO-IHM16M1 电机驱动板上的 CN1连接器。

  3. 配置 NUCLEO-G431RB 控制板上的跳线:

  • 从 USB 为 NUCLEO-G431RB 供电时,要将JP5 的 5V-STLK 源设为 [1-2] 位置(跳线安装在 pin1、pin2 针脚);
  • JP8 的 VREF 设为 [1-1] 位置(跳线安装在 pin1、pin1 针脚);
  • JP6(IDD)设为 ON 状态(安装 2针跳线)。
  1. 配置控制板和驱动板的跳线,以选择所需的控制算法(如六步方波):
    NUCLEO-IHM16M1 电机驱动板的跳线设置:
  • J5 设为 ON 状态(安装 2针跳线);
  • J6 设为 ON 状态(安装 2针跳线);
    NUCLEO-G431RB 控制板的跳线设置:
  • JP4 和 JP7 设为 OFF 状态(不安装跳线);
  • J2 设为 [2-3] 位置(跳线安装在 pin2、pin3 针脚);
  • J3 设为 [1-2] 位置(跳线安装在 pin1、pin2 针脚)。

注意:更改控制模式之前,必须关闭电源电压。

  1. 将 12V/2A 直流电源连接到 NUCLEO-G431RB 控制板上的 CN1 连接端口(mini-USB),或连接到 X-NUCLEO-IHM16M1 电机驱动板上的 J4 连接器(电源插座),并通电。

3. 无感 FOC 转速调节程序开发

3.1 配置电机控制包

  1. 打开 电机控制软件开发套件(Motor Control WorkBench),创建新项目。
    单击"New Project"按钮,弹出"New Project"对话框。
    在 "General Info" 菜单中进行设置:

    • 在 "Project name" 输入项目名称,例如 "IHM03_04";
    • 在 "Num.Motors" 选择电机数量为 单电机:1 Motor;
    • 在 "Driving Algorithm" 选择驱动控制算法为 FOC;
    • 在 "Hardware Mode" 选择 Modular 模式。
  2. 进入 "Motors" 菜单,根据 IHM03 电机控制套件的配置,从菜单中选择电机型号,例如本例使用 KJ230F(用户自定义的电机,自定义电机的操作参见 STM32-FOC(8)MCSDK Profiler 电机参数辨识)。

  1. 进入 "Power board" 菜单,根据 IHM03 电机控制套件的配置,选择驱动板为 X-NUCLEO-IHM16M1 电机驱动板。

  2. 进入 "Control board" 菜单,根据 IHM03 电机控制套件的配置,选择控制板为 NUCLEO-G431RB 控制板。

  3. 完成项目配置后,点击窗口右下方 ">>OK" 按钮,就会自动生成一个电机控制项目,并显示项目视图如下。

    视图的内容取决于用户配置的电路板和电机的信息。

    如果用户的配置有错误(无效),则会弹出一个对话框,通知用户这些选择不允许创建项目,并要求用户修改配置。

点击 ">>OK" 确认,返回电机控制项目视图。

  1. 项目生成。
  • 选择菜单 "Generate the project" 按键,根据配置参数生成项目。
  • 跳出 "Project generation" 窗口,选择 STM32CubeMX 版本、固件版本(Firmware Package Version),Target Toolchain 为 STM32CubeIDE。
  • 默认使用 HAL 驱动。
  • 点击 "GENERATE" 按键,生成代码。

注意选择的固件包的版本,如果没有安装相应版本的固件包,则会自动下载。

如下图所示,项目生成完成后,点击 "RUN STM32CubeMX" 按键,打开 STM32CubeMX 进行图形化配置。

3.2 图形化配置

在 Motor Control WorkBench 中生成项目,点击 "RUN STM32CubeMX" 按键,打开 STM32CubeMX,对 ADC进行配置以使用 旋钮。

  1. 参考点灯实验程序,将PA5 管脚设置为 GPIO_Output------这与电机控制无关,只供参考。

  2. 点击 "Project Manager" 菜单按钮,进入工程配置界面。

  • 输入项目名称为 "IHM03_04",选择项目的保存路径。
  • 将Toolchain / IDE 设为 STM32CubeIDE(根据用户安装和使用的 IDE 选择,也可以选择 EWARM、MDK-ARM、MakeFile、CMake 等IDE工具)。
  • 点击右上角 "GENERATE CODE" 生成代码。
  1. 加载完毕后,弹出代码生成提示窗口。点击" OPEN PROJECT",进入 STM32CubeIDE。

3.3 代码编辑、编译与调试

  1. 打开 STM32CubeIDE,导入 IHM03_04 项目。

    如果是从 CubeMX 代码生成提示窗口点击" OPEN PROJECT",则进入 STM32CubeIDE后自动打开 IHM03_04 项目。

  2. 修改主程序 main.c,添加使用 API 实现电机调速的代码。

  • (1) 在左侧 Project Explorer 中,选择 IHM03_02 -- Application -- User,打开主程序 main.c
c 复制代码
  /******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************/
  • (2) 在实例函数定义(Private function prototypes)段落之后,在(Private user code)部分添加 调速处理函数 void HandsOn1(void),实现电机 低速与高速 运行的切换,切换时间为 5sec。
c 复制代码
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* Hand On 1 - 低速高速定时切换 */
static uint32_t Run_Count =0;
void HandsOn1(void)
{
    MC_ProgramSpeedRampMotor1(500/6, 1000);  // 设定转速500rpm,斜坡1000ms
	if(Run_Count==0)
	{
		MC_StartMotor1();  // 启动电机
	}
	HAL_Delay(5000);  // 运行 5000ms
	MC_ProgramSpeedRampMotor1(1000/6, 1000); // 设定转速1200rpm,斜坡1000ms
	HAL_Delay(5000);
	Run_Count++;
	if(Run_Count>10)
	{
		Run_Count=10;
		MC_StopMotor1();  //停止电机
		while(1);
	}
}

/* USER CODE END 0 */
  • (3) 在 main() 函数的 while(1) 循环中,调用 HandsOn1() 处理调速功能。
c 复制代码
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HandsOn1();
    /* USER CODE END WHILE */
  }
  1. 程序编译
  • 用 USB连接线,连接 PC 与 NUCLEO-G431RB 开发板。
  • 点击工具栏中 "Build Debug" 按键对程序代码进行编译。
  1. 程序下载烧录到目标板

    点击工具栏中 "Debug" 按键,将程序下载烧录到目标板 NUCLEO-G431RB 。

  2. 程序的运行与调试

  • 对照 2.1 检查 IHM03 套件硬件连接和电源连接。
  • 接通 12Vdc电源。
  • 点击工具栏中 "Resume" 按键 或 F8 快捷键,运行程序,电机启动后旋转,并在高速与低速之间来回切换。

3.4 上位机监控

基于 MCSDK6.0 Pilot 上位机控制与调试的方法,详见: STM32-FOC(7)MCSDK Pilot 上位机控制与调试

  1. 打开电机控制软件开发套件(Motor Control WorkBench),单击工具栏的 "Motor Pilot" 按钮,启动电机导向应用程序 ST Motor Pilot。

  2. 在 ST Motor Pilot 中,点击菜单 "GUI -- Load GUI",根据项目内容选择相应的 QML 图形界面文件,加载上位机 GUI 文件 MC_FOC_SDK.qml。

  3. 连接上位机。

    3.1 打开上位机(PC)的设备管理器,查看 ST Link 对应的串口的端口号。

    3.2 在 ST Motor Pilot 中,在 "Port" 设置 ST Link 对应的串口位置,再点击按键 "Connect" 连接。

    3.3 连接成功后,ST Motor Pilot 显示电机的运行状态和参数,包括:电机转速,直流母线电压,温度,功率,运行状态,故障代码等。

  4. 建立实时监控速度曲线图

    4.1 点击菜单栏中的 "Registers" 按钮,切换到寄存器显示界面,显示设定的寄存器参数的实时值。

    4.2 在寄存器显示界面,选择需要实时监控的参数,生成实时变化图。

  • 选择速度参考值 SPEED_REF(ID=153),点击对应的 "Configure" 按钮,选择 "Send to new plot" 后按 "Apply",自动建立绘图框 plot1,将 SPEED_REF 绘制到 plot1 绘图框。
  • 选择速度测量值 SPEED_MEAS(ID=89),点击对应的 "Configure" 按钮,选择 "plot1" 后按 "Apply",将 SPEED_MEAS 也绘制到 plot1 绘图框。
  1. 监控程序运行
    通过 STM32CubeIDE 的工具栏中 "Resume" 按键 或 F8 快捷键运行程序,或按下开发板黑色按钮(复位键)运行程序,在上位机通过 ST Motor Pilot 监测程序运行状态。
    绘图框实时显示 速度参考值 SPEED_REF、速度测量值 SPEED_MEAS 的运行曲线,如下图所示。

4. API 函数说明

API 函数是 电机控制SDK的高级编程接口,位于 MC SDK 中的电机应用层,处于 用户层 与 电机库 之间。API 函数基于电机库构建,就像是行为描述操作,便于用户调用。使用 API 函数,可以完成基于MCSDK 应用程序的各种电机基本操作。

在本例程中,从 MC SDK 调用了几个 基本的 API 函数:

MC_StartMotor1(); //电机1 启动

MC_StopMotor1(); //电机1 停止

MC_ProgramSpeedRampMotor1(); // 电机1 调速

4.1 电机启动函数 MC_StartMotor1

函数原型:

__weak bool MC_StartMotor1 (void)

  • 功能:启动电机1的启动程序。
    如果状态机(state machine)处于空闲状态(IDLE),则立即执行该命令。否则,丢弃该命令。
  • 返回值:如果命令成功执行,则返回true,否则返回false。

说明:

  • 在调用MC_StartMotor1()以设置扭矩或速度参考值之前,必须执行以下命令之一:
    • MC_ProgramSpeedRampMotor1()
    • MC_ProgramTorqueRampMotor1()
    • MC_SetCurrentReferenceMotor1()
      如果没有执行以上命令之一,可能会导致不可预测的行为。
  • 如果电流测量电路的偏移量尚不清楚,则在实际启动电机之前,自动执行偏移校准程序来测偏移量量。
  • 应用程序可以检查返回值,以了解命令是被执行还是被丢弃。

注意:

  • MCI_StartMotor1 命令仅触发启动程序(或最终的偏移校准程序)的执行,并在之后立即返回。在电机确实处于稳定状态之前,它不会阻止应用程序的执行。
  • 如果应用程序需要等待电机在稳定状态(steady state)下运行,则应用程序必须检查电机的状态机,并验证是否已达到运行状态(RUN)。请注意,如果启动流程失败,则可能永远无法达到RUN状态。

4.2 电机停止函数 MC_StopMotor1

函数原型:

__weak bool MC_StopMotor1 (void)

  • 功能:启动电机1的停止程序。
    如果状态机(state machine)处于ICLWAIT、IDLE、FAULT_NOW和FAULT_OVER 状态之外的任何状态,则立即执行该命令。否则,丢弃该命令。
  • 返回值:如果命令成功执行,则返回 true,否则返回 false。

说明:

应用程序可以检查返回值,以了解命令是被执行还是被丢弃。

MC_StopMotor1()命令仅触发停止电机程序,然后返回。在电机确实停止之前,不会阻止应用程序。为了知确定电机是否已经停止,应用程序可以查询电机的状态机,并检查是否已经达到空闲状态(IDLE)。

4.3 电机调速函数 MC_ProgramSpeedRampMotor1

函数原型:

__weak void MC_ProgramSpeedRampMotor1(int16_t hFinalSpeed, uint16_t hDurationms)

  • 功能:为电机1编程速度斜坡,以便稍后或立即执行。

    速度斜坡是在给定的hDurationms时间内从当前速度参考到hFinalSpeed目标速度的线性变化。

    调用MC_ProgramSpeedRampMotor1()函数,使用提供的参数对新的速度斜坡进行编程。如果电机1的状态机处于运行状态,则立即执行编程斜坡。否则,斜坡将被缓冲,并在状态机达到上述任何状态时执行。

    应用程序可以使用MC_GetCommandStateMotor1() 检查命令的状态,以了解最后一个命令是否立即执行。

    在任何给定时间只能缓冲一个命令。如果另一个斜坡------无论是速度还是扭矩斜坡------或者在当前斜坡完成之前编程了另一个缓冲命令,后者将取代前者。

  • 参数:

    • hFinalSpeed:斜坡末端的机械转子速度参考。以SPEED_unit定义的单位表示。
    • hDurationms:斜坡的持续时间,单位为毫秒。可以设置 0 以执行速度值的瞬时变化。

注意:

  • 如果应用程序使用无传感器电机控制技术,斜坡不能反转旋转方向。
  • 如果hFinalSpeed参数的符号与当前速度的符号不同,则斜坡将不会完成,当转速即将达到0 rpm时,将出现速度反馈错误(MC_speed_FDBK)。

参考资料:

  1. P-NUCLEO-IHM03 STM32电机控制套件
  2. UM2505 - STM32G4 Nucleo-64 boards (MB1367), STMicroelectronics/意法半导体, 2021
  3. UM2538 - STM32 motor-control pack using the FOC algorithm for three-phase, low-voltage, and low‑current motor evaluationl, STMicroelectronics/意法半导体, 2023
  4. 许少伦等,STM32G4入门与电机控制实战,电子工业出版社,2023

版权声明:

youcans@qq 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/144134381)

Copyright@youcans 2024

Crated:2024-12

相关推荐
llilian_168 小时前
总线授时卡 CPCI总线授时卡的工作原理及应用场景介绍 CPCI总线校时卡
运维·单片机·其他·自动化
禾仔仔9 小时前
USB MSC从理论到实践(模拟U盘为例)——从零开始学习USB2.0协议(六)
嵌入式硬件·mcu·计算机外设
The Electronic Cat11 小时前
树莓派使用串口启动死机
单片机·嵌入式硬件·树莓派
先知后行。13 小时前
常见元器件
单片机·嵌入式硬件
恒锐丰小吕14 小时前
屹晶微 EG2302 600V耐压、低压启动、带SD关断功能的高性价比半桥栅极驱动器技术解析
嵌入式硬件·硬件工程
Dillon Dong15 小时前
按位或(|=)的核心魔力:用宏定义优雅管理嵌入式故障字
c语言·stm32
Free丶Chan15 小时前
dsPIC系列-1:dsPIC33点灯 [I/O、RCC、定时器]
单片机·嵌入式硬件
v先v关v住v获v取16 小时前
塔式立体车库5张cad+设计说明书+三维图
科技·单片机·51单片机
恒锐丰小吕17 小时前
屹晶微 EG2106D 600V耐压、半桥MOS/IGBT驱动芯片技术解析
嵌入式硬件·硬件工程