电机控制

电机控制是指通过各种方式控制电机的运行,以实现所需的运动、速度、位置和扭矩等特性。电机控制可以应用于各种不同类型的电机,包括直流电机、交流电机、步进电机和伺服电机等。

电机控制是工程和自动化领域中的关键技术,它使各种机械系统和自动化过程得以实现。通过合适的电机控制方法,可以提高系统的精度、效率和可靠性,从而满足不同应用的要求。

近日,深圳市航顺芯片技术研发有限公司(以下简称“航顺芯片”)受邀出席在杭州举办的2024(第七届)中国电机智造与创新应用暨电机产业链交流会(华东),航顺芯片华东区域销售总监文志辉围绕《航顺HK32MCU在电机行业应用与布局》这一话题发表主题演讲。

1719797364526984.jpg

1719797371653145.jpg

1719797379981049.jpg

1719797384821950.jpg

精彩瞬间

随着我国制造业向智能化迈进,对工业自动化的核心组件——微控制单元(MCU)提出了更高的要求,包括增强的计算能力、更高级的智能功能以及更低的功耗。

为满足这些需求,航顺芯片精准把握市场脉搏,推出了一系列电机控制专用的高性能MCU产品及战略路线,以推动工控MCU技术的不断进步,并致力于为市场、行业和客户带来更加卓越和高效的产品体验。

0.jpg

文总特别提到了航顺芯片新推出的两款电机控制专用MCU HK32M060和HK32M050,具备三大特色功能,为客户提供创新产品力——

  • 内置1个12位高精度ADC转换器,ADC转换速率高达1MSPS。ADC除了支持DMA操作以外,每个ADC通道配置独立的结果寄存器;支持两个独立的采样保持单元;支持4个独立转换和1个测试队列的灵活队列配置;ADC触发信号可延时配置等特色功能。

  • 内置一个16位高级定时器,支持6个通道三项互补PWM输出,PWM输出带死区插功能,并且前后死区时间可不对称调整;除4路独立捕获和比较通道以外,还配置2路额外CC5和CC6捕获和比较通道,更适合电机控制。

  • 内置航顺自研知识产权的电机加速单元(EMACC),可用于通过FOC算法控制的直流无刷电机。EMACC可以加速电机驱动的数学运算,运算速度较纯软件计算更快,并且减少CPU占用,在相同的CPU工作频率下,效率提升36%。

航顺电机控制专用MCU产品广泛应用于工业控制、家用电器、电动工具和交通运输等领域,凭借创新的技术和可靠的产品,赢得了众多客户的认可和支持。

1.jpg

2.jpg

3.jpg

4.jpg

5.jpg

航顺HK32MCU除了在电机行业积极布局及推动量产应用,更是依托自身强大的研发实力和完善的产品阵列及生态体系,在消费电子、计算机与通信、医疗与工业控制以及汽车电子等关键领域实现广泛应用,并建立了强有力的市场竞争力。

6.jpg

航顺芯片将坚持研发投入,持续扩大自身在高端32位MCU和车规SoC领域的技术优势,进而提升产品的性能和功能安全等级,满足更高端的行业应用场景的需求。同时,航顺芯片还将加强与国内外知名企业、政府领导、专家学者的合作,推动航顺“芯”成为中国智造道路上的护航舰!

来源:航顺芯片

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 16

本方案是针对风扇电机控制的解决方案,使用了直流无刷电机。方案集成了直流无刷电机无位置传感器矢量控制专用固件,不需要位置传感器。使用矢量控制算法,相电流检测方式支持双电阻方式和单电阻方式。在变频算法部分,使用了瑞萨电子拥有自主知识产权的先进变频控制算法:RAMDA算法(Renesas Advanced Motor Drive Algorithm)。

方案搭载了瑞萨32位微处理器RX13T,RX13T具有增强的外设功能(MTU、ADC、POE、CMT、SCI),采用Smart Configurator轻松配置外设,完成电机控制的硬件配置。同时瑞萨还提供上位机控制软件PCTOOLS和参数生成软件USERTOOLS,PCTOOLS可以轻松控制风机的启停和调速,以及EEPROM数据的更新,USERTOOLS,可以轻松生成风机的控制参数。

Demo方案板

瑞萨电子提供贴近量产品的demo板(Inverter板+CPU板)

1.png

硬件电路

主要包括如下(请联系瑞萨销售或当地代理商获取)

  • 转换器电路

  • 逆变器电路

  • 电流检测电路(两相检测和单相检测可选)

  • 通信电路

  • EEPROM(可选)

  • MCU控制电路

引脚功能定义列表

RX13T专用于芯片正常工作和电机控制的引脚功能定义列表:

2.png

电机控制外设资源

  • ADC---S12AD0:分组扫描模式;组A:通道0-1;组B:通道2-7

  • MTU---MTU3和MTU4 

  • POE---POE0#(48pin)或POE10#(32pin) 

  • CMT---CMT0、CMT1 

  • SCI---SCI5 

电机控制库

提供用户与电机专用控制固件的通信接口,通过电机控制库提供的接口,用户可以发送控制指令给电机专用控制固件,同时,也可以查询电机的工作状态、故障情况等信息。 

提供电机专用控制固件的参数设置接口和界面,通过电机控制库提供的接口和界面,用户可以依据不同的电机参数、不同的控制规格等轻松设置电机专用控制固件,以便充分利用电机专用控制固件驱动直流无刷电机。

电机控制库包含如下文件: 

  • r_mcl.lib 

  • r_mcl.h 

  • 其中 , “r_mcl.lib”是电机控制库的库文件,这个文件包含全部电机控制API函数和电机专用控制固件。 

  • “r_mcl.h”是电机控制库的头文件,用于声明库文件中的API函数。

用户系统软件

提供用户系统软件框架,方便用户快速开发系统程序

  • 使用Smart configurator配置电机控制所需的外设

MTU/ADC/POE/CMT/SCI。在用户项目的src\smc_gen目录下生成底层驱动配置文件。

  • 添加库文件r_mcl.lib和r_mcl.h至用户项目中的src\motor目录下

  • 添加如下用户文件至用户项目中的src\motor目录下

“user_main_loop.c/ user_main_loop.h”是用户主循环文件

“user_restart.c/ user_restart.h”是用户重启文件

“user_data_init.c/ user_data_init.h”是用户数据初始化文件

“user_comm_init.c/ user_comm_init.h”和“comm_init.c/ comm_init.h”是设置通信的文件“user_copyright.c/ user_rev.h”是用户程序版本文件

“my_type.h”是数据类型定义文件

3.png

上位机控制软件 PCTOOLS

(复用双马达控制软件)

  • 控制风机的启停和调速

  • 风机运行状态显示

  • EEPROM数据的写入与更新

4.png

参数生成软件 USERTOOLS

用于填写厂家给定的风机参数、变频器的容量等原始数据,以及控制参数来生成写入EEPROM/Data Flash的数据。

 5.png

方案硬件框图

6.png 

方案资料获取

  • RX13T用户手册(硬件)

  • CIAS-FAN用户手册(API使用说明)

  • CIAS-FAN参数设定手册

瑞萨集成开发环境(IDE)和编译器、仿真器、编程器相关资料集成开发环境请访问瑞萨电子官网或联系瑞萨销售或当地代理商。

RX13T产品介绍

RX13T系列微控制器搭载RX家族32MHz工作主频的RXv1内核、浮点运算单元(FPU)、变频控制计时器(MTU3)及12位A/D转换器等,单芯片实现无刷DC电机的高效变频控制。与现有RX产品的兼容性高,方便已有硬件/软件的移植。RX13T系列包括32-pin和48-pin两种少管脚封装,可编程增益放大器(PGA)、比较器、数据闪存、高速内置谐振器(HOCO)等功能,有助于减少电路板面积和BOM元器件。RX13T有支持-40℃~85℃的标准产品和-40℃~105℃高温对应版产品可供客户选择。

RX13T产品特点

RX13T是一款专为控制单个电机而优化的微控制器,非常适合控制风扇、泵和冰箱中的电机。

◼ 单个芯片可以对直流无刷电机(永磁同步电机)执行矢量控制

  • 浮点运算单元FPU

  • 定时器单元MTU3c,可生成三相互补PWM波输出

  • 12位AD采样单元,3路采样保持,可同时进行三相电流值的采样

  • 硬件保护单元POE

◼ 支持引脚数低的封装,有助于减小BOM和PCB空间

7.png

瑞萨RX13T MCU

适用于单电机控制应用的32位微控制器;减少了占用空间和BOM成本

https://www.renesas.cn/cn/zh/products/microcontrollers-microprocessors/rx-32-bit-performance-efficiency-mcus/rx13t-32-bit-microcontrollers-single-motor-control-applications-reduces-footprint-and-bom-costs 

来源:瑞萨嵌入式小百科

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 13

移动机器人的卓越性能、平稳运动和可靠运行离不开高效精确的电机控制。机器人的自主性和复杂性不断提高,非常需要能够处理复杂电机控制和其他任务的高级微控制器。恩智浦新一代MCX微控制器产品组合具有先进的外设,可帮助开发人员优化移动机器人系统中的电机控制。 

FlexPWM模块

MCX A和N系列具有通用、高配置的增强型Flex脉宽调制器 (eFlexPWM) 模块,可实现精确的电机控制,并提供广泛的功能集,满足移动机器人应用的各种需求。除了驱动电机的高级控制外,eFlexPWM模块还可用于构建开关式电源。 

eFlexPWM模块的一个主要功能是支持中心对齐、边沿对齐和非对称脉宽调制 (PWM)。

中心对齐PWM可保持相位对齐,并将无刷直流 (BLDC) 电机的电流波纹降至最低,这种电机因其高效率和扭矩密度而常用于移动机器人领域。开发人员采用中心对齐PWM,可以实现更平稳的电机运行,减少电磁干扰 (EMI),并延长电机绕组的使用寿命。 

1.jpg

中心对齐PWM信号

边沿对齐PWM可简化占空比计算,并更轻松地控制H桥电路,在移动机器人领域应用广泛,可用于双向电机控制、精确定位和速度调节。FlexPWM模块简化了H桥电路必要控制信号的生成,降低了软件复杂性,并提高了固件响应速度。 

2.png

边沿对齐PWM信号

FlexPWM模块还提供相移PWM,这对于涉及多相逆变器的移动机器人应用来说是一个有价值的功能。开发人员对PWM信号进行移相,可同时优化多台电机的供电,确保多自由度的系统 (如机械臂或多轮平台) 实现平稳协调的运动。 

FlexPWM模块还具备强大的故障保护和自动故障清除机制,确保系统安全可靠。一旦检测到故障,该模块会立即切断PWM输出,防止对电机绕组等敏感部件造成损害。故障排除后,该模块可自动清除故障状态,并恢复正常运行,最大限度地减少停机时间,增强整个系统的稳健性。 

有关MCX N系列功能和外设的更多信息,点击阅读白皮书>>

正交解码器 (QDC)

移动机器人需要精确的位置和速度反馈,才能形成有效的闭环控制系统。MCX微控制器具有正交解码器 (QDC) 模块,这是一种专用外设,可简化正交编码器信号的解码过程,并提供可靠的位置和速度测量。 

3.png

QEI

正交编码器生成两个正交信号,即A相和B相,它们的相位相差90度。QDC模块通过分析信号的顺序和频率确定电机轴的位置和旋转方向。该模块的高级功能,如干扰滤波和边缘检测,可确保解码位置和速度数据的完整性与可靠性,即使在存在电气噪声或信号干扰的情况下也能保障。 

QDC模块在计数器初始化方面具有灵活性,支持开发人员根据特定事件或情况调整计数器的位置。例如,计数器可根据编码器每转一圈产生的索引脉冲进行初始化。这一功能还简化了归位例程和绝对定位的实施。此外,QDC模块还支持根据外部传感器或开关触发的归位信号进行初始化,从而实现移动机器人系统的精确控制和校准。 

QDC模块提供多种速度测量方法,可满足不同的应用需求。开发人员可以通过监测固定时间间隔内的位置变化、平衡分辨率和响应时间来计算电机速度。此外,该模块还可以测量连续正交边沿之间的累计时间,提供高分辨率速度测量,适合需要快速响应和精细控制的应用。 

AND/OR INVERT (AOI) 模块

在优化电机控制方面,MCX A系列中的AOI模块与FlexPWM和QDC模块相辅相成。AOI模块支持开发人员创建可编程组合布尔逻辑,根据特定输入条件生成事件输出。在MCX N系列微控制器中,两个AOI模块和一个可配置触发器构成了事件生成器 (EVTG) 模块。 

AOI模块为电机控制提供了高效的解决方案,可以从主处理器分流事件检测和触发器生成任务,从而减少固件开销并提高系统响应速度。通过配置AOI模块来监测位置、速度或故障状态等各种输入信号,开发人员可以创建自定义硬件触发器,启动特定的电机控制操作,而无需持续的软件干预。 

例如,AOI模块能够被设定,在满足特定条件组合时生成触发信号,例如当电机位置达到预定阈值且速度在一定范围内时。然后,此触发信号可用于自动调整PWM占空比、更改电机换向序列或执行任何其他所需的电机控制操作。 

开发人员可以利用AOI模块的可编程逻辑,实施复杂的控制策略,对实时事件做出快速反应,提高整体性能和效率。AOI模块非常灵活,支持根据每个应用的具体要求创建自定义触发条件,使开发人员能够根据其机器人平台的独有特点优化电机控制。 

FRDM-MC-LVPMSM扩展板

恩智浦提供的FRDM-MC-LVPMSM扩展板有助于电机控制应用的开发和原型设计。FRDM板结合了软硬件资源,可加速设计过程。它采用shield扩展板外形设计,可与恩智浦的Freedom开发板平台无缝集成。 

4.jpg

FRDM-MC-LVPMSM扩展板

FRDM-MC-LVPMSM扩展板与恩智浦永磁电机控制参考软件相结合,可提供完整的电机控制参考设计。该软件套件包括一系列预配置电机控制算法、库和示例项目,使开发人员能够针对其特定的移动机器人应用快速实施和优化电机控制系统。 

此扩展板采用低压三相永磁同步电机 (PMSM),由于其高效率、高扭矩密度和精确控制能力,广泛用于移动机器人领域。此外,该板还包括功率模块、电流检测电路和编码器接口等基本组件,为电机控制开发提供了完整的平台。 

开发人员利用FRDM-MC-LVPMSM扩展板和相关参考软件,可以显著减少设计和验证移动机器人电机控制系统所需的时间和精力。该板与FRDM-MCX开发平台兼容,可实现无缝集成,使开发人员能够根据其特定应用要求选择合适的微控制器。 

MCUXpresso开发人员体验

恩智浦提供了低成本的FRDM开发平台,可使用MCX快速进行原型设计。FRDM开发板具有标准规格和接头,便于连接MCU的输入/输出端口,并内置了MCU-Link调试器,带有USB-C线缆。 

恩智浦的GitHub还允许访问应用示例,可以使用应用代码中心门户 (ACH) 访问这些示例。

MCUXpresso IDE和MCUXpresso for VS Code内置了ACH浏览功能,开发人员可以轻松搜索可用的演示和示例,并在直接加载项目使用之前按设备、应用技术或外设/功能进行筛选。 

扩展板中心  (EBH) 是NXP SDK Builder网站的扩展,开发人员可以在其中找到恩智浦及其合作伙伴提供的一系列附加板,以扩展所选评估板的功能。该中心提供直观的筛选功能,可快速查找板卡和可用的支持软件。开发人员可以将他们的板与不同类型的扩展板配对,以评估特定用例或应用程序并进行快速原型设计。 

恩智浦移动机器人电机控制解决方案 

恩智浦的MCX微控制器产品组合代表了电机控制技术的重大进步,提供了一整套外设,专用于优化移动机器人应用中的电机控制。

FlexPWM模块具有较高的灵活性和可靠性,支持精确电机控制,而正交解码器 (QDC) 模块则提供闭环控制系统所需的精确位置和速度反馈。AOI/EVTG模块增加了一层可编程逻辑,使开发人员能够创建自定义硬件触发器,并分流主处理器的事件检测功能。图片

本文作者

1716514975878190.jpg

Altaf Hussain,恩智浦半导体运输与移动细分市场市场总监,在企业、服务提供商和工业应用的应用工程、产品营销和业务开拓方面拥有30多年的经验。他目前担任恩智浦运输与移动部门的负责人,该部门专注于移动机器人、机器视觉和仓库物流自动化领域。Altaf致力于制定系统解决方案,帮助客户借助自主移动机器人加速自动化进程。他拥有英国伦敦南岸大学的电气与电子工程学士学位。

来源:NXP客栈

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 14
电机已经深入到人们生活的每个角落。从小型消费品到大型工业设备,风扇、泵、电动工具、吸尘器、洗衣机、空调、冰箱、汽车、机床、机器人等等都需要电机来提供驱动力。

更高效的电机

电动机是一种将电能转化为机械能的装置。在能量转化过程中降低损耗,提升系统的效率是电动机控制、电动机驱动和电机设计中的永恒主题。

随着碳排放达成共识和环境革命的到来,电机控制需要工业电机和驱动器不断提高效率,降低成本,提高一体化水平,支持新技术进入市场,并提高安全性和可靠性。

为了提高电机系统的效率,电机控制技术大有可为。通过采用性能更高、集成度更高的半导体器件,功能强大且安全的微控制器,更智能的传感器,结合更优化的软件算法,可实现提升效率、降低损耗的目的。

更智能的电机

电机智能化是实现智能工业的重要一环。电机控制的智能化可以从两个方面来实现。

扩展感知范围,在电机控制方案中加入更多传感器,如振动传感器,通过振动来监测电机的运行状态,在发生故障之前提前感知,并进行维护或者自动修复。

采用针对电机控制优化的MCU,并且添加丰富的外设功能,如高速ADC、栅极驱动器、电源模块,及电机控制PWM等等;而在软件方面,可以加入更多的AI算法,比如环境感知信息的处理算法、自身参数的识别算法等。

ST深耕工业电机控制市场超过20年,从传统耐用可靠的电机控制方案到现代高效智能的电机控制方案,ST能够提供性能强大的STM32 MCU、MPU和面向STM32一站式的电机控制解决方案;此外,完善的生态系统(包括一系列的评估板,参考设计,固件和开发工具链),将简化工业电机控制系统设计,加快产品上市。

为电机控制而优化的STM32 MCU

针对电机控制市场,ST定义了一系列具有竞争力的MCU产品,支持从入门级到主流应用,以及面向高端市场的电机控制需求:

可平替8位/16位MCU的STM32C0系列

基于Arm Cortex-M0+ 内核,主频48 MHz,采用90nm工艺,让用户以低于8位MCU的普惠价格,拥有32位MCU的性能,不仅可让开发人员事半功倍,还将在8位/16位微控制器的典型应用领域开疆拓土。STM32C0提供9种微型封装,从最小的SO8N到最大的LQFP48,从8pin到48pin。新上市的STM32C071还将引脚拓展至64pin,并拥有128 KB 闪存和 24 KB 的 RAM,内存配置翻了两番,同时配有无晶振 USB 控制器,可简化BOM、降低PCB布局的复杂性;额外的 SPI / I2C 接口和 32 位定时器,不仅为开发者提供降本增效的可能,还确保了STM32C071和STM32G0之间的引脚兼容性,为未来可能的产品移植提供便利。

STM32C0系列面向价格敏感的入门级电机控制类应用,如小家用、工业泵类、风扇控制等。

入门级STM32G0系列

基于64MHz Arm® Cortex®-M0+内核,该系列具有高效、简单、坚固耐用的特点,为高效微控制器必须具备的功能设定了新的定义。它内置12位ADC、DAC和比较器以及内置精确的内部时钟,以最小的BOM成本和最大的升级灵活性实现设计目标,让用户的投资物超所值。另外,它在传统的8位和16位市场中具有很强的竞争力,帮用户省去了管理不同架构的需求,并节省相关的开发费用。

STM32G0系列非常适合入门级电机控制类应用,如家用空调风机、冷柜压缩机、家用油烟机、高速电吹风、吸尘器、电动车控制器等。

主流STM32G4系列

基于170MHz Arm® Cortex®-M4内核,支持FPU和DSP指令,以及三种不同的硬件加速器:ART Accelerator™可针对控制回路进行优化加速、CCM-SRAM程序执行加速器,以及数学运算加速器。该系列还提供丰富的高级模拟外设,内置高达5个12位ADC、7个12位DAC、7个高速比较器和6个可编程运算放大器,集成了用于三相逆变器和全桥转换器驱动器的先进电机控制定时器。同时,该系列与STM32F3系列高度兼容,确保用户在设计不同性能等级的衍生应用时提供卓越的效率。

STM32G4系列非常适合主流电机控制类应用,如变频家用或中央空调、变频冰箱、高端智能洗衣机、电动工具、高端电动车等。

兼具高性能和安全性的STM32H5系列

基于强大的Arm® Cortex®-M33内核 ,运行频率高达250 MHz,从最基本的安全构建模块到ST维护的安全认证服务,提供可扩展的安全性,满足所有应用需求。STM32H5系列基于ST先进的40nm工艺,实现更优化的性价比平衡,提供丰富的内存,外设和封装选择,给用户带来更强劲的性能和安全性,提供更多设计自由,加快产品上市。

STM32H5延续STM32现有生态系统,有助于开发者轻松实现各类开发应用,还新增了一些特有的新功能,例如I3C通信接口,Secure manager,器件生命周期管理。适用的应用场景包括:智能家居,如空调系统、冰箱、报警系统;工厂自动化,如PLC、电机控制、工业泵;智能城市的通信网关、灯光控制、能量转换;以及键盘、跟踪装置、医疗配件等消费类应用。

面向高端应用的STM32H7系列

基于Arm® Cortex®-M7内核,运行频率高达600 MHz。具有单核和双核版本 (Cortex®-M7 + Cortex®-M4),获得了基于Cortex®-M的微控制器行业迄今最高的基准测试分数,高达3224 CoreMark。它具有出色的内存可扩展和灵活性,内置从64 KB到2 MB不等的嵌入式Flash存储器,564 KB到1.4 MB的嵌入式SRAM,以及高达200 MHz的超快外部存储器接口。

STM32H7系列为开发人员提供了更高的自由度,以适应未来最终用户对丰富、互联、强大和安全应用的需求,并满足不断变化的市场要求。

1.png

ST电机控制完整解决方案

除MCU产品外,ST还提供一系列面向不同终端应用的解决方案,包括家用电器、通用电机伺服控制以及电动工具类应用,为客户提供从控制器到驱动器及传感器的开箱即用软硬件集成方案。

2.png

STM32 电机控制软件及生态支持

从硬件开发板、软件工具和嵌入式软件,到培训资源和文档,STM32生态系统可全方位简化电机控制应用的开发:

  • 丰富的STM32/STM8(32位/8位)MCU产品组合,工业级,支持电机控制需求

  • 针对电机应用量身打造的数字和模拟外设

  • 各种嵌入式特性(在MC-SDK中提供)满足不同的应用需求


3.png

4.png

获取软硬件资源

通过软硬件开发工具的配合,ST为客户提供从硬件初始化到最终产品量产的全开发流程支持。用户可以通过访问STM32 MCU & MPU Eval Tools - STMicroelectronics 查询相关硬件参考板,访问ST-MC-SUITE - Online Motor Control solution finder for STM32 and STM8 products - STMicroelectronics 了解相关软件资源资源。

有关STM32电机控制的更多信息,以及下载包括HSO软件算法在内的新MCSDK v6.2,请访问https://www.st.com/en/embedded-software/x-cube-mcsdk.html

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 20

2024410提供超丰富半导体和电子元器件的业界知名新品引入 (NPI) 代理商贸泽电子 (Mouser Electronics) 即日起开售NXP SemiconductorsMCX工业和物联网微控制器 (MCU)。这些新款MCU属于高性能、低功耗微控制器,配备智能外设和加速器,适用于安全、智能的电机控制机器学习应用。

1.jpg

贸泽供应的NXP全新MCX N系列微控制器搭载Arm® Cortex®-M33 CPU,配备智能外设和加速器、通信和信号处理功能,可扩展性强,易于开发。MCX N的低功耗高速缓存提高了系统性能,双闪存和完整的ECC RAM则支持系统安全,提供了额外的保护。部分MCX N器件包含NXP面向机器学习应用的eIQ® Neutron神经处理单元 (NPU)。MCX N系列还包含EdgeLock®安全区域Core Profile,它通过设计本身来保障安全,提供具有不可变信任根和硬件加速加密的安全启动。

贸泽还代理NXP MCX A系列微控制器,该系列具有可扩展的器件选项、低功耗和智能外设,让设计人员可以选用更小封装,简化板卡设计。MCX A系列专为支持更多GPIO引脚以提供更多外部连接而设计,工作频率高达96MHz,集成度高,模拟性能优异且拥有各种外设,包括定时器和4Msps 12位ADC。定时器可以生成三组带有死区插入的互补脉宽调制 (PWM) 信号,4Msps 12位ADC则可以实现硬件窗口和平均功能。MCX A系列可提供对系统性能至关重要的功能,其创新型电源架构能够高效利用I/O并节省功耗,供电电路简单,占板面积小。

NXP Semiconductors FRDM-MCXN947FRDM-MCXA153快速检索和数据操纵器 (FRDM) 开发板是低成本、可扩展的紧凑型开发平台,可使用MCUXpresso开发工具快速进行原型开发。FRDM-MCXN947搭载MCX N系列,适用于各种具有高集成度、片上加速器、智能外设和高级安全性的应用。FRDM-MCXA153搭载具有可扩展器件选项、低功耗和智能外设的MCX A系列。

要进一步了解MCX N系列MCU,请访问https://www.mouser.cn/new/nxp-semiconductors/nxp-mcx-n-mcus/。有关MCX A系列详情,请访问 https://www.mouser.cn/new/nxp-semiconductors/nxp-mcx-a-mcus/

要进一步了解MCX FRDM开发板,请访问https://www.mouser.cn/new/nxp-semiconductors/nxp-mcx-n-boards/https://www.mouser.com/new/nxp-semiconductors/nxp-mcx-a-boards/

作为全球授权代理商,贸泽电子库存有丰富的半导体和电子元器件并支持随时发货。贸泽旨在为客户供应全面认证的原厂产品,并提供全方位的制造商可追溯性。为帮助客户加速设计,贸泽网站提供了丰富的技术资源库,包括技术资源中心、产品数据手册、供应商特定参考设计、应用笔记、技术设计信息、设计工具以及其他有用的信息。

工程师还可以一键订阅免费的贸泽电子报,及时了解业界新品动态和资讯。在订阅贸泽的电子报时,我们可以根据您不断变化的具体项目需求来提供相关的新闻报道和参考信息。贸泽充分尊重用户的权利,让您能自由掌控想要接收的内容。欢迎登陆https://sub.info.mouser.com/subscriber-sc注册,及时掌握新兴技术、行业趋势及更多资讯。

关于贸泽电子 (Mouser Electronics)

贸泽电子隶属于伯克希尔哈撒韦集团 (Berkshire Hathaway) 公司旗下,是一家授权电子元器件代理商,专门致力于向设计工程师和采购人员提供各产品线制造商的新产品。作为一家全球代理商,我们的网站mouser.cn能够提供多语言和多货币交易支持,提供超过1200品牌制造商680多万种产品。我们通过遍布全球的28个客户支持中心,为客户提供无时差的本地化贴心服务,并支持使用当地货币结算。我们从占地9.3万平方米的全球配送中心,将产品运送至全球223个国家/地区、超过65万个顾客的手中。更多信息,敬请访问:http://www.mouser.cn

围观 7

01、概述

空心杯电机(Hollow-Cup Motor)是一种特殊类型的微型无刷直流电机,具有空心的旋转部分。它通常由外部固定的外壳和内部旋转的空心杯组成。空心杯电机具有较高的功率密度和扭矩输出,适用于一些特定的应用场景,如精密仪器、机器人、医疗设备等。

空心杯电机的工作原理是基于无刷直流电机的原理。它采用无刷电机的结构,包括定子(固定部分)和转子(旋转部分)。定子包含一组永磁体,而转子则包含一组线圈。通过电流在线圈中的流动和永磁体之间的相互作用,产生电磁力,从而使转子旋转。

1.jpg

图1-1 空心杯电机结构

1.1空心杯电机的特点和优势

  • 空心结构:空心杯设计使得电机的旋转部分中心为空,可以通过空心轴传递其他信号、光线或气体,并且由于绕组无铁芯,转矩分布均匀。

  • 高功率密度:由于其紧凑的设计和高效的电机结构,空心杯电机具有较高的功率密度,可以在有限的空间内提供更大的扭矩输出。

  • 平滑运行:空心杯电机通常具有平滑的运行特性,可以提供稳定的转速和低噪音。

  • 高精度和可控性:空心杯电机的设计使得其具有较高的精度和可控性,适用于需要精确位置控制的应用。

  • 快速响应:由于其转动惯量小,空心杯电机能够快速响应控制信号,机械时间常数可以达到ms级,适用于需要高速动态响应的应用场景。

需要注意的是,空心杯电机由于结构紧凑的设计导致散热困难,并且其要实现高速和高精度的响应,因此空心杯电机的功率和扭矩都有一定的限制,需要根据具体工程问题选择合适的电机类型和配套的控制系统。

1.2应用场景

  • 机器人技术:空心杯电机广泛应用于机器人的关节驱动器中,能够提供高精度的运动控制和力矩输出。机器人的关节通常需要快速而准确地执行各种动作,而空心杯电机可以满足这些要求。

  • 自动化设备:在自动化设备中,如自动装配线、自动化仪器等,空心杯电机可用于驱动各种传送带、传送装置和旋转平台,以实现工件的快速、精确定位和搬运。

  • 医疗器械:空心杯电机在医疗器械中的应用广泛,例如手术机器人、医疗影像装置、药物输送系统等。这些应用需要高度精确的运动控制和定位,而空心杯电机能够提供稳定的力矩输出和高精度的位置控制。

  • 光学设备:在需要进行旋转、调焦、变焦等精密光学操作的设备中,如摄像机、望远镜、激光器等,空心杯电机可用于驱动相应的部件,实现精确的光路控制和图像稳定。

  • 回转平台:空心杯电机常被用于回转平台或转台,例如航天器的天线转动、摄影设备的平稳旋转等。通过空心杯电机的驱动,可以实现平稳、高速的旋转,并且减小了传动装置的尺寸和重量。

02、控制原理

2.1 霍尔传感器

霍尔传感器是一种基于霍尔效应原理的传感器,用于检测磁场的存在和变化。它通常由霍尔元件、信号调理电路和输出接口组成。霍尔元件是一种半导体材料,当其受到外部磁场的作用时,会产生一个电压信号。这个电压信号经过信号调理电路处理后,就可以输出给控制系统进行相应的处理。

霍尔传感器的工作原理基于霍尔效应,即当电流通过某些材料时,受到垂直于电流方向的磁场的影响,会在材料两侧产生一种电势差。这个电势差被称为霍尔电压,其大小与外部磁场的强度成正比。

霍尔传感器具有以下特点和优势:

  • 非接触式检测:霍尔传感器通过检测磁场,而无需与被检测物直接接触,从而避免了物理接触可能带来的摩擦和磨损。

  • 快速响应:由于霍尔传感器是基于半导体材料的电子器件,其响应速度非常快,可以实时检测和响应磁场变化。

  • 高精度:霍尔传感器能够提供精确的磁场测量和检测,可用于测量磁场的强度、方向和变化。

  • 宽工作温度范围:霍尔传感器具有较宽的工作温度范围,可以在高温或低温环境下正常工作。

  • 可靠性和耐用性:霍尔传感器不受机械磨损的影响,具有较长的使用寿命和可靠性。

  • 低功耗:霍尔传感器通常具有低功耗特性,适用于电池供电或对能源消耗敏感的应用。

在本次实验中,我们使用霍尔传感器对转子位置进行检测。通过将三个霍尔传感器相隔120°安装在电机定子的不同位置,即可根据霍尔传感器的电平信号确定电机转子的位置。下图是本次实验用到的霍尔真值表,理解真值表后对程序的编写有着重要作用:

2.png

图2-1 120°霍尔真值表

上图左为正转,右为反转。从上图可以看出,A、B、C三相霍尔传感器分别在空间上间隔120°放置,当转子的磁极运动到对应的霍尔传感器位置时,对应的相产生高电平,高电平的持续角度为180°(电角度,当电机极对数为1时也等于机械角度)。所以我们根据上面的真值表可以写出电机运行时的六种状态,以C相为高位:101、001、011、010、110、100;用十六进制的表示方式为:5、1、3、2、6、4,也就是说电机在正转时,霍尔传感器的信号只会按照513264的大小依次出现,在程序里读取对应霍尔引脚的电平状态即可判断此时电机转子的位置,这对于后续的方波控制尤为重要。

2.2 方波控制

方波控制是通过改变电机的输入电压信号来控制电机的转速和方向,这里的方波是指在电机运行过程中定子电流的波形近似方波。

3.png

图2-1 120°霍尔真值表

如果我们采用二二导通的方式,即同一时刻电机的绕组只有两相导通,本次实验的空心杯电机的内部为三角形连接,极对数为1。在一个电周期(360°)内,由上面提到的霍尔六种不同的状态来切换控制MOSFET的开通关断,使得定子电流也有六种状态,即定子绕组的合成磁动势有六种状态——所以,方波控制又被称为六步换相。

以上文的霍尔状态举例,当霍尔传感器传出信号为5时,控制VT1和VT6开通,其余关断,所以A相电流为正,B相电流为负;电机旋转至霍尔信号为1时,控制VT1和VT2开通,其余关断;以此类推,完整地经历过六个状态后,电机也就旋转完了一圈,再次进行上述步骤就可以使得电机连续运行。

那么电机为什么会这样运行呢,我们在这里用较为通俗的语言解释,如果读者有兴趣可以自行查阅相关资料。电机的定子通电后也具有磁性,根据“异性相吸”的原理,电机转子会向着通电的定子相运动直至二者“吸住”,如果在转子运动到对应“相吸”定子前的一瞬间,断掉该定子的供电而对顺着转子运动方向相隔120°的下一相定子供电,则转子又会与下一相定子“相吸”,如此往复即可使转子不断转动,上文的电路等效图对应相关定子相的供电。

4.png

图2-3 直流无刷电机定转子运动示意图

一个完整系统的方波控制步骤如下:

01)设置控制系统

确定控制系统的输入和输出接口,选择适当的控制器(如微控制器)和驱动电路。

02)确定转子位置

根据霍尔传感器信号的真值表,确定电机转子此时的位置。

03)确定换相顺序

根据转子的位置情况,确定电机定子的换相顺序,即图2-2中VT1-6的通断顺序。

04)控制电机转速

通过对MOS管VT输入PWM信号,该变占空比来控制平均电压的大小即可控制电机的转速。

05)控制电机方向

通过改变换相顺序的运行方向,可以控制电机的运动方向。

06)反馈控制(可选)

如果需要更精确的控制,可以使用更加灵敏的传感器,如编码器,来进一步监测电机的位置,在程序里使用对应算法(如PID)精确控制电机的位置和速度。

注意事项:

控制器的选择应考虑到方波控制的要求,如频率范围、引脚采样速度和分辨率等。驱动电路的设计应与电机的额定电压和电流匹配,并具备过流、过压等保护功能。在实际应用中,应注意电机的负载特性、惯性等因素对控制的影响,可能需要进行参数调整和系统优化。

04、CW32性能特点

本次实验采用的MCU为CW32F030C8T6,其性能特点如下:

  • 架构和处理能力:CW32F030C8T6采用了ARM Cortex-M0+处理器核心,具有高性能和低功耗的特点。Cortex-M0+是ARM架构中的一种32位处理器核心,适用于对功耗要求较高的应用场景。

  • 主频和存储器:CW32F030C8T6的主频可以高达48MHz,提供了较高的处理速度。它具有8KB的SRAM(静态随机存储器)和32KB的闪存(用于存储程序代码和数据),可用于存储应用程序和数据。

  • 低功耗特性:CW32F030C8T6在低功耗方面表现出色,具有多种省电模式和功耗管理功能,可实现对系统功耗的有效控制。这对于需要长时间运行的电池供电设备或对功耗敏感的应用非常重要。

  • 外设和接口:CW32F030C8T6提供了丰富的外设和接口,包括多个通用输入输出引脚(GPIO)、SPI(串行外设接口)、I2C(串行通信接口)、UART(通用异步收发器)等。这些接口可用于与外部传感器、存储器、通信模块等设备进行通信和连接。

  • 定时器和中断控制:CW32F030C8T6配备了多个定时器和中断控制功能,可用于实现精确的定时和事件触发。定时器可以用于生成精确的时间延迟、PWM(脉冲宽度调制)输出等应用,而中断控制则可以实现对外部事件的快速响应。

  • 安全性和保护机制:CW32F030C8T6提供了多种安全性和保护机制,包括存储器保护单元、访问控制等。这些机制可以帮助保护系统免受潜在的安全威胁和未授权访问。

本次实验我们使用了CW32的ATIM、GTIM、BTIM、ADC和DMA外设,下面分别简要介绍这五种外设。

3.1 高级定时器(ATIM)

高级定时器 (ATIM) 由一个 16 位的自动重载计数器和 7 个比较单元组成,并由一个可编程的预分频器驱动。ATIM 支持 6 个独立的捕获 / 比较通道,可实现 6 路独立 PWM 输出或 3 对互补 PWM 输出或对 6 路输入进行捕获。可 用于基本的定时 / 计数、测量输入信号的脉冲宽度和周期、产生输出波形(PWM、单脉冲、插入死区时间的互补 PWM 等)。在本次实验中,我们使用 ATIM 来产生PWM波驱动上桥。

5.png

图3-1 ATIM 功能框图

3.2 通用定时器(GTIM)

CW32F030 内部集成 4 个通用定时器 (GTIM),每个 GTIM 完全独立且功能完全相同,各包含一个 16bit 自动重装载计数器并由一个可编程预分频器驱动。GTIM 支持定时器模式、计数器模式、触发启动模式和门控模式 4 种基本工作模式,每组带 4 路独立的捕获 / 比较通道,可以测量输入信号的脉冲宽度(输入捕获)或者产生输出波形(输出比较和 PWM)。本次实验使用 GTIM 的输入捕获功能来触发获取霍尔传感器的数据。

6.png

图3-2 GTIM功能框图

3.3 基本定时器(BTIM)

CW32F030 内部集成 3 个基本定时器 (BTIM),每个 BTIM 完全独立且功能完全相同,各包含一个 16bit 自动重装载计数器并由一个可编程预分频器驱动。BTIM 支持定时器模式、计数器模式、触发启动模式和门控模式 4 种工作模式,支持溢出事件触发中断请求和 DMA 请求。得益于对触发信号的精细处理设计,使得 BTIM 可以由硬件自动执行触发信号的滤波操作,还能令触发事件产生中断和 DMA 请求。本次实验使用BTIM的定时器中断功能,10ms进入一次定时器中断,在中断中修改相关功能的标志位,在主函数的 while 循环里根据标志位判断相关功能本次是否执行。

7.png

图3-3 BTIM功能框图

3.4 模数转换器(ADC)

CW32F030 内部集成一个 12 位精度、最高 1M SPS 转换速度的逐次逼近型模数转换器 (SAR ADC),最多可将 16 路模拟信号转换为数字信号。现实世界中的绝大多数信号都是模拟量,如光、电、声、图像信号等,都要由 ADC 转换成数字信号,才能由 MCU 进行数字化处理。本次实验使用 ADC 采集电位器的电压值,根据电位器的电压大小控制目标值的设定。

8.png

图3-4 ADC 功能框图

3.5 直接内存访问(DMA)

CW32F030 支持直接内存访问(DMA),无需 CPU 干预,即可实现外设和存储器之间、外设和外设之间、存储器和存储器之间的高速数据传输。DMA 控制器内部的优先级仲裁器,可实现 DMA 和 CPU 对外设总线控制权的仲裁,以及多 DMA 通道之间的调度执行。本次实验使用 DMA 将 ADC 采集的数据写入内存,DMA 传输由 ADC 转换完成信号触发。

9.png

图3-5 DMA 功能框图

04、实验设备

4.1 CW32-BLDC电机驱动板

本次实验我们使用的无刷电机驱动板为CW32_BLDC_EVA V5开发板,其配置如下:

10.png

图4-1 CW32_BLCD_EVA 评估板资源配置图

4.2 空心杯电机与连接

本次实验使用的空心杯电机如下图:

11.jpg

图4-2 空心杯电机实物图

连接示意图如下:

12.jpg

图4-3 电机与驱动板连接示意图

下面展示电机驱动板的原理图:

13.png

图4-4 电机驱动板原理图1

14.png

图4-5 电机驱动板原理图2

15.png

图4-6 电机驱动板原理图3

05、程序编写

5.1 有霍尔方波开环控制程序

下面会将控制程序按照不同的功能模块向读者展示。

首先是与霍尔传感器相关的模块,存放在HALL.c文件中,先展示HALL.h文件的内容:

#ifndef _HALL_H_
#define _HALL_H_
#include "cw32f030_rcc.h"
#include "cw32f030_gpio.h"
#include "cw32f030_gtim.h"
#define HALLA_PORT         (CW_GPIOA)
#define HALLB_PORT         (CW_GPIOB)
#define HALLC_PORT         (CW_GPIOA)
#define HALLA_PIN          (GPIO_PIN_15)
#define HALLB_PIN          (GPIO_PIN_3)
#define HALLC_PIN          (GPIO_PIN_2)

extern void Commutation(unsigned int step,unsigned int OutPwmValue,unsigned int PWM_ON_flag);
extern void GTIM2_IRQHandler(void); 

void HALL_Init(void);
unsigned char  HALL_Check(void);
#endif

HALL.c文件

#include "HALL.h"uint8_t ErrorCode;                                           //电机运行错误代码
extern uint8_t Motor_Start_F;                                //电机启动运行标志
extern uint8_t Cur_Step;                                     //当前HALL状态
extern uint8_t Direction;                                    //电机方向,0为正转,1为反转
const uint8_t STEP_TAB[2][6] = {{4,0,5,2,3,1},{1,3,2,5,0,4}};//电机换相序号
extern uint32_t HALLcount;                                   //霍尔脉冲计数
extern uint32_t OutPwm;                                      //输出PWM值
//初始化霍尔传感器要用到的GPIO和定时器
void HALL_Init(void)
{  
    __RCC_GTIM2_CLK_ENABLE();                    //先打开对应时钟  
    __RCC_GPIOA_CLK_ENABLE();  
    __RCC_GPIOB_CLK_ENABLE();   
    
    GPIO_InitTypeDef GPIO_InitStruct;            //再配置对应接口  
    GPIO_InitStruct.IT = GPIO_IT_NONE;  
    GPIO_InitStruct.Mode =GPIO_MODE_INPUT_PULLUP;//霍尔输入配置;  
    GPIO_InitStruct.Pins = HALLA_PIN | HALLC_PIN;//PA15和PA2  
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;  
    GPIO_Init(HALLA_PORT, &GPIO_InitStruct);   
    
    GPIO_InitStruct.IT = GPIO_IT_NONE;  
    GPIO_InitStruct.Mode =GPIO_MODE_INPUT_PULLUP;// 霍尔输入配置;  
    GPIO_InitStruct.Pins = HALLB_PIN;            //PB3  
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;  
    GPIO_Init(HALLB_PORT, &GPIO_InitStruct);   
    
    PA15_AFx_GTIM2CH1();                         //GTIM2CH1();  
    PB03_AFx_GTIM2CH2();                         //GTIM2CH2();  
    PA02_AFx_GTIM2CH3();                         //GTIM2CH3();   
    
    __disable_irq();   
    NVIC_EnableIRQ(GTIM2_IRQn);                  //配置GTIM2输入捕获中断  
    __enable_irq();   GTIM_InitTypeDef GTIM_InitStruct;            //这里使用GTIM2的输入捕获功能  
    
    GTIM_ICInitTypeDef GTIM_ICInitStruct;   
    GTIM_InitStruct.Mode = GTIM_MODE_TIME;  
    
    GTIM_InitStruct.OneShotMode = GTIM_COUNT_CONTINUE;  
    GTIM_InitStruct.Prescaler = GTIM_PRESCALER_DIV1;  
    GTIM_InitStruct.ReloadValue = 0xFFFF;  
    GTIM_InitStruct.ToggleOutState = DISABLE;  
    GTIM_TimeBaseInit(CW_GTIM2, &GTIM_InitStruct);  
    GTIM_ICInitStruct.CHx = GTIM_CHANNEL1;       //GTIM2捕获通道配置  
    GTIM_ICInitStruct.ICFilter = GTIM_CHx_FILTER_PCLK_N2;  
    GTIM_ICInitStruct.ICInvert = GTIM_CHx_INVERT_OFF;  
    GTIM_ICInitStruct.ICPolarity = GTIM_ICPolarity_BothEdge;  
    GTIM_ICInit(CW_GTIM2, &GTIM_ICInitStruct);  
    GTIM_ICInitStruct.CHx = GTIM_CHANNEL2;  
    GTIM_ICInit(CW_GTIM2, &GTIM_ICInitStruct); 
      
    GTIM_ICInitStruct.CHx = GTIM_CHANNEL3;  
    GTIM_ICInit(CW_GTIM2, &GTIM_ICInitStruct);   
    
    GTIM_ITConfig(CW_GTIM2, GTIM_IT_CC1 | GTIM_IT_CC2 | GTIM_IT_CC3, ENABLE);  
    GTIM_Cmd(CW_GTIM2, ENABLE);
}
unsigned char  HALL_Check(void)                 //读取霍尔状态,确定换相顺序
{  
    static unsigned char hallerrnum=0;   
    unsigned char Hall_State=0;   
    
    if(PA15_GETVALUE()!=0)Hall_State=0x1;         //对每个引脚状态分别判断,所以三个if而不是else if  
    if(PB03_GETVALUE()!=0)Hall_State|=0x2;        //或运算 010  
    if(PA02_GETVALUE()!=0)Hall_State|=0x4;        //或运算 100  
    if(Hall_State==0||Hall_State==7)              //000或者111都是异常状态    
    {      
        hallerrnum++;      
        if(hallerrnum>=10)      
        {
            hallerrnum=10;
            ErrorCode=2;
        }              //持续异常状态说明霍尔传感器有问题    
    }  
    else hallerrnum=0;  
    return Hall_State;
}
void GTIM2_IRQHandler(void)   //在GTIM2的中断服务程序里对霍尔脉冲计数、霍尔状态确定、换相确定
{          
    uint32_t Hall_State;         
    /* USER CODE BEGIN */  
    if (GTIM_GetITStatus(CW_GTIM2, GTIM_IT_CC1))        //捕获输入变化就产生中断标志  
    {    
        GTIM_ClearITPendingBit(CW_GTIM2, GTIM_IT_CC1);    //清除中断标志  
    }  
    else if (GTIM_GetITStatus(CW_GTIM2, GTIM_IT_CC2))  
    {        
        GTIM_ClearITPendingBit(CW_GTIM2, GTIM_IT_CC2);  
    }  
     
    else if (GTIM_GetITStatus(CW_GTIM2, GTIM_IT_CC3))  
    {        
        GTIM_ClearITPendingBit(CW_GTIM2, GTIM_IT_CC3);  
    }   
    
    HALLcount++;                                       //霍尔脉冲计数           
    Hall_State=HALL_Check();                           //读取霍尔状态   
    Cur_Step=STEP_TAB[Direction][Hall_State-1];        //获取换相序位,例如霍尔变化为513264,则Cur_Step变化为345012   
    if(Motor_Start_F==1&&ErrorCode==0)                 //根据启停状态 换相     
     Commutation(Cur_Step,OutPwm,Motor_Start_F);             
    /* USER CODE END */
}

与电机相关的BLDC模块:

BLDC.h

#include "main.h"
/***********************                PWM        definition   *************************/
#define PWM_HN_PORT                 (CW_GPIOA)      //上管引脚
#define PWM_LN_PORT                 (CW_GPIOB)      //下管引脚
#define PWM_AH_PIN                  (GPIO_PIN_8)
#define PWM_BH_PIN                  (GPIO_PIN_9)
#define PWM_CH_PIN                  (GPIO_PIN_10)
#define PWM_AL_PIN                  (GPIO_PIN_13)
#define PWM_BL_PIN                  (GPIO_PIN_14)
#define PWM_CL_PIN                  (GPIO_PIN_15)
//上管PWM调制控制,下管GPIO开关控制, 上管高电平开关管导通,下管反相
#define PWM_AL_OFF GPIO_WritePin(PWM_LN_PORT,PWM_AL_PIN,GPIO_Pin_SET)
#define PWM_BL_OFF GPIO_WritePin(PWM_LN_PORT,PWM_BL_PIN,GPIO_Pin_SET)
#define PWM_CL_OFF GPIO_WritePin(PWM_LN_PORT,PWM_CL_PIN,GPIO_Pin_SET)
#define PWM_AL_ON GPIO_WritePin(PWM_LN_PORT,PWM_AL_PIN,GPIO_Pin_RESET)
#define PWM_BL_ON GPIO_WritePin(PWM_LN_PORT,PWM_BL_PIN,GPIO_Pin_RESET)
#define PWM_CL_ON GPIO_WritePin(PWM_LN_PORT,PWM_CL_PIN,GPIO_Pin_RESET)
#define PWM_FRQ                        (20000)       //PWM频率(HZ)
#define PWM_TS                         3200//20K 

#define OUTMAXPWM  PWM_TS*0.25
#define OUTMINPWM  PWM_TS*0.005 
void BLDC_Init(void);
void BLDC_Motor_Start(uint8_t Dir);
void BLDC_Motor_Stop(void);
void Commutation(unsigned int step,unsigned int OutPwmValue,unsigned int PWM_ON_flag);
void UPPWM(void);         //更新PWM占空比
/////////////////////////

BLDC.c

#include "BLDC.h"
extern const uint8_t STEP_TAB[2][6];//电机换相序号
uint8_t Cur_Step;                   //当前HALL状态
uint8_t STEP_last;                  //上次HALL状态
extern uint8_t Direction;           //电机方向,0为正转,1为反转
extern uint8_t Motor_Start_F;       //电机启动运行标志
uint32_t OutPwm;                    //PWM占空比//初始化电机要用到的GPIO和定时器,上桥为PWM,下桥为引脚电平控制
void BLDC_Init(void)
{  
    __RCC_ATIM_CLK_ENABLE();            
    __RCC_GPIOA_CLK_ENABLE();  
    __RCC_GPIOB_CLK_ENABLE();   
    
    //初始化下管GPIO  
    GPIO_InitTypeDef GPIO_InitStruct;  
    GPIO_InitStruct.IT = GPIO_IT_NONE;  
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  G
    PIO_InitStruct.Pins = PWM_AL_PIN | PWM_BL_PIN | PWM_CL_PIN;  
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;  
    GPIO_Init(PWM_LN_PORT,&GPIO_InitStruct);  
    
    //初始化上管
    GPIO  GPIO_InitStruct.Pins = PWM_AH_PIN | PWM_BH_PIN | PWM_CH_PIN;  
    GPIO_Init(PWM_HN_PORT,&GPIO_InitStruct);  
     
    PWM_AL_OFF; PWM_BL_OFF;PWM_CL_OFF;   //初始化先关闭下管   
    
    //初始化ATIM的PWM通道  
    ATIM_InitTypeDef ATIM_InitStruct;  
    ATIM_OCInitTypeDef ATIM_OCInitStruct;   
    
    PA08_AFx_ATIMCH1A();               //上管ABC三相  
    PA09_AFx_ATIMCH2A();  
    PA10_AFx_ATIMCH3A();   
    
    ATIM_InitStruct.BufferState = DISABLE;  
    ATIM_InitStruct.ClockSelect = ATIM_CLOCK_PCLK;  
    ATIM_InitStruct.CounterAlignedMode = ATIM_COUNT_MODE_EDGE_ALIGN;  
    ATIM_InitStruct.CounterDirection = ATIM_COUNTING_UP;  
    ATIM_InitStruct.CounterOPMode = ATIM_OP_MODE_REPETITIVE;  
    ATIM_InitStruct.OverFlowMask = DISABLE;  
    ATIM_InitStruct.Prescaler = ATIM_Prescaler_DIV1;    // 计算时钟1MHz  
    ATIM_InitStruct.ReloadValue = PWM_TS - 1;           // 20K   
    ATIM_InitStruct.RepetitionCounter = 0;  
    ATIM_InitStruct.UnderFlowMask = DISABLE;  
    ATIM_Init(&ATIM_InitStruct);  
    //初始化PWM通道  
    ATIM_OCInitStruct.BufferState = DISABLE;  
    ATIM_OCInitStruct.OCDMAState = DISABLE;  
    ATIM_OCInitStruct.OCInterruptSelect = ATIM_OC_IT_UP_COUNTER;  
    ATIM_OCInitStruct.OCInterruptState = ENABLE;  
    ATIM_OCInitStruct.OCMode = ATIM_OCMODE_PWM1;  
    ATIM_OCInitStruct.OCPolarity = ATIM_OCPOLARITY_NONINVERT;  
    ATIM_OC1AInit(&ATIM_OCInitStruct);  
    ATIM_OC2AInit(&ATIM_OCInitStruct);  
    ATIM_OC3AInit(&ATIM_OCInitStruct);  
    ATIM_SetCompare1A(0);        //初始化先关闭上管  
    ATIM_SetCompare2A(0);  
    ATIM_SetCompare3A(0);  
    ATIM_PWMOutputConfig(OCREFA_TYPE_SINGLE, OUTPUT_TYPE_COMP, 0);  
    ATIM_CtrlPWMOutputs(ENABLE);  
    ATIM_Cmd(ENABLE);}void ATIM_IRQHandler(void)
    {  
        if (ATIM_GetITStatus(ATIM_IT_OVF))  
        {    
            ATIM_ClearITPendingBit(ATIM_IT_OVF);                  
        }
    }

//step,为当前换相序号,OutPwmValue 输出PWM值,PWM_ON_flag=1时启动PWM输出
void Commutation(unsigned int step,unsigned int OutPwmValue,unsigned int PWM_ON_flag)
{ 
    if(PWM_ON_flag==0) //不启动则关闭输出   
    {     
        CW_ATIM->CH1CCRA=0;CW_ATIM->CH2CCRA=0;CW_ATIM->CH3CCRA=0;            
        ATIM_CtrlPWMOutputs(DISABLE);     
        PWM_AL_OFF;PWM_BL_OFF;PWM_CL_OFF;     
        return;   
    }     
    PWM_AL_OFF;PWM_BL_OFF;PWM_CL_OFF;           //先关闭输出,避免意外     
    //输出上桥     
    if(step==0||step==1){   CW_ATIM->CH1CCRA=OutPwmValue;CW_ATIM->CH2CCRA=0;CW_ATIM->CH3CCRA=0;        } //0:AB; 1:AC    
    if(step==2||step==3){         CW_ATIM->CH1CCRA=0;CW_ATIM->CH2CCRA=OutPwmValue;CW_ATIM->CH3CCRA=0;        } //2:BC; 3:BA     
    if(step==4||step==5){         CW_ATIM->CH1CCRA=0;CW_ATIM->CH2CCRA=0;CW_ATIM->CH3CCRA=OutPwmValue;        } //4:CA; 5:CB      
    
    //输出下桥     
    if(step==0||step==5){PWM_AL_OFF;PWM_CL_OFF;PWM_BL_ON;}       //AB CB ; B下桥导通     
    else if(step==1||step==2){PWM_AL_OFF;PWM_BL_OFF;PWM_CL_ON;}//AC BC; C下桥导通     
    else if(step==3||step==4){PWM_BL_OFF;PWM_CL_OFF;PWM_AL_ON;}//BA CA; A下桥导通      
    
    ATIM_CtrlPWMOutputs(ENABLE);         //输出有效     
    STEP_last = step;
}
void UPPWM(void)         //更新PWM占空比
{          
    if(STEP_last==0||STEP_last==1){         CW_ATIM->CH2CCRA=0;CW_ATIM->CH3CCRA=0; CW_ATIM->CH1CCRA=OutPwm;        }  
    if(STEP_last==2||STEP_last==3){         CW_ATIM->CH1CCRA=0;CW_ATIM->CH3CCRA=0;CW_ATIM->CH2CCRA=OutPwm;        }  
    if(STEP_last==4||STEP_last==5){         CW_ATIM->CH1CCRA=0;CW_ATIM->CH2CCRA=0;CW_ATIM->CH3CCRA=OutPwm;        }
}
void BLDC_Motor_Start(uint8_t Dir)  //启动电机
{           
    uint32_t x;     
    
    x=HALL_Check();  
    if(x==0||x==7) {x=1;}           //如果霍尔异常,输出一项,使电机先转起来  
    Cur_Step=STEP_TAB[Direction][x-1];  
    Motor_Start_F = 1;  
    OutPwm = OUTMINPWM;  
    Commutation(Cur_Step,OutPwm,Motor_Start_F);
}
void BLDC_Motor_Stop(void)         //停止电机
{  
    Motor_Start_F = 0;  
    Commutation(Cur_Step,OutPwm,Motor_Start_F);;
}

与测速(BTIM1)相关的文件:Speed_Measure.h

#ifndef _SPEED_MEASURE_H_
#define _SPEED_MEASURE_H_
#include "cw32f030_btim.h"
#include "cw32f030_rcc.h"
void Speed_Measure_Init(void);
#endif

Speed_Measure.c

#include "Speed_Measure.h"
extern uint32_t HALLcount;           //霍尔脉冲计数
extern uint16_t ADC_TimeCount;       //电位器ADC采样计算计数
extern uint16_t Hall_TimeCount;      //计数,进了2次BTIM1中断,即20ms对转速计算一次
extern uint16_t OLED_FRESH_TimeCount;//计数,500ms刷新一次OLED显示
void Speed_Measure_Init(void)        //BTIM1 10ms进一次中断,在中断里改变标志位           
{  
    __RCC_BTIM_CLK_ENABLE();  
    __disable_irq();   
    NVIC_EnableIRQ(BTIM1_IRQn);   
    __enable_irq();   
    
    BTIM_TimeBaseInitTypeDef BTIM_InitStruct;  
    BTIM_InitStruct.BTIM_Mode = BTIM_Mode_TIMER;  
    BTIM_InitStruct.BTIM_OPMode = BTIM_OPMode_Repetitive;  
    BTIM_InitStruct.BTIM_Prescaler = BTIM_PRS_DIV64;  
    BTIM_InitStruct.BTIM_Period = 10000;             
    BTIM_TimeBaseInit(CW_BTIM1, &BTIM_InitStruct);  
    BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE);  
    BTIM_Cmd(CW_BTIM1, ENABLE);
}        
void BTIM1_IRQHandler(void)
{  
    /* USER CODE BEGIN */  
    if(BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))  
    {      
        BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV);    
        Hall_TimeCount++;        //计数,进了2次BTIM1中断,即20ms对转速计算一次    
        ADC_TimeCount++;         //计数,100ms检查一次电位器的电压大小,确定目标速度    
        OLED_FRESH_TimeCount++;  //计数,500ms刷新一次OLED显示  
    }  
    /* USER CODE END */
}

与电位器输入有关的文件:ADC_BLDC_Ctrl.h

#ifndef _ADC_BLDC_CTRL_H_
#define _ADC_BLDC_CTRL_H_
#include "cw32f030_rcc.h"
#include "cw32f030_gpio.h"
#include "cw32f030_adc.h"
#include "cw32f030_dma.h"
void ADC_Configuration(void);
void ADC_DMA_Trans(void);
uint32_t ADC_SampleTarget(void);
#endif

ADC_BLDC_Ctrl.c

#include "ADC_BLDC_Ctrl.h"
uint32_t ADC_Result_Array;//ADC采集电位器的值,使用了DMA传输
void ADC_Configuration(void)
{  
    RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_DMA | RCC_AHB_PERIPH_GPIOB, ENABLE);  //开启DMA和ADC使用GPIO引脚的时钟  
    RCC_APBPeriphClk_Enable2(RCC_APB2_PERIPH_ADC, ENABLE);    //开启ADC时钟  
    PB00_ANALOG_ENABLE();  //配置ADC测试IO口  电位器接口   
    
    //ADC初始化  
    ADC_InitTypeDef   ADC_InitStruct;           
    ADC_InitStruct.ADC_OpMode = ADC_SingleChContinuousMode;   
    ADC_InitStruct.ADC_ClkDiv = ADC_Clk_Div8;          //PCLK 8MHz  
    ADC_InitStruct.ADC_SampleTime = ADC_SampTime10Clk; //10个ADC时钟周期  
    ADC_InitStruct.ADC_VrefSel = ADC_Vref_VDDA;        //外部3.3V参考电压  
    ADC_InitStruct.ADC_InBufEn = ADC_BufDisable;       //开启跟随器  
    ADC_InitStruct.ADC_TsEn = ADC_TsDisable;           //内置温度传感器禁用  
    ADC_InitStruct.ADC_DMAEn = ADC_DmaEnable;          //ADC转换完成触发DMA传输  
    ADC_InitStruct.ADC_Align = ADC_AlignRight;         //ADC转换结果右对齐  
    ADC_InitStruct.ADC_AccEn = ADC_AccDisable;         //转换结果累加不使能  
    ADC_Init(&ADC_InitStruct);                         //初始化ADC配置  
    CW_ADC->CR1_f.DISCARD = FALSE;                     //配置数据更新策略,覆盖未被读取的旧数据,保留新数据  
    CW_ADC->CR1_f.CHMUX = ADC_ExInputCH8;              //配置ADC输入通道   
    
    //ADC使能  
    ADC_Enable();      
    ADC_SoftwareStartConvCmd(ENABLE);   
    
    //配置DMA  
    DMA_InitTypeDef   DMA_InitStruct;  
    DMA_StructInit( &DMA_InitStruct );  
    DMA_InitStruct.DMA_Mode = DMA_MODE_BLOCK;        //该模式在传输过程中会被更高级的响应打断  
    DMA_InitStruct.DMA_TransferWidth = DMA_TRANSFER_WIDTH_32BIT;//传输32位  
    DMA_InitStruct.DMA_SrcInc = DMA_SrcAddress_Fix;  //源地址增量方式固定  
    DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Fix;  //目的地址增量方式固定  
    DMA_InitStruct.DMA_TransferCnt =60000;             
    DMA_InitStruct.DMA_SrcAddress = (uint32_t) &(CW_ADC->RESULT0);//(0x00000020) RESULT0  
    DMA_InitStruct.DMA_DstAddress = (uint32_t)&ADC_Result_Array;  
    DMA_InitStruct.TrigMode = DMA_HardTrig;          //硬件触发  
    DMA_InitStruct.HardTrigSource = DMA_HardTrig_ADC_TRANSCOMPLETE; //ADC采集完成触发  
    DMA_Init(CW_DMACHANNEL3,&DMA_InitStruct);  
    DMA_ClearITPendingBit(DMA_IT_ALL);  
    DMA_ITConfig(CW_DMACHANNEL3, DMA_IT_TC|DMA_IT_TE , ENABLE);     //使能DMA_CHANNEL3中断  
    DMA_Cmd(CW_DMACHANNEL3, ENABLE);                 //使能DMA
}
void ADC_DMA_Trans(void)
{  
    if (CW_DMA->ISR_f.TC3)  
    { //AD DMA 启动   
      CW_DMA->ICR_f.TC3 = 0;            
      CW_DMACHANNEL3->CNT=bv16|60000;         //MUST RET AGAIN BEFORE 
      CW_DMACHANNEL1->CNT=0    CW_DMACHANNEL3->CSR_f.EN = 1;                   
    }
}
uint32_t ADC_SampleTarget(void)            //采集电压
{  
    uint32_t Target = 0;   
    
    if(ADC_Result_Array >= 4000)Target = 4000;//限制大小,12位ADC采集值为:0-4096  
    else if(ADC_Result_Array < 3)Target = 0;  
    else Target = ADC_Result_Array;  
    return Target;
}

与显示有关的驱动函数由于篇幅原因不在此展示,下面展示main.c的内容:

#include "main.h"
uint8_t Direction;                //电机方向,0为正转,1为反转
uint8_t Motor_Start_F=0;          //电机启动运行标志
uint16_t ADC_TimeCount=0;         //电位器ADC采样计时计数
uint16_t Hall_TimeCount=0;        //霍尔计时计数
uint16_t OLED_FRESH_TimeCount=0;  //OLED刷新显示计时计数
uint32_t HALLcount=0;             //霍尔脉冲计数
uint32_t Motor_Speed = 0;         //电机实际转速,rpm 
extern uint32_t OutPwm;
char Buffer1[48],Buffer2[48];
uint32_t Pwm_Buffer;
int main()
{  
    RCC_Configuration();            //时钟树初始化  
    I2C_init();                                        //OLED初始化  
    I2C_OLED_Init();                //I2C初始化  
    BLDC_Init();                    //电机初始化  
    HALL_Init();                    //霍尔传感器初始化  
    Speed_Measure_Init();           //BTIM1初始化  
    ADC_Configuration();            //ADC初始化  
    I2C_OLED_Clear(1);      
            //清屏   
    Direction = 1;     //电机方向   
    
    sprintf(Buffer1,"Speed:%d rpm   ",Motor_Speed); //显示电机转速  
    sprintf(Buffer2,"PWM:%d %%   ",Pwm_Buffer);     //显示PWM占空比  
    I2C_OLED_ShowString(0,0,Buffer1);          
    I2C_OLED_ShowString(0,15,Buffer2);  
    I2C_OLED_UPdata();    
    
    while(1)  
    {    
        ADC_DMA_Trans();          //DMA传输完毕则允许下一次传输     
        
        if(ADC_TimeCount > 10)    //100ms检查一次目标速度    
        {      
            ADC_TimeCount = 0;      
            OutPwm = ADC_SampleTarget() / 5;                   //设置占空比      
            if(OutPwm > 0 && Motor_Start_F == 0)BLDC_Motor_Start(Direction);//转速大于1000rpm才启动电机      
            else if(OutPwm > 0 && Motor_Start_F == 1)UPPWM();  //更新占空比      
            else BLDC_Motor_Stop(); //停止电机    
        }     
        if(Hall_TimeCount > 1)   //20ms测一次速    
        {      
            Hall_TimeCount = 0;      
            Motor_Speed = HALLcount * 500 / MotorPoles;  //转速计算,rpm      
            HALLcount = 0;    
        }     
        
        if(OLED_FRESH_TimeCount > 50)  //500ms OLED显示刷新一次    
        {      
            OLED_FRESH_TimeCount = 0;      
            sprintf(Buffer1,"Speed:%d rpm   ",Motor_Speed);    //显示电机转速      
            I2C_OLED_ShowString(0,0,Buffer1);       
            
            Pwm_Buffer = OutPwm/32;     //最大25%对应OutPwm的值:800      
            sprintf(Buffer2,"PWM:%d %%   ",Pwm_Buffer);        //显示占空比      
            I2C_OLED_ShowString(0,15,Buffer2);      
            I2C_OLED_UPdata();    
        }  
    }
}
void RCC_Configuration(void)
{  
    RCC_HSI_Enable(RCC_HSIOSC_DIV6);  
    /* 1. 设置HCLK和PCLK的分频系数 */  
    RCC_HCLKPRS_Config(RCC_HCLK_DIV1);  
    RCC_PCLKPRS_Config(RCC_PCLK_DIV1);  
    /* 2. 使能PLL,通过HSI倍频到64MHz */  
    RCC_PLL_Enable(RCC_PLLSOURCE_HSI, 8000000, 8);       
    // PLL输出频率64MHz  
    /*< 当使用的时钟源HCLK大于24M,小于等于48MHz:设置FLASH 读等待周期为2 cycle  
    < 当使用的时钟源HCLK大于48M,小于等于72MHz:设置FLASH 读等待周期为3 cycle */      
    __RCC_FLASH_CLK_ENABLE();  
    FLASH_SetLatency(FLASH_Latency_3);  
    /* 3. 时钟切换到PLL */  
    RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL);  
    RCC_SystemCoreClockUpdate(64000000);
}

最终的实验结果如下:

16.jpg

图5-1 有霍尔方波开环控制无刷直流空心杯电机

5.2 有霍尔方波闭环控制程序

闭环程序与开环程序相比,分别在main.c、Speed_Measure.c、ADC_BLDC_Ctrl.c文件中略有变化,同时新增了PID.c文件用于控制。

首先是main.c文件中的变化,新增了变量Flag_PID_TimeCount、Target_Speed,函数修改如下:

int main()
{  
    RCC_Configuration();            //时钟树初始化  
    I2C_init();                     //OLED初始化  
    I2C_OLED_Init();                //I2C初始化  
    BLDC_Init();                    //电机初始化  
    HALL_Init();                    //霍尔传感器初始化  
    Speed_Measure_Init();           //BTIM1初始化  
    PID_Init();                     //PID初始化  
    ADC_Configuration();            //ADC初始化  
    I2C_OLED_Clear(1);              //清屏  
     
    Direction = 1;     //电机方向   
    
    sprintf(Buffer1,"Target:%d rpm",Target_Speed);  //显示目标速度  
    sprintf(Buffer2,"Speed:%d rpm   ",Motor_Speed); //显示电机转速  
    I2C_OLED_ShowString(0,0,Buffer1);  
    I2C_OLED_ShowString(0,15,Buffer2);          
    I2C_OLED_UPdata();    
    while(1)  
    {    
        ADC_DMA_Trans();          //DMA传输完毕则允许下一次传输    
        if(ADC_TimeCount > 10)    //100ms检查一次目标速度    
        {      
            ADC_TimeCount = 0;       
            Target_Speed = ADC_SampleTarget();  //采集目标速度  
                
            if(Target_Speed > 1000 && Motor_Start_F == 0)BLDC_Motor_Start(Direction);//转速大于1000rpm才启动电机      
            else if(Target_Speed > 1000 && Motor_Start_F == 1);  //没有操作,避免重复启动      
            else BLDC_Motor_Stop(); //停止电机    
        }     
        
        if(Hall_TimeCount > 1)   //20ms测一次速    
        {      
            Hall_TimeCount = 0;      
            Motor_Speed = HALLcount * 500 / MotorPoles;  //转速计算,HALLcount * 50 * 60 / 6 ,单位rpm      
            HALLcount = 0;    
        }     
        if(Flag_PID_TimeCount > 1) //20ms PID控制一次    
        {      
            Flag_PID_TimeCount = 0;      
            PID_Ctrl(Target_Speed);    
        }     
        
        if(OLED_FRESH_TimeCount > 50)  //500ms OLED显示刷新一次    
        {      
            OLED_FRESH_TimeCount = 0;      
            sprintf(Buffer1,"Target:%d rpm   ",Target_Speed);  //显示目标速度      
            sprintf(Buffer2,"Speed:%d rpm   ",Motor_Speed);    //显示电机转速      
            I2C_OLED_ShowString(0,0,Buffer1);      
            I2C_OLED_ShowString(0,15,Buffer2);              
            I2C_OLED_UPdata();    
        }  
    }      
}

Speed_Measure.c中对BTIM1的中断服务程序修改:

void BTIM1_IRQHandler(void)
{  
    /* USER CODE BEGIN */  
    if(BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))  
    {      
        BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV);     
        Hall_TimeCount++;        //计数,进了2次BTIM1中断,即20ms对转速计算一次    
        Flag_PID_TimeCount++;    //计数,进了2次BTIM1中断,即20ms对PID计算一次    
        ADC_TimeCount++;         //计数,100ms检查一次电位器的电压大小,确定目标速度    
        OLED_FRESH_TimeCount++;  //计数,500ms刷新一次OLED显示  
    }  
    /* USER CODE END */
}

ADC_BLDC_Ctrl.c中对电压采集函数作修改:

uint32_t ADC_SampleTarget(void)        //采集电压
{  
    uint32_t Target = 0;   
    
    if(ADC_Result_Array >= 4000)Target = 4000;//限制大小,12位ADC采集值为:0-4096  
    else if(ADC_Result_Array < 3)Target = 0;  
    else Target = ADC_Result_Array;   
  
    Target = Target * 5;                 //目标速度为采集值的5被则设置最大速度20000rpm,可自行修改   
    
    return Target;
}

新增PID文件如下:

#include "PID.h"
extern uint8_t Motor_Start_F;  //电机启动运行标志
extern uint32_t OutPwm;        //输出PWM值,PID最终计算要得到一个确定的PWM占空比输出值
extern uint32_t Motor_Speed;   //电机实际转速,rpm 
float V_Kp,V_Ki,V_Kd;
void PID_Init(void)
{  
    V_Kp = 25;  
    V_Ki = 5;  
    V_Kd = 0;
}
void PID_Ctrl(uint32_t Target)
{  
    static int Error,LastError;  
    int PID=0;   
    
    Error = Target - Motor_Speed;   
    
    PID = (V_Kp/1000) * (Error - LastError) + (V_Ki/1000) * Error;   
    
    if(PID>10)PID=10;         //牺牲响应速度换取稳定性,避免占空比从0突增到25   
    else if(PID<-10)PID=-10;   
    
    OutPwm += PID;   
    
    if(OutPwm > OUTMAXPWM)OutPwm = OUTMAXPWM;  //占空比输出限制  
    else if(OutPwm < OUTMINPWM)  
    {    
        if(Target > 100)OutPwm = OUTMINPWM;    
        else OutPwm = 0;  
    }   
    
    if(Motor_Start_F == 0)OutPwm = 0;         //启停判断  
    else if(Motor_Start_F == 1);  
    else OutPwm = 0;   
    
    UPPWM();                                  //更新占空比  
    LastError = Error;
}

最终实验结果如下:

17.jpg

图5-2 有霍尔方波闭环控制无刷直流空心杯电机

06、调试过程中的问题与小提示

在调试过程中,作者曾烧板四次,前面两次烧毁MOS管,后两次烧毁PCB供电,针对此种问题有三条注意事项:

程序在KEIL5在进入和退出调试窗口的过程中存在未知的运行情况,所有烧毁都在进入和退出调试窗口时发生,推荐使用性能较好的线性电源限流0.2A进行供电,开关电源限流响应较慢,也会导致板子或电机烧毁。

如果缺乏对应电源,可以在进入和退出调试窗口前断掉PCB供电,待进入调试后再对PCB上电。

如果发生烧毁情况,首先检查PCB供电的芯片XL7005是否损坏,如若正常则依次检查EG3013的15V供电,板上的5V和3.3V供电。如果电机仍然无法转动,再使用万用表测量MOS管是否烧毁。

小提示

对于BLDC.c文件中的程序,需要确认逻辑是否严密,切记不可发生上下桥同时导通的情况。

在 ADC_SampleTarget 函数可以自行修改 Target 的值来规定目标速度上限。

本程序的方向切换在程序里手动设置,如果读者想要通过按键等控制方向,需要在方向改变前先停止电机,再切换方向,不可在电机运行时直接改变方向和换相顺序。

对于转速的测量要及时,虽然由于硬件原因,测量转速时间间隔越小,转速变化的梯度越大,但是未获得实时速度会导致PID控制效果不佳。先测速再进行PID运算。

来源:CW32生态社区

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 61

中微半导体(深圳)股份有限公司(以下简称:中微半导 股票代码:688380)近日宣布,正式推出基于Arm Cortex®-M0+内核全新升级的CMS32M67电机控制系列微控制器,该系列可全面适用于智能家居、绿色骑行、白色家电、电动工具及工业电机控制等要求。

CMS32M67电机控制系列微控制器具备增强的处理能力、丰富的内部资源和外设特性,配合成熟可靠的方案支撑,能够有效应对高可靠、高精度及复杂工业电机应用控制需求。

1.png

资源丰富 打造高可靠性能

中微半导具备广泛的电机控制微控制器产品组合,针对不同的开发环境和电机类型提供不同等级产品支持,旨在以全方位、量产级、一站式解决方案,助力客户简易快速进行开发。
CMS32M67系列包括CMS32M6710、CMS32M6736E、CMS32MEBK2、CMS32M6734四款型号,主打单芯片、高集成、高可靠、高性能、高性价比及支持多种类型电机控制应用的定位。其中CMS32M6710兼顾稳定性和高可靠性,提供LQFP48、QFN32封装形式,可灵活满足不同的应用需求。

1712137832882474.png

迭代升级 支持多场景应用

中微半导在CMS32M5710的基础上成功升级研发出CMS32M6710。CMS32M6710采用Arm Cortex®-M0+内核,主频72 MHz,内置±1.5%高精度内振,集成4路带前级滤波、带采保可编程差分PGA,包含一路DAC、两路比较器、高精度基准电压及转换速率1.2Msps ADC等模拟资源。同时配备Hall专用接口及32bit计数器,支持霍尔结果直接输出并带输入滤波。丰富资源搭配外设配置有助于提升整体方案可靠性,并精减外部元件,降低整体BOM成本。

3.png

CMS32M6710工作温度可达-40℃至+105℃工业级标准,提供先进的安全性,包括IEC60730 ClassB安规认证、过压、过温等多重保护功能,可检测错误并在发生错误时停止电机运行,确保系统稳定可靠运行状态。CMS32M6710性能提升满足空间敏感及复杂工业控制的应用需求,如高速风筒、落地扇、卧室扇、手持工具(方弦一体)、两轮车及洗衣机等。

中微半导为电机开发创新提供丰富的产品资源,基于CMS32M6710开发的电机控制SoC系列CMS32M6736E、CMS32M6734,可凭借高集成度、高性价比、低可替代性及丰富功能优势,更加灵活地支持客户构建全面且完善的电机控制解决方案。

CMS32MEBK2 两轮车典型方案

4.jpg

功能参数

  • 10°以内霍尔位置自校正

  • 低分辨率霍尔FOC正弦控制

  • 过流保护,过欠压保护,堵转保护

  • MOS内阻采样,三档限速,定速巡航,EBS刹车,防盗

方案优势

  • 有霍尔电机通配度超99%

  • 空载运行噪声低,高速无抖动异响

  • 滑行投切柔和,无二次转把异响

  • 支持第三模:方波运行无感,通配性强

开发支持

CMS32M67系列提供全面开发支持,配套EVB现已同步推出。该EVB自带CMS调试器CMS-ICE8-OB并预留调试接口,芯片引脚已引至测试接口,可方便客户快速进行测试和连接。

5.png

为了帮助客户快速启动设计,CMS32M67系列针对细分领域同时提供辅助工具套件支持。该工具可方便客户快速评估电机控制设计,无需编程即可进行电机调试,修改电机参数及运行参数,快速达成量产。

产品状态

CMS32M67系列目前已可提供样片,并将于2024年Q2季度进入正式量产阶段,届时将以整体性能更优的高可靠性解决方案,帮助客户加快芯片评估和方案开发进程。更多信息查询,可联络中微半导各地销售办公室或授权经销商,或访问官网www.MCU.com.cn

来源:中微半导

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 14

进一步丰富TXZ+™族高级系列的M4K组,将代码闪存扩充至512 KB1 MB

2024326——东芝电子元件及存储装置株式会社(“东芝”)今日宣布,采用Cortex®-M4内核并搭载FPU的TXZ+™族高级系列32位微控制器的M4K组新增8款新产品,闪存容量达512 KB/1 MB,同时提供4种不同的封装类型。

1.jpg

支持物联网的电机应用功能不断发展,需要更大的编程容量以及更好的固件OTA支持。

东芝新推出的M4K组产品将现有产品的最大代码闪存容量从256 KB扩充至512 KB[1]/1 MB[2](具体容量视产品而定),RAM容量也从24 KB扩充至64 KB。在容量提升的同时,其他特性也得以保留,包括运行频率高达160 MHz的Arm® Cortex®-M4内核、集成代码闪存以及32 KB数据闪存并支持10万次的编程/擦写周期。

此外,上述微控制器还提供多种不同的接口和电机控制选项,包括高级可编程电机驱动器(A-PMD)、高级32位编码器(A-ENC32)、高级矢量引擎+(A-VE+)和三个高速、高分辨率12位模/数转换器单元。因此,M4K组产品有助于扩大物联网应用,并为交流电机、直流无刷电机和变频器控制带来高级功能。

新产品在两个独立的512 KB区域中实现了1 MB代码闪存。这样就能通过内存交换法[3]实现固件转换,支持从一个区域读取指令,同时将更新的代码并行编程到另一个区域。

M4K组器件集成UART、TSPI和I2C作为通用通信接口。闪存、RAM、ADC和时钟器件中集成的自诊断功能有助于客户通过IEC 60730 B类功能安全认证。

与此同时,我们还提供文档、带有实际使用示例的示例软件以及控制每个外围设备接口的驱动软件。并与Arm®全球生态系统合作伙伴联合推出评估板和开发环境。

东芝还计划未来增加支持CAN接口的M4M组产品的闪存容量。

应用:

-    消费类产品、工业设备的电机和变频控制

-    消费类产品、工业设备等物联网

特性:

-    搭载FPU的高性能Cortex®-M4内核,最高运行频率160 MHz

-    内存容量更高

代码闪存:512 KB/1 MB

RAM:64 KB

-    内存交换法固件转换功能,在微控制器持续运行的同时支持固件更新[4]

-    自诊断功能,实现IEC 60730 B类功能安全性

-    四种封装类型

主要规格:

(除非另有说明,Ta=25 °C)

产品组

M4K组


器件型号[5]

TMPM4KNF10AFG

TMPM4KNFDAFG

TMPM4KLF10AUG

TMPM4KLFDAUG


TMPM4KNF10ADFG

TMPM4KNFDADFG

TMPM4KLF10AFG

TMPM4KLFDAFG


CPU内核

Arm® Cortex®-M4

-浮点运算单元(FPU)

-内存保护单元(MPU)


最大工作频率

160 MHz


内部振荡器

振荡频率

10 MHz(±1 %)


内存

闪存(代码)

1024 KB/512 KB[5](编程/擦写周期:高达10万次)

内存交换法固件转换功能,有两个独立的代码闪存区,每个容量为512 KB[4]


闪存(数据)

32 K(编程/擦写周期:高达10万次)


RAM

64 KB,带奇偶校验


I/O端口

87引脚

51引脚


外部中断

20因数,32引脚

15因数,20引脚


DMA控制器(DMAC

32通道

30通道


定时器功能

32位定时器事件计数器(T32A

6通道
  (如用作16位定时器,则有12条通道)


通信功能

UART

4通道

3通道


I2C/EI2C接口(I2C/EI2C

2通道


TSPI

2通道


模拟功能

12位模数转换器

ADC

3个单元中有11/5/6个输入

3个单元中有8/3/3个输入


运算放大器

OPAMP

3个单元


电机控制电路

高级可编程电机驱动器

A-PMD

3通道

3通道[6]


高级矢量引擎

A-VE+

1通道

高级编码器(32位)

A-ENC32

3通道

1通道

CRC计算电路(CRC

1通道、CRC32、CRC16

系统功能

看门狗定时器(SIWDT

1通道

电压检测电路(LVD

1通道

振荡频率检测器(OFD

1通道

片上调试功能

JTAG/SW

TRACE(4位)

NBDIF

SW

工作电压

2.7 V至5.5 V,单电压供电

4.5 V至5.5 V(所有功能),2.7 V至4.5 V(无OPAMP、ADC)

封装/引脚

LQFP100

(14 mmÍ14 mm,0.5 mm间距)

LQFP64

(10 mmÍ10 mm,0.5 mm间距)

QFP100

(14 mmÍ20 mm,0.65 mm间距)

LQFP64

(14 mmÍ14 mm,0.8 mm间距)

注:

[1] TMPM4KxFDAxxG的单区代码闪存容量为512 KB

[2] TMPM4KxF10AxxG的代码闪存容量为1 MB,由两个512 KB区组成

[3] TMPM4KxFDAxxG不支持此功能

[4] 仅适用于代码闪存为1 MB(1024 KB)的产品

[5] 器件型号中的“F10”表示1024 KB代码闪存,“FD”表示512 KB

[6] TMPM4KLFxxAxxG无OVVx引脚

如需了解M4K组的更多信息,请访问以下网址:

M4K

https://toshiba.semicon-storage.com/cn/semiconductor/product/microcontrollers/txz4aplus-series.html%23M4K-Group

如需了解东芝微控制器的更多信息,请访问以下网址:

微控制器

https://toshiba.semicon-storage.com/cn/semiconductor/product/microcontrollers.html

关于东芝电子元件及存储装置株式会社

东芝电子元件及存储装置株式会社是先进的半导体和存储解决方案的领先供应商,公司累积了半个多世纪的经验和创新,为客户和合作伙伴提供分立半导体、系统LSI和HDD领域的杰出解决方案。

公司22,200名员工遍布世界各地,致力于实现产品价值的最大化,东芝电子元件及存储装置株式会社十分注重与客户的密切协作,旨在促进价值共创,共同开拓新市场,公司现已拥有超过8,598亿日元(62亿美元)的年销售额,期待为世界各地的人们建设更美好的未来并做出贡献。

如需了解有关东芝电子元件及存储装置株式会社的更多信息,请访问以下网址:https://toshiba-semicon-storage.com

围观 24

现在提供“MCU Motor Studio Ver.3.0”和新的“电机参数调整工具”

2024319——东芝电子元件及存储装置株式会社(“东芝”)今日宣布,推出全新 “MCU Motor Studio Ver.3.0”和“电机参数调整工具”,使得电机控制功能得到改善。全新版本的电机控制软件开发套件“MCU Motor Studio Ver.3.0”新增位置估算控制技术,用于磁场定向控制(FOC),与此同时,“Motor Tuning Studio Ver.1.0”则用于电机参数自动计算,两款工具将于今天开始提供。

1.jpg

FOC是一种高效的电机控制方法,但使用比例积分(PI)控制增益对电机驱动进行调整的复杂性成为了一个课题。PI控制通常应用于位置控制、速度控制和电流控制,产生的3组PI控制增益参数会彼此干扰,调整不容易。此外,MCU Motor Studio使用已知的电机参数来进行控制,但没有从电机中提取参数的功能。

东芝全新推出的位置估计控制法基于磁通观测器,无需使用PI控制进行位置估计,从而使电机评估时的调整更加容易。与传统的位置估计控制方法相比,这种新方法在高负载运行时可实现更高的稳定性。此外,采用这种新方法的MCU Motor Studio Ver.3.0也支持传统的位置控制方法。

我们还新开发了“Motor Tuning Studio Ver.1.0”,这是一种自动计算电机参数的工具。通过MCU Motor Studio和MCU Motor Tuning Studio相结合,使用户能够轻松获得初始电机参数并开始评估。Motor Tuning Studio可通过这里的东芝客户咨询表获得(联系我们)。

东芝正在推进碳中和和循环经济的实现,将继续扩大其用于FOC的微控制器和电机控制软件开发套件的产品线,以支持高效电机。

如需了解MCU Motor Studio的更多信息,请访问以下网址:

MCU Motor Studio

https://toshiba-semicon-storage.com/cn/semiconductor/product/microcontrollers/motor-studio.html

如需了解东芝微控制器的更多信息,请访问以下网址:

微控制器

https://toshiba-semicon-storage.com/cn/semiconductor/product/microcontro...

关于东芝电子元件及存储装置株式会社

东芝电子元件及存储装置株式会社是先进的半导体和存储解决方案的领先供应商,公司累积了半个多世纪的经验和创新,为客户和合作伙伴提供分立半导体、系统LSI和HDD领域的杰出解决方案。

公司22,200名员工遍布世界各地,致力于实现产品价值的最大化,东芝电子元件及存储装置株式会社十分注重与客户的密切协作,旨在促进价值共创,共同开拓新市场,公司现已拥有超过8,598亿日元(62亿美元)的年销售额,期待为世界各地的人们建设更美好的未来并做出贡献。

如需了解有关东芝电子元件及存储装置株式会社的更多信息,请访问以下网址:https://toshiba-semicon-storage.com

围观 11

应用与开发篇

在上一篇文章中,我们介绍了高性能RA8T1 MCU的整体概况和性能配置解析。最后我们进入到开发人员最为关心的部分,关于目标应用及开发支持。

RA8T1目标应用

RA8T1系列适用于广泛市场领域的驱动应用

1.png

RA8T1用于三相逆变器控制的示例

2.png

关键组成部分

● 计算性能

采用Helium技术的Cortex-M85内核

高达480MHz的运行

● 三相逆变器控制

三相互补PWM输出的GPT

● 处理三相电流测量

同步3ch采样和保持

12位ADC

● 安全输出保护

检测过电流的比较器

强制关闭PWM输出的POE

● 通信

以太网MAC

CAN FD

USBFS

I2C等

RA8T1拥有强大的处理能力和先进的核心配置,可满足工业自动化、楼宇自动化、智能家居、消费类产品及医疗健康等应用中常见的电机、电源和其它产品的实时控制要求。

开发环境概述

RA家族的开发环境非常灵活,支持不同的片上调试器、IDE和编译器。与其他RA家族产品一样,RA8T1可使用瑞萨e2 studio、IAR Embedded Workbench和Keil MDK开发环境,开发人员可以根据自己的喜好进行选择。

所有工具均可使用RA智能配置器进行FSP驱动程序和中间件的选择与配置,以及引脚映射和时钟树配置。

除此之外,瑞萨e2 studio IDE还特别支持专门的电机开发支持工具,包括QE for Motor、Renesas motor Workbench和Embedded Target。

3.png

FSP灵活软件包

FSP是一个增强型软件包,旨在为使用Renesas RA家族的嵌入式系统设计提供易于使用、可扩展、高质量的软件。

FSP包括一流的HAL驱动,具有高性能和低内存占用的优点。包括与Azure RTOS和FreeRTOS集成的中间件堆栈,以简化通信和安全等复杂模块的实现。e² studio IDE通过直观的配置程序和智能代码生成器提供支持,使编程和调试更加简单快捷。

RA8T1从v.5.1开始正式支持FSP。可通过GitHub获取完整的源代码。

4.png

配套开发板及套件

这是RA8T1电机控制套件的概述。

我们提供MCK-RA8T1和MCB-RA8T1作为电机控制的开发评估平台。

MCB-RA8T1是CPU板,可将RA8T1器件作为目标MCU安装。可通过连接一个或两个逆变器板和通信板进行电机控制评估,也可通过单板进行MCU评估。除逆变器板连接器外,MCB-RA8T1拥有两个PMOD、USBFS、以太网连接器和SD微型插槽。

MCK-RA8T1是MCB-RA8T1和逆变器板与通信板的组合套件,可在开箱后立即开始电机控制评估。

电机控制评估套件

5.png


我们为包括RA8T1在内的电机MCU提供了各种类型的电机控制样例程序和应用手册,包括1分流或3分流的无传感器矢量控制、带编码器的矢量控制和120度传导控制方法等。开发人员可以在瑞萨官网RA8T1产品页面进行免费下载。

长按二维码进入RA8T1官网页面

6.png

7.png

解决方案支持

RA8T1强大的能力可以保障在常规的电机控制之外,还可以实现更多的智能化方案。我们基于RA8T1开发了电机控制预测性维护的嵌入式人工智能解决方案。

通过256 FFT转换分析电机电流,并使用TensorFlow Lite作为推理引擎,利用Helium技术进行加速,推理时间与Cortex-M7相比快了5.3倍。

由此可见Helium技术对于此类AI运算的强大作用。

在使用Helium的Cortex-M85上进行AI演示电机控制故障检测

11.png

12.png

总结

最后,我们来做一下RA8T1的总结。

RA8T1 MCU是RA家族中的高端电机控制产品。弥合了MCU和MPU之间的差距,并将MPU的高性能与MCU的低功耗和易用性相结合。

采用Arm® Cortex-M85®内核,提供6.39 CM/MHz高性能,并利用Helium(Arm M-Profile矢量扩展),可加速DSP/ML处理。

Armv8.1-M架构还引入PACBTI和TrustZone以提高安全性。

RA8T1提供了一整套软件、工具和评估套件提供支持,可简化开发过程。

我们现已完成RA8T1 MCU的MP状态,已于2024年1月30日正式发布。有兴趣的小伙伴欢迎垂询哦!

欢迎观看RA8T1产品介绍视频:https://www.renesas.cn/cn/zh/video/ra8t1-480-mhz-arm-cortex-m85-core-based-mcu-helium-and-trustzone-motor-control 

https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/ 

相关阅读:瑞萨RA8T1高性能电机控制新品解读(上)产品详解篇

来源:瑞萨嵌入式小百科

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 31

页面

订阅 RSS - 电机控制