电机控制

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

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

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)。

围观 21

中微半导体(深圳)股份有限公司(以下简称:中微半导 股票代码: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)。

围观 10

进一步丰富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

围观 14

现在提供“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

围观 7

应用与开发篇

在上一篇文章中,我们介绍了高性能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)。

围观 24

RA高性能电机控制MCU - RA8T1

1.jpg

基于Arm Cortex-M85处理器的RA8T1高性能MCU产品群 针对电机控制和逆变器应用进行优化

产品详解篇

瑞萨的RA家族基于Arm® Cortex®-M内核打造,自2019年10月份正式诞生,短短四年多时间已经快速发展成广泛的产品阵容,众多型号用以满足各式各样的用户需求。

其中,专门面向电机/逆变器控制应用的RA-T系列产品,完美结合了Arm生态和瑞萨先进的外设功能,得到广大客户的高度评价。本次瑞萨推出高性能的电机控制RA8T1 MCU,将瑞萨RA家族扩充到4个系列(RA2/RA4/RA6/RA8)、25个产品群、319个产品型号。

2.jpg

在此,我们先来简单回顾一下瑞萨RA-T电机控制MCU产品线。

3.png

瑞萨RA-T电机控制MCU路线图

● 从低端到高端的广泛电机控制MCU系列,具有最佳功能设定;

● 保持CPU和外设的可扩展性,实现独特的硬件IP;

● 支持电机控制评估套件、工具和软件。

RA4T1和RA6T3凭借其高性价比、小封装和优化的外设功能,非常适用于单电机控制的紧凑型系统,比如变频家电、电动工具和小型机器人等。

RA6T1和RA6T2具备较高性能、丰富的功能外设,适用于双电机控制系统,具备高分辨率PWM输出功能更可以拓展到数字电源等应用。特别是RA6T2搭载了强大的硬件加速器,包括一个三角函数单元(TFU)和一个无限脉冲响应滤波器(IIR),用以大幅减少在电机控制中复杂的矢量运算、电流环、速度环等处理时间,降低CPU负荷以扩展更多附加功能。RA6T2还内置了两个高速ADC单元,支持12位和16位分辨率,最高0.16微秒的高速转换。

随着电机应用的快速发展,对MCU提出了越来越高的要求。比如在高端电机应用中,除了精确的电机控制外,系统还需要兼顾其他应用程序、丰富的通信功能、高安全性以及智能化应用等等。RA8T1正是为此而生,帮助设计人员满足这些要求。

RA8T1 MCU基于Arm® Cortex®-M85内核构建,工作频率高达480MHz,提供高达2MB闪存和1MB SRAM(包括 TCM)的大内存选项、支持互补PWM输出的16位/32位定时器、12位ADC(包括3通道采样和保持)、以及用于电机控制的高速模拟比较器。连接功能包括以太网MAC、CAN FD、USB 2.0全速模块、SD/MMC主机接口和I3C。此外,Armv8.1-M架构支持Helium技术,可显著提高AI/ML计算性能,并支持Pointer AuthentiCation和Branch Target Identification(PACBTI)和TrustZone®以增强安全性。

4.png

RA8T1产品规格

产品特性:RA8T1产品的主要特性

1、极致性能

A) 搭载超高性能的Arm® Cortex®-M85内核,性能高达3068 CoreMark@480MHz。

B) 结合Helium先进技术,能够在数字信号处理器(DSP)和机器学习(ML)方面获得相比Cortex-M7内核高4倍的性能提升。

C) 在实现高效电机控制的同时,便于拓展功能安全、嵌入式人工智能等附加功能。

2、丰富的电机/逆变控制外设单元

A) 高达2MB的双区闪存和1MB SRAM(包括TCM),100至224引脚的广泛产品阵容。

B) 通用32位增强型PWM定时器,支持三相互补PWM输出、死区控制等多种功能,可轻松实现各种类型电机控制

C) 两个12位ADC单元,支持3通道同步采样保持电路。以及DAC(2通道)、高速比较器、温度传感器等。

D) 丰富连接功能,支持以太网MAC/DMA、USB全速、CAN FD、I3C/I2C、SCI、SPI和SD/MMC接口。

3、安全配置

A) 支持AES、TRNG、RSA 4K/ECC、SHA-2、用于FSBL的不可变存储、防篡改DPA/SPA侧信道保护等最新安全特性。

B) 端口输出保护单元POE,在发生异常状况下强制关断PWM输出,及时保护电机和逆变器电路。

4、轻松开发,缩短开发周期

A) 集成式电机控制评估硬件套件

B)灵活软件包(FSP)

C)提供各种电机控制示例程序

D)用于实时调试的GUI工具:Renesas Motor Workbench, QE for Motor

接下来我们来聊一聊RA8T1的优异性能和核心配置。

RA8T1是瑞萨基于Arm Cortex-M85 内核的第三个MCU产品组,精确定位于电机控制应用。Cortex-M85是Arm推出的迄今为止性能最强的Cortex-M处理器,借助其6.39 CoreMark/MHz 的超高处理能力,RA8T1达到了3068 CoreMark@480MHz的业界领先性能。同时搭载了Armv8.1-M架构支持的Helium技术,与现有的Cortex-M7产品相比,Armv8.1-M架构支持的Helium技术可以将数字信号处理器(DSP)或机器学习(ML)性能提高4倍,与同样支持Helium的处理器Cortex-M55相比,它还带来了约20%的矢量处理性能提升。

 5.png

6.png

Arm Cortex-M85 - 高性能M-Class内核

这里可能有很多小伙伴对于Helium技术还比较陌生。Helium是在Arm 8.1M架构中引入的面向DSP和机器学习ML应用的M型矢量扩展(MVE)技术。2019年首次在Cortex-M55内核上推出,类似于Arm A系列处理器上的“Neon”。它的出现,使小型低功耗嵌入式系统能够满足音频处理、无人机导航和控制、AR/VR应用、传感器集中器、图像处理和汽车等各种应用中的计算需求。

凭借其极致的性能,RA8T1实现了对电机系统的更精确控制,可满足工业、楼宇自动化,以及智能家居等应用中常见的电机、电源和其它产品的实时控制要求,并将有助于用户打造高效率系统。

除了高性能内核外,RA8T1还具有丰富的集成功能,它还能够为用户应用带来附加价值,如AI/ML功能、网络连接、功能安全等。

7.png

产品选型

RA8T1产品群共八种器件,支持100引脚LQFP、144引脚LQFP、176引脚LQFP和224引脚BGA四种封装,以及1MB和2MB两类闪存大小。

虽然所有器件均支持-40至125摄氏度的结温范围,但请注意,不同封装类型的最大运行频率是不同的。追求极致性能的小伙伴,请选择224 BGA封装哦!

8.png

RA8T1产品选型

我们相信,RA8T1独特的特性非常适合许多对于功能和性能有极致要求的客户。

欢迎观看RA8T1产品介绍视频:https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/ 

来源:瑞萨嵌入式小百科(作者:刘涛)

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

围观 22

基于Arm® Cortex®-M85处理器的RA8T1 MCU产品群,为工业、楼宇和家庭自动化应用提供低功耗操作和专用模拟功能

2024 1 30  - 全球半导体解决方案供应商瑞萨电子(TSE:6723)今日宣布推出基于Arm® Cortex®-M85处理器的RA8T1微控制器(MCU)产品群,可满足工业、楼宇自动化,以及智能家居等应用中常见的电机、电源和其它产品的实时控制要求。

基于Arm Cortex-M85处理器的RA8T1高性能MCU产品群,针对电机控制和逆变器应用进行优化.jpg

基于Arm Cortex-M85处理器的RA8T1高性能MCU产品群,针对电机控制和逆变器应用进行优化

瑞萨RA家族MCU产品阵容.jpg

瑞萨RA家族MCU产品阵容

RA8T1产品群是瑞萨RA8系列的第三款产品。所有RA8系列产品均具备6.39 CoreMark/MHz(注)的突破性性能,并采用高性能Arm Cortex-M85处理器和Arm的Helium™技术,能够在数字信号处理器(DSP)和机器学习(ML)方面获得相比Cortex-M7内核高4倍的性能提升。这一性能提升可用于拓展电机预测性维护等AI功能,从而减少代价高昂的停机时间。

针对电机控制优化的功能

全新RA8T1产品具有先进的PWM定时功能,如三相互补输出、0%和100%占空比输出功能、双缓冲比较匹配寄存器,和五种相位计数模式。其模拟功能包括12位ADC、12位DAC,以及用于电压和电流测量及过流保护的高速比较器。RA8T1 MCU还带来多种通信功能,包括SCI、SPI、I2C/I3C、CAN/CAN-FD、以太网和USB-FS。当检测到异常时,RA8T1 MCU提供端口输出关断功能,这对于电机控制来说,是一项重要的安全功能。这些功能与先进的定时器和瑞萨的电源管理专业技术相结合,使客户能够构建全面的低功耗电机控制解决方案。

瑞萨在电机控制嵌入式处理领域的卓越地位

瑞萨持续推出电机控制专用MCU,已拥有超过10年的历史。公司每年向全球数千家客户交付超过2.3亿颗电机控制嵌入式处理器。除丰富的RA MCU家族外,瑞萨还在其32位RX产品家族、16位RL78 MCU,和64位RZ MPU产品线中提供电机控制专用器件。此外,瑞萨还发布了业界首款基于RISC-V的电机控制专用ASSP

Daryl Khoo, Vice President of the Embedded Processing 1st Division at Renesas表示:“瑞萨已经成为电机控制领域的市场佼佼者,为智能家居、楼宇和工厂自动化系统带来非常广泛的MCU产品组合。这些MCU的性能在需要精密算法和应用软件以可靠、安全、稳定方式运行的高速电机控制中至关重要。RA8T1 MCU带来前所未有的CPU动力以及Helium技术的产品组合,使我们的客户能够在不需要额外硬件的情况下,更加灵活地实现智能(AI/ML)解决方案。”

所有RA8产品还提供先进的安全性,包括Arm TrustZone® 技术、瑞萨安全IP (RSIP-E51A)、在不可变存储中采用第一级引导加载程序的安全启动,以及指针验证和分支目标识别(PACBTI)安全扩展。

RA8T1产品群MCU的关键特性

  • 内核:480 MHz Arm Cortex-M85,包含Helium和TrustZone技术

  • 存储:集成2MB/1MB双区闪存和1MB SRAM(包括128KB TCM,512KB ECC保护)

  • 模拟外设:先进的18通道PWM定时器、12位ADC、12位DAC、高速比较器

  • 通信外设:以太网MAC、USB-FS、CAN-FD、I2C/I3C、SPI、SD和MMC存储卡接口

  • 高阶安全性:优化加密算法、TrustZone、安全启动、不可变存储、带DPA/SPA攻击保护的防篡改功能、安全调试、安全工厂编程和生命周期管理支持

  • 封装:100引脚、144引脚和176引脚LQFP,224引脚BGA

新型RA8T1产品群MCU由瑞萨灵活配置软件包(FSP)提供支持。FSP带来所需的所有基础架构软件,包括多个RTOS、BSP、外设驱动程序、中间件、连接、网络和安全堆栈,以及用于构建复杂AI、电机控制和云解决方案的参考软件,从而加快应用开发速度。它允许客户将自己的既有代码和所选的RTOS与FSP集成,为应用开发打造充分的灵活性。借助FSP,可轻松将现有设计迁移至新的RA8系列产品。

成功产品组合

瑞萨将全新RA8T1产品群MCU与其产品组合中的众多兼容器件相结合,创建了广泛的“成功产品组合”,包括20KW三相PFC逆变器。这些“成功产品组合”基于相互兼容且可无缝协作的产品,具备经技术验证的系统架构,带来优化的低风险设计,以加快产品上市速度。瑞萨现已基于其产品阵容中的各类产品,推出超过400款“成功产品组合”,使客户能够加速设计过程,更快地将产品推向市场。更多信息,请访问:renesas.com/win

供货信息

RA8T1产品群MCU和FSP软件现已上市。此款全新MCU由瑞萨的灵活电机控制开发套件(Flexible Motor Control development kit)及瑞萨电机工作台开发工具(Renesas Motor Workbench development tool)提供支持。其中,前者可轻松评估采用永磁同步电机(无刷直流电机)的电机控制,并构建了一个涵盖瑞萨RA和RX产品家族众多电机控制MCU的通用设计平台,从而实现IP在多款产品间的迁移。以上产品更多相关信息,请访问:renesas.com/RA8T1。样品和套件可在瑞萨网站或通过分销商订购。

瑞萨MCU优势

作为全球卓越的MCU产品供应商,瑞萨电子的MCU近年来的平均年出货量超35亿颗,其中约50%用于汽车领域,其余则用于工业、物联网以及数据中心和通信基础设施等领域。瑞萨电子拥有广泛的8位、16位和32位产品组合,是业界优秀的16位及32位MCU供应商,所提供的产品具有出色的质量和效率,且性能卓越。同时,作为一家值得信赖的供应商,瑞萨电子拥有数十年的MCU设计经验,并以双源生产模式、业界先进的MCU工艺技术,以及由200多家生态系统合作伙伴组成的庞大体系为后盾。关于瑞萨电子MCU的更多信息,请访问:renesas.com/MCUs

(注)EEMBC的CoreMark®基准,用于测量嵌入式系统中使用的MCU和CPU性能

关于瑞萨电子

瑞萨电子(TSE: 6723),科技让生活更轻松,致力于打造更安全、更智能、可持续发展的未来。作为全球微控制器供应商,瑞萨电子融合了在嵌入式处理、模拟、电源及连接方面的专业知识,提供完整的半导体解决方案。成功产品组合加速汽车、工业、基础设施及物联网应用上市,赋能数十亿联网智能设备改善人们的工作和生活方式。更多信息,敬请访问renesas.com。关注瑞萨电子微信公众号,发现更多精彩内容。

围观 14

历经两年潜心研发,德普微电子正式发布三大系列MCU——DPM32M08X 旗舰系列、DPM32M05X 主流系列、DPM32M03X 超值系列,致力打造电机控制芯片可靠性新标杆。

1.jpg

产品搭载Arm® Cortex®-M0内核+自研DSP架构,FOC+SVPWM运算仅需1us,主频高达96MHz,内置128KB Flash,通过10KV HBM ESD接触放电测试,可定制封装,广泛应用于电动出行、智能家电、电动工具等需要电机驱动的场景。

2.jpg

产品 RoadMap

  • 产品优势M0+电机DSP双核,计算FOC+SVPWM只要1us

  • 10KV ESD HBM接触放电,打造可靠性新标杆

  • 可选2个完全独立的3M采样率ADC

  • 集成4路可编程运算放大器,4个模拟比较器,芯片外围极致精简

  • 多款集成预驱和LDO型号可选,BOM成本大幅减少

  • 自有封测工厂,年产能百亿颗保障品质

应用范围

  • 电动自行车、三轮车、平衡车、滑板车

  • 空调风机、压缩机,冰箱、洗衣机

  • 工业风机、水泵、角磨机

  • 电动工具、园林工具

  • 筋膜枪、按摩椅

  • 落地扇、吊扇、PC/服务器散热风扇

  • 高速吹风筒、吸尘器、扫地机器人

  • 工业变频器、伺服电机

  • BMS

技术支持

  • 电机驱动 Demo 板与参考设计

3.jpg

  • 丰富的电机算法库

4.jpg

  • 电机调试上位

机基于自研的上位机电机调试软件,方便用户搭建测试环境,调整参数以适配不同电机,便捷完成方案开发和测试工作。

5.png

来源:德普微电子

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

围观 31

机器人系统可自动执行重复性任务,承担复杂而费力的作业,并在对人类有危险或有害的环境中工作。集成度更高、性能更强的微控制器 (MCU) 可实现更高的功率效率、更平稳安全的运动以及更高的精度,从而提高生产力和自动化水平。例如,更高的精度(有时在 0.1mm 以内)对于处理激光焊接、精密涂层或喷墨或 3D 打印的应用非常重要。

机械臂的轴数以及所需的控制架构类型(集中式或分布式)决定了适合该系统的 MCU 或电机控制集成电路 (IC)。现代工厂组合使用具有不同轴数和运动自由度(在 x、y 或 z 平面上移动和旋转)的机器人,以满足不同制造阶段的需求;因此,整个工厂车间采用不同的控制架构。

在选择 MCU 时,选择具有额外性能余量的 MCU 能够在未来实现可扩展性和支持附加功能。在设计过程中,提前规划可扩展性和附加功能也可以节省成本和时间,降低复杂性。

本文将探讨集中式和分布式(或称分散式)这两种电机控制架构,以及实现这两种架构的集成实时 MCU 的设计注意事项。

集中式架构

在集中式系统中,一个 MCU 用于控制多个轴。这种方法能在需要大型散热器和冷却风扇的较高功率电机驱动器(通常超过 2kW 至 3kW)中,有效解决散热问题。在此架构中,位置数据通常通过连接到编码器的旋转变压器板或聚合器从外部获取。

通常,在这种架构中,多个功率级位于同一 PCB 上或距离很近,因此一个 MCU 可以控制多个轴。这种方法简化了多轴之间的实时控制和同步,因为多个电机控制 MCU 之间不需要较长的通信线路。

集中式架构中的电机控制 MCU/MPU 需要具备高性能实时处理内核(如 R5F 内核或 DSP)、实时通信接口(如 EtherCAT)、充足的 PMW 通道以及用于电压和电流检测的外设。AM243x 等 MCU 可构建可扩展的多轴系统,为多达六个轴提供实时控制外设,并在单芯片中实现实时通信。

过去,FPGA 或 ASIC 器件主要用于自动化系统中的集中式电机控制。但是,基于 Arm Cortex 的现代 MCU(如 AM243x)近年来越来越受到青睐。这些 MCU 具有高集成度和成本效益,有助于设计人员满足其系统的性能要求,同时实现设计的可扩展性和灵活性。

虽然集中式控制架构可以满足重有效载荷工业机器人等大功率自动化系统的性能和效率设计要求,但这些系统需要使用额外电缆,连接机柜和关节的机械电机,以及位置传感器和聚合器。这些电线不仅成本高昂,而且容易磨损,需要维护。

1.png

图 1:适用于多轴系统的分散式电机控制架构的方框图

分散式或分布式架构

最近,分散式或分布式架构(图 2)在具有较低功耗要求的系统中越来越受欢迎,并已成为协作机器人机械手的标准方法。

分散式架构将多个单轴电机驱动集成到机器人的每个关节中,并通过 EtherCAT 等实时通信接口进行连接和同步。通常每个驱动控制一个轴,并在本地处理某些安全功能。因此,每个 MCU 都需要实时控制和通信功能、单轴电机控制外设、三到六个 PWM 通道、片上逐次逼近寄存器模数转换器或 Δ-Σ 调制器输入。

在这些应用中,位置传感器通常靠近 MCU ,因此这些 MCU 需要一个数字或模拟接口来读取位置传感器的数据。虽然这种架构需要更多的 MCU,但由于电源总线和通信接口之间的布线需求较少,因此可以大幅降低系统级成本。现代实时 MCU(如 F28P65x)不仅集成了所有必要的外设,还集成了安全外设,从而为分散式架构中的集成轴提供单芯片或双芯片解决方案,并以较小的尺寸实现高性能。

2.png

图 2:适用于单轴系统的分散式电机控制架构的方框图

结语

虽然电机在机器人领域可能并非当下最热门的选择(尤其是与支持人工智能的系统相比),但它们是维持工厂运转的“肌肉”,也是现代制造业中至关重要的部分,因此选择合适的控制器件时需要进行多番考量。随着这些器件集成度的提升,边缘计算和无线连接等附加功能可能会融入电机控制设计中。

来源:德州仪器

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

围观 36

页面

订阅 RSS - 电机控制