Funpack S5 #1 - 基于MCXA346的FOC电机控制系统
一、项目介绍
1.1 项目背景
本项目是参加Funpack S5 #1活动的作品。Funpack是电子森林(eetree.cn)与得捷电子(Digi-Key)联合举办的开发板体验活动,旨在帮助开发者学习和掌握最新的半导体技术。本期活动的主题是"基于MCXA346的电机控制应用",要求使用NXP FRDM-MCXA346开发板实现电机控制功能。
1.2 项目概述
本项目基于NXP MCXA346微控制器,实现了一套完整的BLDC电机FOC(磁场定向控制)系统。系统采用模块化分层架构设计,集成了磁编码器位置反馈、实时电流采样和级联PID控制算法,控制频率达到20kHz。
核心技术特点:
-
控制模式:支持力矩、速度、角度三种闭环控制模式
-
编码器支持:兼容MT6701、AS5600、AS5047P等多种磁编码器
-
电流采样:采用InlineCurrentSense方式,实时采样U相和W相电流
-
PWM输出:三相PWM输出,频率20kHz,16位分辨率
-
自动校准:支持零点偏移自动检测和极对数自动识别
应用场景:
-
机器人关节电机控制
-
无人机无刷电机电调
-
工业伺服驱动器
-
精密运动控制平台
1.3 项目目标
本项目旨在实现一个完整的BLDC电机FOC(磁场定向控制)系统,具备以下功能:
-
支持力矩、速度、角度三种闭环控制模式
-
实现20kHz的PWM控制频率
-
支持多种磁编码器(MT6701、AS5600、AS5047P)
-
实时电流采样和闭环控制
-
自动零点校准和极对数检测
1.4 项目成果
通过本项目的开发,成功实现了:
-
完整的FOC控制算法 -
速度闭环控制(当前主要模式) -
电流闭环控制 -
磁编码器位置反馈 -
实时调试输出 -
模块化软件架构
二、硬件介绍
2.1 主控制器 - NXP MCXA346
MCXA346是NXP推出的混合信号MCU,专为电机控制等应用设计:
MCXA346的电机控制优势:
-
丰富的ADC资源:支持多通道同步采样,适合电流采样
-
高精度PWM:FLEXPWM支持中心对齐和边沿对齐,适合SVPWM
-
硬件编码器接口:EQDC支持正交解码,适合磁编码器
-
高性能内核:180MHz Cortex-M33,满足实时控制需求
2.2 开发板 - FRDM-MCXA346
FRDM-MCXA346是NXP官方推出的Freedom开发板:
2.3 电机驱动板
-
类型:三相逆变器
-
驱动芯片:支持三相全桥驱动
-
电源电压:12V DC
-
最大电流:根据实际电机配置
2.4 无刷电机
-
类型:永磁同步电机(PMSM)
-
极对数:11对
-
额定电压:12V
-
编码器:MT6701磁编码器(4096 CPR)
2.5 硬件连接实物图
系统实物连接图:
图:FRDM-MCXA346开发板与无刷电机连接实物图
实物说明:
-
左侧:FRDM-MCXA346开发板(NXP官方开发板)
-
右侧:无刷电机(带MT6701磁编码器)
-
连接线:
-
-
三相电机线(U/V/W相)
-
编码器信号线
-
UW相电流采样线
-
使能信号线
-
电源线(XT60接口,12V输入)
-
2.6 硬件连接框图
┌─────────────────────────────────────────────────────────────┐
│ 电源系统 (12V) │
└──────────────────────┬──────────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 电机驱动板 │ │ FRDM- │ │ 磁编码器 │
│ 三相逆变器 │ │ MCXA346 │ │ MT6701 │
│ │ │ 开发板 │ │ │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
│ │ │
│ ┌──────────┘ │
│ │ │
│ │ ┌─────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────┐
│ 无刷电机 (11极对) │
│ U相 ───────┐ │
│ V相 ───────┼──→ 永磁转子 │
│ W相 ───────┘ │
│ │
│ 编码器 ─────→ MT6701 │
└─────────────────────────────────────┘
三、方案框图和项目设计思路
3.1 系统总体框图
┌─────────────────────────────────────────────────────────────┐
│ 应用层 (ASW) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ 运动控制 │ │ FOC控制 │ │ 传感器接口 │ │
│ │ (move) │ │ (loopFOC) │ │ (MagneticSensor) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
│ │ │ │ │
│ ┌──────┴────────────────┴────────────────────┴──────┐ │
│ │ FOC接口层 (FOC_Interface) │ │
│ └──────────────────────┬────────────────────────────┘ │
└─────────────────────────┼───────────────────────────────────┘
│
┌─────────────────────────┼───────────────────────────────────┐
│ 基础软件层 (BSW) │
│ ┌──────────────────────┴────────────────────┐ │
│ │ 定时任务管理 (TimerTask) │ │
│ └──────────────────────┬────────────────────┘ │
│ │ │
│ ┌──────────────────────┴────────────────────┐ │
│ │ 驱动层 (NXP SDK) │ │
│ │ PWM │ ADC │ EQDC │ I2C │ GPIO │ │
│ └──────────────────────┬────────────────────┘ │
└─────────────────────────┼───────────────────────────────────┘
│
┌─────────────────────────┼───────────────────────────────────┐
│ 硬件层 (Hardware) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 电机 │ │ 编码器 │ │ 电流采样 │ │ 调试串口 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
3.2 FOC控制框图
目标输入
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 运动控制层 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 速度模式: shaft_velocity_sp → PID_velocity │ │
│ │ 角度模式: shaft_angle_sp → P_angle → PID_velocity │ │
│ │ 力矩模式: current_sp (直接输入) │ │
│ └───────────────────────┬─────────────────────────────┘ │
└──────────────────────────┼──────────────────────────────────┘
│ current_sp
▼
┌─────────────────────────────────────────────────────────────┐
│ FOC控制层 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 电流环: current_sp → PID_current_q/d → voltage │ │
│ │ 坐标变换: Clark → Park → 控制 → 反Park → SVPWM │ │
│ └───────────────────────┬─────────────────────────────┘ │
└──────────────────────────┼──────────────────────────────────┘
│ PWM占空比
▼
┌─────────────────────────────────────────────────────────────┐
│ 硬件驱动层 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ FLEXPWM → 三相PWM → 电机驱动 → 电机 │ │
│ │ EQDC → 编码器读取 → 角度/速度反馈 │ │
│ │ LPADC → 电流采样 → 电流反馈 │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
3.3 项目设计思路
3.3.1 分层架构设计
采用分层架构设计,将软件分为三个层次:
-
应用层 (ASW):实现FOC控制算法、运动控制、传感器接口
-
基础软件层 (BSW):实现定时任务管理、驱动层抽象
-
硬件抽象层 (HAL):NXP SDK提供的底层驱动
设计优点:
-
模块化设计,便于维护和扩展
-
层次清晰,职责明确
-
易于移植到其他平台
3.3.2 实时控制设计
采用中断驱动的实时控制架构:
-
ADC中断(20kHz):触发FOC控制算法
-
UTICK中断(10kHz):任务调度和时间基准
-
主循环:执行定时任务
设计优点:
-
确保控制周期稳定
-
实时性高,响应快
-
资源利用率高
3.3.3 控制算法设计
采用级联PID控制结构:
-
位置环(角度模式):P控制
-
速度环(速度/角度模式):PI控制
-
电流环(FOC电流模式):PI控制
设计优点:
-
控制精度高
-
响应速度快
-
抗干扰能力强
四、调试软件介绍、软件流程图及关键代码
4.1 调试软件介绍
4.1.1 开发环境
4.1.2 调试接口
-
SWD接口:用于程序下载和调试
-
串口调试:LPUART2,波特率115200,用于输出调试信息
4.1.3 调试输出
系统通过串口输出以下信息:
-
初始化状态
-
校准结果
-
运行状态(角度、速度等)
-
错误信息
4.2 软件流程图
4.2.1 主程序流程图
┌─────────────┐
│ 开始 │
└──────┬──────┘
│
▼
┌─────────────────┐
│ 系统初始化 │
│ - 时钟初始化 │
│ - GPIO初始化 │
│ - 外设初始化 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 编码器初始化 │
│ - EQDC配置 │
│ - MT6701初始化 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ FOC初始化 │
│ - 电流采样初始化 │
│ - PID参数初始化 │
│ - 电机初始化 │
│ - FOC校准 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 使能电机 │
│ - 设置目标速度 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 主循环 │◄─────────────┐
│ - 运行定时任务 │ │
└────────┬────────┘ │
│ │
└────────────────────────┘
4.2.2 ADC中断流程图
┌─────────────────┐
│ ADC中断入口 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 清除中断标志 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 读取ADC结果 │
│ - adc_I_U │
│ - adc_I_W │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 检查初始化标志 │
└────────┬────────┘
│
┌────┴────┐
│ │
▼ ▼
┌───────┐ ┌───────┐
│ 已初始化│ │ 未初始化│
└───┬───┘ └───────┘
│
▼
┌─────────────────┐
│ move(target) │
│ - 运动控制 │
│ - PID计算 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ loopFOC() │
│ - 角度读取 │
│ - 电角度计算 │
│ - 电流采样 │
│ - 坐标变换 │
│ - PID控制 │
│ - SVPWM输出 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 中断返回 │
└─────────────────┘
4.2.3 FOC控制流程图
┌─────────────────┐
│ loopFOC() │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 读取轴角度 │
│ shaftAngle() │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 计算电角度 │
│ electricalAngle()│
└────────┬────────┘
│
▼
┌─────────────────┐
│ 读取相电流 │
│ getPhaseCurrents│
└────────┬────────┘
│
▼
┌─────────────────┐
│ Clark变换 │
│ abc → αβ │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Park变换 │
│ αβ → dq │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 低通滤波 │
│ LPFoperator │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 电流环PID │
│ PIDoperator │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 反Park变换 │
│ dq → αβ │
└────────┬────────┘
│
▼
┌─────────────────┐
│ SVPWM计算 │
│ setPhaseVoltage │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 更新PWM占空比 │
│ PWM_Update... │
└─────────────────┘
4.3 关键代码介绍
4.3.1 主程序代码
int main(void) {
// 初始化板级硬件
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitBootPeripherals();
BOARD_InitDebugConsole();
// 编码器初始化
EQDC_SetOperateMode(EQDC0, kEQDC_QuadratureDecodeOperationMode);
EQDC_DoSoftwareLoadInitialPositionValue(EQDC0);
MagneticSensor_Init();
// FOC初始化
EasyFOC_Init();
M1_Enable();
target = 10.0f; // 设置目标速度 10 rad/s
PRINTF("Motor ready.\r\n");
shaft_velocity_sp = 10; // 设置转速
// 主循环
while(1) {
app_initok = 1;
APP_TimerTask_Run(); // 运行定时任务
}
return 0;
}
4.3.2 ADC中断处理
void ADC1_IRQHANDLER(void) {
// 清除中断标志
LPADC_ClearTriggerStatusFlags(ADC1_PERIPHERAL, trigger_status_flag);
LPADC_ClearStatusFlags(ADC1_PERIPHERAL, status_flag);
// 读取ADC结果
tmp32 = ADC1->RESFIFO;
while((tmp32 & ADC_RESFIFO_VALID_MASK) > 0) {
g_LpadcResultConfigStruct.commandIdSource =
(tmp32 & ADC_RESFIFO_CMDSRC_MASK) >> ADC_RESFIFO_CMDSRC_SHIFT;
g_LpadcResultConfigStruct.convValue = (uint16_t)(tmp32 & ADC_RESFIFO_D_MASK);
if(g_LpadcResultConfigStruct.commandIdSource == 1) {
adc_I_U = g_LpadcResultConfigStruct.convValue;
}
if(g_LpadcResultConfigStruct.commandIdSource == 2) {
adc_I_W = g_LpadcResultConfigStruct.convValue;
}
tmp32 = ADC1->RESFIFO;
}
// 执行FOC控制
if(1 == app_initok) {
move(target); // 运动控制
loopFOC(); // FOC算法
}
}
4.3.3 FOC初始化配置
void EasyFOC_Init(void) {
// 电流采样初始化
InlineCurrentSense(0.01f, 50, 0, NOT_SET, 2);
InlineCurrentSense_Init();
// 编码器选择
MagneticSensor_OptionSelect(MAGNETIC_SENSOR_MT6701);
MagneticSensor_Init();
// 滤波器和PID初始化
LPF_init();
PID_init();
// 系统参数配置
voltage_power_supply = 12.0f;
voltage_limit = 6.0f;
velocity_limit = 40;
current_limit = 20;
// 控制模式配置
torque_controller = Type_foc_current;
controller = Type_velocity;
pole_pairs = 11;
// PID参数配置
PID_velocity.P = 0.11f;
PID_velocity.I = 0.98f;
P_angle.P = 20.0f;
PID_current_d.P = 0.2f;
PID_current_q.P = 0.16f;
// 电机初始化
Motor_init();
Motor_initFOC(0, UNKNOWN); // 自动校准
}
4.3.4 SVPWM算法
void setPhaseVoltage(float Uq, float Ud, float angle_el) {
float Uout;
uint32_t sector;
float T0, T1, T2;
float Ta, Tb, Tc;
// 计算电压幅值和角度
if (Ud) {
Uout = _sqrt(Ud * Ud + Uq * Uq) / voltage_power_supply;
angle_el = _normalizeAngle(angle_el + atan2(Uq, Ud));
} else {
Uout = Uq / voltage_power_supply;
angle_el = _normalizeAngle(angle_el + _PI_2);
}
// 扇区判断
sector = (angle_el / _PI_3) + 1;
// 计算矢量作用时间
T1 = _SQRT3 * _sin(sector * _PI_3 - angle_el) * Uout;
T2 = _SQRT3 * _sin(angle_el - (sector - 1.0f) * _PI_3) * Uout;
T0 = 1 - T1 - T2;
// 计算三相占空比
switch (sector) {
case 1:
Ta = T1 + T2 + T0 / 2;
Tb = T2 + T0 / 2;
Tc = T0 / 2;
break;
// ... 其他扇区
}
// 更新PWM
PWM_UpdatePwmDutycycleHighAccuracy(FLEXPWM0, kPWM_Module_0,
kPWM_PwmA, kPWM_SignedCenterAligned, (int32_t)(Ta * PWM_Period));
PWM_UpdatePwmDutycycleHighAccuracy(FLEXPWM0, kPWM_Module_1,
kPWM_PwmA, kPWM_SignedCenterAligned, (int32_t)(Tb * PWM_Period));
PWM_UpdatePwmDutycycleHighAccuracy(FLEXPWM0, kPWM_Module_2,
kPWM_PwmA, kPWM_SignedCenterAligned, (int32_t)(Tc * PWM_Period));
PWM_SetPwmLdok(FLEXPWM0,
kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true);
}
五、功能展示图及说明
5.1 系统初始化
初始化输出:
MOT: Init
MOT: Enable driver.
[MagneticSensor] MagneticSensor init success!
gain_a:2.00, gain_b:2.00, gain_c:2.00.
offset_ia:1.6500, offset_ib:0.0000, offset_ic:1.6500.
MOT: Align sensor.
mid_angle=3.1416
end_angle=3.1416
MOT: sensor_direction == CCW
MOT: PP check: OK!
MOT: Zero elec. angle:4.7124
EasyFOC Init is OK!
Motor is ready.
说明:
-
显示电机驱动初始化成功
-
电流采样增益和偏置校准完成
-
传感器方向检测为逆时针(CCW)
-
极对数检测通过
-
零点偏移角校准完成
5.2 速度控制模式
运行输出:
Angle_now:12.34,10.56
说明:
-
第一列:当前角度(弧度)
-
第二列:当前速度(rad/s)
-
电机以目标速度10 rad/s稳定运行
六、项目中遇到的难题及解决方法
6.1 问题一:编码器方向检测失败
问题描述:
在初始化时,编码器方向检测偶尔失败,导致电机无法正常运行。
原因分析:
-
电机阻力过大,无法自由转动
-
校准电压设置不当
-
编码器信号干扰
解决方法:
-
检查电机机械连接,确保无卡滞
-
调整校准电压
voltage_sensor_align从4V降低到2V -
增加延时,确保电机有足够时间响应
-
添加错误处理,检测失败时自动重试
关键代码:
// 调整校准电压
voltage_sensor_align = 2.0f; // 从4V降低到2V
// 增加延时
delay_ms(700); // 确保电机稳定
// 错误处理
if (moved < 0.01f) {
PRINTF("MOT: Failed to notice movement.\r\n");
M1_Disable(); // 关闭驱动,防止损坏
return 0;
}
6.2 问题二:电流采样噪声大
问题描述:
电流采样值波动大,导致FOC控制不稳定,电机抖动。
原因分析:
-
ADC采样时机与PWM开关不同步
-
电流采样电路噪声
-
未进行滤波处理
解决方法:
-
使用PWM触发ADC采样,确保在PWM中心点采样
-
增加RC滤波电路
-
软件上增加低通滤波器
关键代码:
// 配置PWM触发ADC
#define ADC1_TRIGGER_PWM0_VAL4 0U
// 低通滤波器初始化
LPF_current_q.Tf = 0.02f; // 时间常数20ms
// 滤波运算
current.q = LPFoperator(&LPF_current_q, current.q);
current.d = LPFoperator(&LPF_current_d, current.d);
6.3 问题三:PID参数整定困难
问题描述:
PID参数整定困难,电机容易出现振荡或响应慢。
原因分析:
-
电机参数未知
-
PID参数初始值不合理
-
未考虑积分饱和问题
解决方法:
-
先使用纯P控制,逐步增加I参数
-
使用Ziegler-Nichols方法初步整定
-
添加抗积分饱和处理
关键代码:
// 速度环PID参数
PID_velocity.P = 0.11f; // 先调P
PID_velocity.I = 0.98f; // 再调I
PID_velocity.D = 0; // D参数设为0
// 抗积分饱和
integral = _constrain(integral, -PID->limit, PID->limit);
output = _constrain(output, -PID->limit, PID->limit);
6.4 问题四:SVPWM输出异常
问题描述:
SVPWM计算结果异常,导致电机发热严重。
原因分析:
-
扇区判断错误
-
占空比计算溢出
-
电压限制不当
解决方法:
-
检查扇区计算逻辑
-
添加占空比限制
-
合理设置电压限制
关键代码:
// 电压限制
if (voltage_sensor_align > voltage_limit)
voltage_sensor_align = voltage_limit;
// 占空比限制
if (Uout > 0.577f) Uout = 0.577f;
if (Uout < -0.577f) Uout = -0.577f;
七、心得体会
7.1 技术收获
通过本次项目的开发,我获得了以下技术收获:
7.1.1 FOC控制原理
深入理解了FOC控制的核心原理:
-
坐标变换:Clark变换和Park变换的数学原理和物理意义
-
SVPWM:空间矢量脉宽调制的实现方法
-
级联PID:位置环、速度环、电流环的协调工作
7.1.2 MCXA346应用
掌握了MCXA346的电机控制应用:
-
FLEXPWM:高精度PWM配置和使用
-
EQDC:正交编码器接口的配置
-
LPADC:低功耗ADC的同步采样
7.1.3 软件架构设计
学习了嵌入式软件的分层架构设计:
-
ASW/BSW分层:应用层和基础软件层的划分
-
模块化设计:高内聚、低耦合的模块设计
-
实时系统设计:中断驱动的实时控制架构
7.2 开发经验
7.2.1 调试技巧
-
分步调试:先验证硬件,再验证软件
-
串口输出:充分利用串口输出调试信息
-
示波器观测:使用示波器观测PWM和电流波形
-
参数记录:记录每次参数调整的结果
7.2.2 问题排查
-
从简单到复杂:先检查硬件连接,再检查软件配置
-
隔离法:逐个模块验证,缩小问题范围
-
对比法:与参考设计对比,找出差异
-
文档查阅:仔细阅读芯片手册和SDK文档
7.3 项目感悟
7.3.1 理论与实践结合
通过本项目,深刻体会到理论与实践结合的重要性:
-
书本上的FOC理论在实际应用中需要考虑很多细节
-
电机参数对控制效果影响很大
-
硬件设计和软件算法需要协同优化
7.3.2 持续学习
电机控制是一个复杂的领域,需要持续学习:
-
控制理论的学习
-
新型电机和驱动技术的了解
-
先进控制算法的研究
7.3.3 开源社区
感谢开源社区提供的资源:
-
SimpleFOC:提供了优秀的FOC算法参考
-
NXP SDK:提供了完善的驱动支持
-
电子森林:提供了学习交流的平台
7.4 未来展望
7.4.1 功能扩展
计划在后续版本中增加以下功能:
-
CAN总线通信:实现多电机组网控制
-
参数存储:支持参数掉电保存
-
故障诊断:增加过流、过压、过温保护
-
上位机软件:开发图形化调试工具
7.4.2 性能优化
-
算法优化:优化FOC算法执行效率
-
控制精度:提高速度和位置控制精度
-
响应速度:优化PID参数,提高响应速度
7.4.3 应用拓展
-
机器人关节:应用于机器人关节电机控制
-
无人机电调:开发无人机无刷电机电调
-
工业伺服:开发工业伺服驱动器
7.5 致谢
感谢以下组织和个人的支持:
-
电子森林(eetree.cn):提供Funpack活动平台,让我有机会学习和实践
-
得捷电子(Digi-Key):提供FRDM-MCXA346开发板赞助
-
NXP半导体:提供MCXA346芯片和完善的SDK支持
-
SimpleFOC社区:提供开源FOC算法参考
-
开源社区:提供各种开源工具和库
特别感谢Funpack活动的组织者,为我们提供了这么好的学习机会。通过本次活动,不仅学到了电机控制的知识,还结识了很多志同道合的朋友。
八、附件
8.1 完整代码文件
完整代码文件已打包,包含以下内容:
Train/
├── Code/
│ ├── ASW/
│ │ └── SimpleFOC/
│ │ ├── FOC_Interface.c/h
│ │ ├── BLDCMotor.c/h
│ │ ├── FOCMotor.c/h
│ │ ├── MagneticSensor.c/h
│ │ ├── InlineCurrentSense.c/h
│ │ ├── CurrentSense.c/h
│ │ ├── pid.c/h
│ │ ├── lowpass_filter.c/h
│ │ ├── foc_utils.c/h
│ │ └── FOCBaseConfig.c/h
│ └── BSW/
│ └── OS/
│ └── TimerTask/
│ ├── APP_TimerTask.c/h
├── source/
│ └── Train.c
└── ... (其他文件)
8.2 参考资料
-
NXP MCXA346 Reference Manual
-
FRDM-MCXA346 User Manual
-
SimpleFOC Library Documentation
-
FOC控制算法原理与应用
-
SVPWM算法详解

