【动手学电机驱动】STM32-FOC(10)使用旋钮调节电机转速

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(10)使用旋钮调节电机转速

【动手学电机驱动】STM32-FOC(10)使用旋钮调节电机转速

    • [1. 开发环境](#1. 开发环境)
    • [2. 硬件连接与快速运行](#2. 硬件连接与快速运行)
    • [3. 使用旋钮调节电机转速程序的开发](#3. 使用旋钮调节电机转速程序的开发)
      • [3.1 配置电机控制包](#3.1 配置电机控制包)
      • [3.2 图形化配置 ADC 和 PWM](#3.2 图形化配置 ADC 和 PWM)
      • [3.3 代码编辑、编译与调试](#3.3 代码编辑、编译与调试)
      • [3.4 上位机监控](#3.4 上位机监控)
    • [4. API 函数说明](#4. API 函数说明)
      • [4.1 状态请求函数 RCM_GetUserConvState](#4.1 状态请求函数 RCM_GetUserConvState)
      • [4.2 返回ADC转换结果 RCM_GetUserConv](#4.2 返回ADC转换结果 RCM_GetUserConv)
      • [4.3 执行用户定义的常规 ADC 转换:RCM_RequestUserConv](#4.3 执行用户定义的常规 ADC 转换:RCM_RequestUserConv)

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

本节从 STM32 电机控制包配置开始,在基于 IHM03 电机控制套件的无感 FOC 电机控制基础上,介绍使用 Nucleo 开发板上的旋钮对电机进行调速,学习 ADC 的配置和调用。

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. 使用旋钮调节电机转速程序的开发

3.1 配置电机控制包

  1. 打开 电机控制软件开发套件(Motor Control WorkBench),创建新项目。

    单击"New Project"按钮,弹出"New Project"对话框。

    在 "General Info" 菜单中进行设置:

    • 在 "Project name" 输入项目名称,例如 "IHM03_05";
    • 在 "Num.Motors" 选择电机数量为 单电机:1 Motor;
    • 在 "Driving Algorithm" 选择驱动控制算法为 FOC;
    • 在 "Hardware Mode" 选择 Modular 模式。
  2. 进入 "Motors" 菜单,根据 IHM03 电机控制套件的配置,从菜单中选择电机型号,套件中的电机是 GimBal GBM2804-100T 直流无刷电机。

    本例使用 KJ230F 直流无刷电机,则从电机选项卡中选择 KJ230F(用户自定义电机的操作参见 STM32-FOC(8)MCSDK Profiler 电机参数辨识)。

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

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

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

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

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

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

  4. 项目生成。

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

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

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

3.2 图形化配置 ADC 和 PWM

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

  1. ADC 配置。
  • 在 Pinout &Configuration 选项下,从左侧下拉菜单中选择 Analog -- ADC1。
  • 从中间的 ADC1 Mode and Configuration 选项下,将 ADC1-IN8 配置为 "IN8 Single-ended",即为单端输入。
  • 在右侧的 Pinout view 视图中,点击 PC2 引脚,将 PC2 配置为 ADC1-IN8,用于旋钮的 ADC 输入。
  1. 参考点灯实验程序,将PA5 管脚设置为 GPIO_Output------这与电机控制无关,只供参考。

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

  • 输入项目名称为 "IHM03_05",选择项目的保存路径。
  • 将Toolchain / IDE 设为 STM32CubeIDE(根据用户安装和使用的 IDE 选择,也可以选择 EWARM、MDK-ARM、MakeFile、CMake 等IDE工具)。
  • 点击右上角 "GENERATE CODE" 生成代码。

加载完毕后,弹出 "Code Generation" 代码生成提示窗口。点击" Open Project" 按键,进入 STM32CubeIDE。

3.3 代码编辑、编译与调试

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

    如果是从 CubeMX 代码生成提示窗口点击" Open Project" 按键,则进入 STM32CubeIDE 后自动打开 IHM03_05 项目。

    注意如果在 STM32CubeIDE 中还有其它打开的项目,要点击鼠标右键选择 "Close Project" 关闭其它项目。

  2. 修改主程序 main.c,添加使用 ADC 实现旋钮调速的代码。

  • (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 HandsOn2_Init(void)
    • 调速功能处理函数 void HandsOn2(void)
c 复制代码
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* Hand On 2 -用户ADC控制速度 */
#include "regular_conversion_manager.h"
#define MIN_SPEED 200  //最低转速 200rpm
#define MAX_SPEED 1200  //最高转速 1200rpm

//定义用户ADC
RegConv_t ADC_Userconv;
uint8_t ADC_UserHandle;
uint16_t ADC_UserValue;
uint16_t Set_Speed;

void HandsOn2_Init(void)
{
	ADC_Userconv.regADC=ADC1;
	ADC_Userconv.channel=MC_ADC_CHANNEL_8;
	ADC_Userconv.samplingTime=ADC_SAMPLETIME_92CYCLES_5;
    RCM_RegisterRegConv(&ADC_Userconv);  // 注册ADC转换
    ADC_UserHandle = ADC_Userconv.convHandle;  // 获取转换句柄

	//启动电机
	MC_StartMotor1();
}

void HandsOn2(void)
{
	HAL_Delay(200);
	//检查常规转换状态
	if (RCM_GetUserConvState()==RCM_USERCONV_IDLE)
	{
        // 请求用户转换,传递描述转换的结构体指针
        RCM_RequestUserConv(&ADC_Userconv);
	}
	else if (RCM_GetUserConvState()==RCM_USERCONV_EOC)
	{
		ADC_UserValue=RCM_GetUserConv();
	}
	//计算设定速度值
	Set_Speed=(ADC_UserValue>>4)/8+MIN_SPEED;
	if(Set_Speed>MAX_SPEED)
	{
		Set_Speed=MAX_SPEED;
	}
	MC_ProgramSpeedRampMotor1(Set_Speed/6, 500);
}

/* USER CODE END 0 */
  • (3) 在 main() 函数的初始化部分,调用 HandsOn2_Init() 对 ADC进行初始化:
c 复制代码
  /* Initialize interrupts */
  MX_NVIC_Init();
  /* USER CODE BEGIN 2 */
  HandsOn2_Init();
  /* USER CODE END 2 */
  • (4) 在 main() 函数的 while(1) 循环中,调用 HandsOn2() 处理调速功能。
c 复制代码
  /* Infinite loop */
  while (1)
  {
     /* USER CODE BEGIN WHILE */
	 HandsOn2();
     /* USER CODE END WHILE */
  }
  1. 程序编译
  • 用 USB连接线,连接 PC 与 NUCLEO-G431RB 开发板。
  • 点击工具栏中 "Build Debug" 按键对程序代码进行编译。
  1. 程序下载烧录到目标板
  • 点击工具栏中 "Debug" 按键,将程序下载烧录到目标板 NUCLEO-G431RB 。
  1. 程序的运行与调试
  • 对照 2.1 检查 IHM03 套件硬件连接和电源连接。
  • 接通 12Vdc 电源。
  • 点击工具栏中 "Resume" 按键 或 F8 快捷键,运行程序。电机控制程序启动,电机旋转。
  • 调节 X-NUCLEO-IHM16M1 电机驱动板上的 R17 蓝色旋钮,可以调节电机的转速。

3.4 上位机监控

为了更清楚的监测电机运行状态和转速,可以使用 MCSDK6.0 Pilot 上位机进行控制与监测,本节介绍具体操作。

关于 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 监测程序运行状态。
    用螺丝刀调节 X-NUCLEO-IHM16M1 电机驱动板上的 R17 蓝色旋钮,可以调节电机的转速。电机运行速度的参考值 SPEED_REF、速度测量值 SPEED_MEAS 的曲线,实时显示在 ST Motor Pilot 的会图框 plot1,如下图所示。

4. API 函数说明

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

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

RCM_GetUserConvState();

RCM_GetUserConv();

RCM_RequestUserConv();

4.1 状态请求函数 RCM_GetUserConvState

函数 RCM_GetUserConvState 的作用是返回最近一次用户定义的常规 ADC 转换的状态。这是用于跟踪转换请求状态的重要函数,帮助用户判断是否可以发起新的转换或读取已有的转换结果。

RCM_UserConvState 由转换管理器(如 RCM_RequestUserConv 和 RCM_GetUserConv)动态更新。

在请求新的转换之前,用户需要调用 RCM_GetUserConvState 确保当前状态为 UDRC_STATE_IDLE。

  • 如果状态不是空闲,则需要等待当前任务完成。
  • 如果状态为 UDRC_STATE_EOC,表明转换已经完成,可以调用 RCM_GetUserConv 读取结果。

函数原型:

RCM_UserConvState_t RCM_GetUserConvState(void)

  • 功能:返回上次请求的常规转换的状态。
  • 返回值:返回类型为 RCM_UserConvState_t,表示当前转换的状态。
    -UDRC_STATE_IDLE:空闲状态,表示没有任何挂起的常规转换请求,可以请求新的转换
    -UDRC_STATE_REQUESTED:表示常规转换已被请求,但尚未完成。转换器正在处理当前任务,暂时无法接受新的转换请求。
    -UDRC_STATE_EOC:常规转换已完成,但尚未读取。表示常规转换已经完成,但结果尚未被用户读取。

4.2 返回ADC转换结果 RCM_GetUserConv

RCM_GetUserConv 是一个用来获取最近一次 ADC 转换结果的函数。在实时系统中,通过结合 RCM_RequestUserConv 和 RCM_GetUserConvState,可以实现对 ADC 转换任务的有效管理和结果读取。

函数原型:

uint16_t RCM_GetUserConv(void)

  • 功能:返回用户定义的最近一次常规 ADC 转换的结果值。
  • 参数:该函数没有输入参数。
  • 返回值:该函数返回一个 uint16_t 类型的值
    • 正常情况下,返回最近一次常规 ADC 转换的结果。
    • 如果在转换过程中发生错误,则返回值为 0xFFFF,表示转换失败。
  • 前提条件:
    调用此函数前,需要通过 RCM_GetUserConvState 检查当前转换状态,确认状态为 RCM_USERCONV_EOC(End of Conversion,表示转换完成)。
  • 工作流程:
    • 转换状态检查:在调用 RCM_GetUserConv 之前,需先通过 RCM_GetUserConvState 确认转换已经完成(状态为 RCM_USERCONV_EOC)。
    • 获取结果:调用 RCM_GetUserConv,返回最近的 ADC 转换结果。
    • 错误判断:如果返回值是 0xFFFF,表明在转换过程中发生了错误,需要进行相应的错误处理。

4.3 执行用户定义的常规 ADC 转换:RCM_RequestUserConv

RCM_RequestUserConv 是一个调度函数,用于管理用户定义的常规 ADC 转换。它的作用是将用户配置的转换任务注册到转换管理器中,并确保调度与状态一致。通过正确使用此函数,可以实现高效的 ADC 转换管理,并避免资源竞争。

函数原型:

bool RCM_RequestUserConv(RegConv_t *regConv)

  • 功能:请求执行一个用户定义的常规 ADC 转换。

  • 参数:

    RegConv_t *regConv:指向 RegConv_t 类型的指针。表示用户定义的常规转换的配置(包含 ADC 配置、通道、采样时间等信息)。

  • 返回值:

    • true:如果转换被成功调度,即当前没有正在进行的其他转换,并且转换状态为 RCM_USERCONV_IDLE。
    • false:如果有其他转换正在进行或转换请求未能被调度(例如状态不是 RCM_USERCONV_IDLE)。
  • 工作逻辑:

    • 状态检查:首先检查全局变量 RCM_UserConvState 是否为 RCM_USERCONV_IDLE(表示空闲)。如果状态不是空闲,说明有其他转换正在进行,函数直接返回 false。
    • 设置句柄:如果状态为空闲,将用户定义的转换配置 regConv 设置为全局变量 RCM_UserConvHandle。这相当于将当前的转换任务调度到转换管理器中。
    • 更新状态:将转换状态 RCM_UserConvState 更新为 RCM_USERCONV_REQUESTED,表示转换已被调度,等待执行。
    • 返回值:如果成功调度,返回 true。如果未能调度,返回 false。

(本节完)

参考资料:

  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/144168477)

Copyright@youcans 2024

Crated:2024-12

相关推荐
慕尘3 小时前
Clion配置51单片机开发环境
单片机
良许Linux4 小时前
32岁入行STM32迟吗?
stm32·单片机·嵌入式硬件
m0_466607705 小时前
【STM32CubeMX】ST官网MCU固件库下载及安装
stm32·单片机·嵌入式硬件
Wallace Zhang9 小时前
STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader
stm32·嵌入式硬件·安全
GodKK老神灭9 小时前
STM32 CCR寄存器
stm32·单片机·嵌入式硬件
杰克逊的日记10 天前
MCU编程
单片机·嵌入式硬件
Python小老六10 天前
单片机测ntc热敏电阻的几种方法(软件)
数据库·单片机·嵌入式硬件
懒惰的bit10 天前
STM32F103C8T6 学习笔记摘要(四)
笔记·stm32·学习
HX科技10 天前
STM32给FPGA的外挂FLASH进行升级
stm32·嵌入式硬件·fpga开发·flash·fpga升级
Li Zi10 天前
STM32 ADC(DMA)双缓冲采集+串口USART(DMA)直接传输12位原始数据到上位机显示并保存WAV格式音频文件 收藏住绝对实用!!!
经验分享·stm32·单片机·嵌入式硬件