灵动微 MM32SPIN360C 电机开发板驱动有感 BLDC 的操作方法

一、MM32SPIN360C 电机开发板介绍

  1. 简介

        如图(1),MM32SPIN360C 电机开发板以 Mindmotion 的专用 MCU —— MM32SPIN360C 为主控制器,具备霍尔传感器检测和反电动势检测功能。适用于低压场合,可广泛用于工业或者民用领域的三相无刷永磁电机驱动器,如电动工具等。

        主控制器 MM32SPIN360C 是 ARM Cortex-M0 的 32 位微控制器,内置 5V 输出的 LDO 稳压器(Input : 7~13.5V),内置 3 组具有自举二极管的 N 沟道半桥栅极驱动器(7~48V、1A Sink、1A Source),以及 3 个比较器和 3 个运算放大器等等。MM32SPIN360C 的具体参数和用法请参考灵动微的官网(https://www.mindmotion.com.cn/)上的数据手册和用户手册。

 
图(1)

 

  1. 电路板图解

        如图(2)为电路板正面的图解,开发板带有 10KΩ 可调电阻器,可用于调节电机的转速。带有 UART/LIN 通讯接口,以及两种形式的 JTAG/SWD 接口。电源输入电压为 12~36V,可以有两种接入方式(DC-JACK 或者 接线端子)。


图(2)

 

  1. 原理图介绍

        图(3)是电机驱动部分的原理图。由于 MM32SPIN360C 这颗 MCU 内自带预驱,所以可以直接驱动 MOS 管(PXN012-60QL),简化了电机驱动电路。


图(3)

        图(4)是反馈电路,可以通过 JP4~JP8,JP10~JP12 选择霍尔传感器方式反馈或者是反电动势方式反馈。如果选择霍尔传感器方式,则只需要将 JP6、JP7、JP8 的 1-2 脚短接。


图(4)

二、  驱动软件简介

  1. 启动电机

        此驱动软件首先通过 12-bit ADC 采集可调电阻器的电阻值,确定电机的转速。当电机速度的 PWM 波形占空比大于 5% 才开始启动电机。电机启动之前通过读取 U/V/W 的 3 个霍尔传感器的值确定电机转子位置,进而根据转子位置来确定 U/V/W 的上电顺序。

        //RM 旋钮启动与调速
do {
hwAdcValue = GetAdcAverage(5); // 采集可调变阻器的电压值
if (0xffff == hwAdcValue) {
break;
} else {
g_tMotor.tDuty = hwAdcValue * 100 / 4095; // 设置 PWM 占空比
SET_DUTY_U(g_tMotor.tDuty);
SET_DUTY_V(g_tMotor.tDuty);
SET_DUTY_W(g_tMotor.tDuty);
if ((g_tMotor.tDuty > 5) && (g_tMotor.tMotorState == STOP)) {
g_tMotor.tMotorState = START; // 如果电机速度的波形占空比大于 5%,则启动电机
}
}
} while(0);
  1. 霍尔传感器信号的采集

        软件中包含 3 种霍尔传感器信号采集方式:主循环、EXTI、Timer 。

  •   主循环 方式是在主函数的 while(1) 循环里读取 U/V/W 这 3 个霍尔传感器对应的 MCU 管脚(PA0/PA1/PA2)上的电平, 进而驱动换相。
  •   EXTI 方式是设置 U/V/W 这 3 个霍尔传感器对应的 MCU 管脚(PA0/PA1/PA2)为外部中断,双边沿触发。当任一 HALL 线上电平发生变化时,都会有对应中断线产生中断,在 EXTI 中断服务函数中进行 HALL 引脚电平检测,进而驱动换相。
  •   Timer 方式是设置 U/V/W 这 3 个霍尔传感器对应的 MCU 管脚(PA0/PA1/PA2)为定时器输入脚 ( CC1、CC2、CC3)。使用这 3 个定时器输入脚通过一个异或门连接到 TI1 输入通道;当捕获到 CC1、CC2、CC3 上有引脚发生电平变化时,由于异或门的存在, TI1 上产生一个跳变沿;经过输入滤波器和边沿检测器后传输给 TI1F_ED ,由于配置了 TIM 的触发源为 TI1F_ED 和使能了触发中断,这里会进入触发中断,在触发中断中我们可以判断霍尔状态的有效值,根据霍尔状态的有效值控制电机对应的绕组供电,进而驱动电机旋转。

        这 3 种方式可以通过 hall.h 中的如下定义来选择:

        #define HALL_POLLING_MODE 0   // 1:采用 主循环 方式采集霍尔信号

#define HALL_TIM_MODE 1 // 1:采用 Timer 方式采集霍尔信号
#define HALL_EXTI_MODE 0 // 1:采用 EXTI 方式采集霍尔信号
  1. 电机堵转检测

        驱动软件中开启了系统节拍定时器(systick),每 1 毫秒中断一次。此定时器用于检测电机运转时堵转 2 秒之后,停止电机运行。

        void Systick_Callback(void)
{
if(RUN == g_tMotor.tMotorState) {
g_tMotor.tCount.hwTimeCount ++;
if(g_tMotor.tCount.hwTimeCount > 2000) { // 2s超时,电机卡住不运转超过2s时间
GATE_DRIVER_DISABLE();
BLDC_UVW_DISABLE();
g_tMotor.tMotorState = STOP;
g_tMotor.tMotorErr = LOCKED_ERR;
g_tMotor.tCount.hwTimeCount = 0;
}
}
}


三、调试开发板

  1. 接线方法

        开发板、BLDC 电机、调试器的接线图如图(8)所示。


图(8)

  1. 调试器的设置

        开发板采用 SWD 接口调试。调试器可以采用灵动微官方的调试下载器,也可以采用适用于 ARM Cortex-M 核的调试器,比如图(8)用的就是 WPI 自制的调试器。

        如果使用灵动微官方的调试器,则需要从灵动微官网上下载调试器的驱动(https://www.mindmotion.com.cn/support/development_tools/debug_and_programming_tools/)。 并在 keil 的调试设置中,选择 MM32-LINK Debugger ,如图(9)所示。


图(9)

        我这里使用的是 WPI 自制的调试器,这种调试器免驱,在 keil 的调试设置中,选择 CMSIS-DAP Debugger ,如图(10)所示。


图(10)

  1. 开发板上的设置

        开发板上的跳线设置如图(11)所示,红色标记的地方需要接跳线帽,其他位置可以忽略。


图(11)

  1. 代码下载 & 运行

        将代码下载到开发板上之后,旋转可调电阻器的旋钮,电机启动。可调变阻器的阻值越大,电机的转速越高。

四、总结

        MM32SPIN360C 电机开发板上的主控制器(MM32SPIN360C)内置预驱,所以 MCU 只需要外接 6 个 MOS 管就可以驱动 BLDC 电机,整个驱动电路比较简单。
        本文档介绍了如何使用 MM32SPIN360C 电机应用开发板驱动低压有感BLDC 电机的方法。 由于有霍尔传感器反馈电机转子的位置,所以在电机启动和运行的过程比较平稳,而且不需要算法,驱动代码比较简单。
        此外,此开发板也可以驱动有感/无感正弦波电机,这个驱动的方法将在后面的博文中介绍,敬请期待。

    

参考资料:

  1. DS_MM32SPIN360C_p_V1.07_SC.pdf
  2. UM_MM32SPIN2x_p_V1.19_SC.pdf

相关视频

灵动微 MM32SPIN360C 电机开发板驱动有感 BLDC

视频介绍了 SPIN360C 电机驱动板,演示了如何驱动带霍尔的 BLDC 电机。
电机 Demo 板可以驱动 12 ~ 30V 的永磁同步电机;可以带位置传感器,像霍尔传感器、磁编码器等等。它也支持 FOC 驱动,能通过反电动势反馈和电流反馈来计算转子的位置。
板上的 MCU 是灵动微的 SPIN 系列 MCU:MM32SPIN360C,是为电机专门设计的一款产品。它的内核是 Arm Cortex-M0,工作速度可以达到 96MHz,带内部高速振荡器,可提供 48MHz 频率。有16 路 12 位精度的 ADC, 3 个模拟比较器,3 个放大器,3 组 N 型半桥式栅极驱动器。

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论

五月小姐姐

五月小姐姐

2022年6月10日
@个人 视频是有霍尔方波控制,FOC 控制的例程也有,可以联系我们:atu.sh@wpi-group.com。
SilentCare

SilentCare

2022年5月21日
这个板子如何购买呢?电子爱好者想买一块用来学习。视频中示例代码用的是有霍尔传感器六步方波控制吗?有FOC控制的示例代码?