【动手学电机驱动】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

相关推荐
wenchm13 小时前
细说STM32F407单片机SPI基础知识
stm32·单片机·嵌入式硬件
jikuaidi6yuan13 小时前
STM32 ADC 配置
stm32·单片机·嵌入式硬件
Be Legendary-CGK15 小时前
有源模拟滤波器的快速设计
嵌入式硬件·硬件工程
Anin蓝天(北京太速科技-陈)15 小时前
204-基于Xilinx Virtex-6 XC6VLX240T 和TI DSP TMS320C6678的信号处理板
嵌入式硬件·fpga开发·信号处理
Jack电子实验室16 小时前
STM32 出租车计价器系统设计(一) 江科大源码改写
c语言·stm32·单片机·嵌入式硬件·嵌入式
腾飞的信仰16 小时前
51单片机 串口UART
单片机·嵌入式硬件·51单片机
电子科技圈16 小时前
XMOS将在CES 2025上展出多款由边缘AI驱动的创新音效、音频、识别和处理解决方案
人工智能·科技·嵌入式硬件·mcu·物联网·音视频·iot
lantiandianzi17 小时前
基于单片机的输液速度监控系统设计
单片机·嵌入式硬件
紫阡星影18 小时前
【模块系列】STM32&PCF8563
c语言·stm32·单片机·嵌入式硬件
憧憬一下19 小时前
深入解析PCIe设备事务层与配置过程
arm开发·嵌入式硬件·嵌入式·pcie·linux驱动开发