Funpack5-4 - 基于FlexPWM + DMA实现与四合一电调通信进而驱动穿越机电机
该项目使用了frdm-mcxn236,实现了dshot600协议通信和验证作为飞控的设计,它的主要功能为:飞控 通讯 dshot600。
标签
Funpack活动
奥托卡波利斯
更新2026-10-19
16

基于 MCXN236 的无人机飞控可行性验证与 DShot600 电调控制实验

一、项目介绍

本项目以 NXP MCXN236 微控制器为核心,围绕无人机飞行控制器的硬件基础与电机驱动接口开展初步验证,重点研究 MCXN236 是否能够承担无人机飞控系统中的实时控制任务,以及如何利用其片上 PWM 外设、DMA 控制器等硬件资源,实现与无刷电机电子调速器(ESC)的数字通信。

无人机飞控是整个飞行系统的核心,需要完成传感器数据采集、姿态解算、控制算法运算、电机控制指令生成等任务。其中,电机控制接口不仅影响控制指令的传输效率,也直接关系到飞控系统的实时性和稳定性。传统 PWM 控制方式实现简单,但 DShot 数字协议能够直接传输数字化油门指令,并具有固定的数据帧结构和校验机制,因此适合作为本项目研究的电调控制接口。

本项目选择 DShot600 作为主要验证协议,使用 MCXN236 的 FlexPWM 外设生成时序信号,并结合 eDMA 实现数据传输,驱动 Hobbywing XRotor Micro 40A 4in1 BLHeli_S 四合一电调。电机采用丰云 2306C 2450KV 无刷电机,通过搭建主控、电调与电机组成的实验系统,初步探索 MCXN236 在无人机电机控制方面的应用方式。

目前项目主要完成了 DShot600 软件框架、PWM 输出配置、DMA 传输流程及油门控制接口的初步实现,并开展了实际硬件连接和调试。现阶段的研究重点是验证数字信号输出链路的正确性,尚未完成稳定的电机闭环控制、飞行姿态控制及整机飞行验证。

二、硬件组成及功能介绍

2.1 MCXN236 微控制器及开发板

MCXN236 是本项目的核心控制器,承担 DShot 数据帧生成、PWM 外设配置、DMA 传输管理和电机油门指令处理等任务。

项目使用其 FlexPWM 外设产生 DShot600 所需的定时脉冲,并利用 eDMA 将预先生成的数据缓冲区传输到 PWM 比较寄存器,以减少 CPU 在连续发送数据过程中的参与程度。该方案有利于提高数据输出的连续性,为后续扩展多电机控制、传感器采集和飞控实时任务调度提供基础。

2.2 Hobbywing XRotor Micro 40A 4in1 BLHeli_S 电调

项目采用 Hobbywing XRotor Micro 40A 4in1 BLHeli_S 四合一电调。该电调集成四路无刷电机驱动通道,可以接收飞控输出的油门控制信号,并完成电机换相及转速调节。

该型号支持 DShot 数字油门协议,包括 DShot150、DShot300 和 DShot600。因此,本项目选用 DShot600 作为主控与电调之间的通信协议,通过分别连接四路信号输入,为后续实现四电机独立控制建立硬件基础。

2.3 丰云 2306C 2450KV 无刷电机

项目使用丰云 2306C 2450KV 无刷电机作为被控对象。无刷电机具有较高的转速潜力,常用于多旋翼无人机动力系统。

电机通过四合一电调获得驱动能力,MCXN236 不直接驱动电机绕组,而是向电调发送数字油门指令,由电调完成实际的电机驱动控制。本项目首先验证电调通信与基础电机控制能力,后续再开展转速响应、动态性能和多电机协调控制研究。

2.4 连接关系

系统的基本硬件连接关系为:MCXN236 开发板提供控制信号,四合一电调接收 DShot600 数据并驱动无刷电机。主控与电调之间需要建立可靠的公共地连接,并确保各路信号对应正确的电调输入端。

当前实验以电机控制链路为重点,尚未接入完整的惯性测量、姿态估计及飞行控制系统。

image.png

图2-4

三、总体方案框图与设计思路

3.1 系统方案框图

本项目的基础控制链路可以表示为:

MCXN236 主控单元
↓
油门指令生成与 DShot600 数据帧编码
↓
FlexPWM 定时输出与 eDMA 数据传输
↓
四路 DShot 信号输出
↓
Hobbywing XRotor Micro 40A 4in1 电调
↓
丰云 2306C 2450KV 无刷电机

在软件内部,油门控制模块负责接收电机编号及油门百分比,将油门百分比转换为 DShot 原始油门值;数据编码模块负责生成符合协议格式的 16 位数据帧;PWM 与 DMA 模块负责按照设定的时序发送数据;电调接收数据后执行对应的电机控制指令。

image.png

图3-1

3.2 设计思路

本项目采用由底层到上层逐步验证的设计思路。

首先,完成 MCXN236 的 PWM 外设配置,建立符合 DShot600 时序要求的信号生成基础。其次,编写 DShot 数据帧编码函数,完成油门值转换、数据帧拼接及校验和计算。随后,通过 DMA 将编码后的数据缓冲区传输至 FlexPWM 对应子模块的比较寄存器,减少 CPU 持续更新输出数据的负担。

在此基础上,为四路电机分别设置独立的油门变量和数据缓冲区,使不同通道能够使用各自的油门指令。最后,通过调试器观察变量变化、DMA 传输状态和实际电调响应,逐步判断信号链路是否符合预期。

该方案的主要目标不是立即完成整机飞行,而是先验证 MCXN236 对多路电调数字通信的控制能力,为后续飞控功能开发提供可靠的底层基础。

四、软件开发环境、程序流程与关键代码

4.1 软件开发环境

本项目采用 MCXN236 对应的嵌入式开发工具链进行程序编写、编译和在线调试,使用芯片 SDK 提供的 PWM、DMA 及 GPIO 相关驱动接口完成底层外设配置,并通过调试器观察程序执行状态和关键变量。

软件主要由 DShot 协议处理、电机油门管理、PWM 初始化、DMA 传输配置及主程序控制等部分组成。各模块分工明确,便于后续独立测试与功能扩展。

4.2 软件执行流程

程序的基本执行流程如下:

  1. 系统启动,完成时钟及必要的外设初始化。
  2. 配置四路 FlexPWM 子模块,设置输出模式、计数周期及比较值。
  3. 配置四路 eDMA 通道,建立数据缓冲区到 PWM 比较寄存器的传输关系。
  4. 将四路电机的初始油门设置为零,生成对应的 DShot 数据帧。
  5. 启动 DMA 传输和 PWM 输出,持续发送电调控制数据。
  6. 当收到新的油门指令时,更新对应电机的油门变量。
  7. 根据最新油门值重新生成数据帧,并按照安全的缓冲区更新流程继续传输。
  8. 通过调试器和实际硬件观察信号输出、电调提示音及电机响应。

其中,第 7 步需要特别注意:仅更新油门变量并不会自动改变已经生成的数据帧,必须确保新数据进入实际发送的缓冲区,并且 DMA 能够正确地继续传输。

4.3 DShot 数据帧编码

在 dshot.c 中,dshot_encode() 函数负责生成 16 位 DShot 数据帧。标准 DShot 数据帧包含 11 位油门或命令字段、1 位遥测请求字段及 4 位校验和。

核心代码如下:

packet = (uint16_t)((throttle << 5) |
((tele_req & 1U) << 4));

crc = (uint16_t)((packet ^
(packet >> 4) ^
(packet >> 8)) & 0x0FU);

packet = (uint16_t)((packet & 0xFFF0U) | crc);

程序首先将油门值和遥测请求位放入数据帧对应位置,再计算 4 位校验和并填入低位。该设计使电调能够根据接收到的数据帧解析油门指令,并利用校验信息检查数据有效性。

代码还对油门值进行范围限制,并避免普通油门控制值落入特殊命令区间,从而降低油门参数设置错误带来的风险。

4.4 油门百分比转换

dshot_percent_to_raw() 函数将 0~100 的油门百分比转换为 DShot 原始油门值。程序对零油门进行单独处理,非零油门则映射到普通油门范围。

这一设计使上层控制代码不必直接操作协议原始数值,可以使用更直观的百分比接口控制各路电机。

需要注意的是,油门映射只是控制指令生成的一部分。电机能否实际响应,还取决于数据帧是否正确、DMA 是否持续发送有效数据,以及电调是否正确接收并接受指令。

4.5 PWM 比较值与 DMA 缓冲区

dshot_fill_buffer() 函数将 16 位 DShot 数据帧转换为 PWM 比较值序列。程序从最高位开始依次读取数据帧中的每一位,并根据当前位的逻辑值选择不同的比较值。

当前实现使用 188 和 94 两个数值分别表示逻辑 1 和逻辑 0,前 16 个缓冲区元素用于发送数据帧,后续 84 个元素设置为零,以形成帧间低电平区间。

在硬件层面,FlexPWM 根据比较寄存器的配置产生相应脉冲,eDMA 则负责把缓冲区中的比较值写入对应 PWM 子模块的 VAL5 寄存器。该方式利用硬件定时器和 DMA 协同工作,减少软件逐位控制 GPIO 的开销。

不过,比较值 94 和 188 是否对应正确的 DShot600 脉冲宽度,需要结合实际 PWM 周期、计数器配置及寄存器更新时机进行验证,不能仅凭数值本身判断输出波形正确。

4.6 四路电机控制接口

DShot_SetMotorPercent() 函数根据电机编号更新对应的油门变量,包括 m0_throttle、m1_throttle、m2_throttle 和 m3_throttle。

这种设计将四路电机的油门状态独立保存,便于分别测试不同通道,也为后续接入飞控控制算法、实现多电机混控及统一管理电机输出提供了接口基础。

当前调试已经确认,m0_throttle 能够随油门指令正常变化。这说明至少在该变量的更新环节,软件控制链路能够正常工作。后续还需要继续验证油门变量是否及时进入 DMA 缓冲区,以及实际输出的 DShot 数据帧是否随之变化。

五、功能展示与实验说明

本项目目前的主要展示内容包括开发板与电调、电机的硬件连接,DShot600 数据帧编码代码,四路 PWM 与 DMA 初始化配置,以及调试器中油门变量的变化情况。

在软件层面,已经建立了 DShot 数据帧编码、油门百分比转换、四路电机油门管理及 DMA 数据传输的基本框架。在调试过程中,能够观察到油门变量随指令变化,并且在 MCU 启动 PWM/DMA 输出后,电调出现了与输出动作相关的规律性提示音。

但是,目前电调仍存在持续规律鸣叫、改变油门后电机没有正常转动或明显响应的现象。这说明项目已经进入实际硬件联调阶段,但尚不能认定 DShot600 通信和电机驱动已经完全验证成功。

因此,本阶段成果应定位为 DShot600 控制链路的初步实现与硬件验证,而不是已经完成四路电机稳定驱动,更不代表已经实现完整的无人机飞控功能。

aa534c6d1d9e4137763f884e826ad7a5_720.jpg

图5 主控板与穿越机连接图

六、项目中遇到的难题及解决思路

6.1 DShot600 时序生成

DShot600 对脉冲周期和高电平持续时间有明确要求,普通 PWM 输出并不能自动构成有效的 DShot 数据帧。因此,需要同时考虑 PWM 计数周期、比较值、数据位顺序和帧间间隔。

针对这一问题,项目采用 FlexPWM 生成定时脉冲,并通过预先编码的缓冲区控制不同数据位的输出。后续还需要结合实际波形或可靠的时序测量手段,进一步验证每个数据位的脉冲宽度和帧间隔。

6.2 PWM 与 DMA 的协同工作

使用 DMA 能够降低 CPU 的持续参与程度,但也引入了数据更新时机、传输长度、触发源和传输完成后的重启流程等问题。

本项目为四路 PWM 子模块分别配置 DMA 通道,并将数据写入对应的 VAL5 比较寄存器。当前需要重点检查 DMA 请求是否与相应子模块匹配、传输结束后是否正确继续发送,以及更新油门时是否避免修改正在被 DMA 读取的数据。

6.3 油门变量更新与实际电机响应不一致

调试中已经观察到油门变量能够正常变化,但改变油门后,电机并没有表现出预期的响应。由此可见,仅确认软件变量正确还不够,还需要逐层验证数据编码、DMA 缓冲区、PWM 实际输出和电调解码状态。

针对这一问题,后续计划采用单通道优先的调试方法,先固定其他三路输出,再单独验证一路电调。待单路能够稳定识别零油门并响应有效指令后,再逐步恢复四路输出,以降低多通道同步问题带来的排查难度。

6.4 缺少波形测量设备

在当前实验条件下,主要通过在线调试、变量观察和电调提示音判断系统状态。此类方法可以帮助发现软件层面的问题,但无法直接证明实际引脚波形符合 DShot600 协议。

后续应优先借助示波器或逻辑分析仪检查实际信号;在暂时没有相关设备的情况下,则通过单通道隔离、数据帧离线校验、DMA 状态检查和外设寄存器核对逐步缩小问题范围。

七、心得体会与后续计划

通过本次实验,我对微控制器底层外设与无人机动力系统之间的关系有了更加直观和深入的认识。实现 DShot600 并不只是生成一个 PWM 信号,还需要综合考虑协议数据帧、校验和、定时器比较值、DMA 传输流程以及电调的启动状态。这次从软件编码到实际硬件联调的过程,让我进一步认识到嵌入式开发中理论设计与硬件验证相结合的重要性。

在开发过程中,我对 MCXN236 开发板的硬件资源和应用潜力也有了更深的认识。MCXN236 提供的 FlexPWM、eDMA 等外设资源,为实现高精度定时信号输出和多通道数据传输提供了良好的硬件基础。通过将数据发送任务交由定时器与 DMA 协同完成,可以减少 CPU 对高频时序操作的直接参与,为后续开展传感器数据采集、姿态解算和实时控制算法运行预留计算资源。对于无人机飞控这类对实时性和任务协同性要求较高的应用而言,这种硬件资源与软件架构的结合具有较好的探索价值。


除了 DShot600 电调控制实验,我还开展了 LCD 显示屏相关实验,对显示设备的初始化、数据传输及界面显示等功能进行了探索。这部分工作使我对 MCXN236 的外设应用能力有了更加全面的认识,也让我看到该开发板不仅可以用于底层电机控制,还具备进一步承担状态显示、参数监测和人机交互等任务的潜力。如果后续将 LCD 显示与传感器采集、电机控制相结合,就可以实现对系统运行状态、传感器数据及控制参数的实时显示,为飞控系统的调试和运行监测提供便利。

本次开发也让我认识到,嵌入式系统的调试必须区分软件内部状态和外部硬件行为。例如,油门变量发生变化,只能说明相应变量更新成功;DMA 回调执行,也只能说明程序进入了对应的软件处理流程。这些现象均不能直接证明电调已经正确接收数据。只有将数据编码、缓冲区内容、外设输出与实际负载响应逐层对应起来,才能准确判断系统是否达到预期目标。目前,DShot600 输出与电调响应之间仍存在需要进一步排查的问题,这也让我更加重视模块化测试、故障定位和实验结果验证。


从整体开发体验来看,MCXN236 为本项目提供了值得继续探索的平台。通过本次实验,我初步验证了利用其 PWM 与 DMA 资源构建数字电调控制链路的思路,并通过 LCD 显示屏实验拓展了对显示交互功能的认识。虽然目前尚未完成稳定的四路电机驱动和完整的飞行控制功能,但现有实验已经为后续系统集成积累了基础。特别是在多外设协同、实时信号输出和模块化软件设计方面,MCXN236 具备进一步开展无人机飞控应用验证的价值。


下一阶段,我计划首先解决当前 DShot600 输出与电调响应不一致的问题,验证单路电机从零油门待机到接受有效指令的完整流程;随后恢复四路电机独立控制,检查多通道同步和数据更新的稳定性。在电机控制链路可靠运行后,再逐步加入 IMU 数据采集、姿态解算、PID 控制和电机混控模块。同时,可以进一步完善 LCD 显示功能,将传感器数据、电机控制状态和关键运行参数显示在屏幕上,逐步形成集数据采集、控制执行和状态显示于一体的实验平台。


总体而言,本项目以 MCXN236 为核心,完成了 DShot600 电调控制软件框架的初步搭建与硬件联调,并开展了 LCD 显示屏相关实验,初步探索了该开发板在电机控制和人机交互两个方向上的应用能力。通过这些实践,我不仅加深了对微控制器外设、数字通信协议和 DMA 工作机制的理解,也进一步明确了后续系统开发需要解决的问题。未来,我希望在现有实验基础上逐步完善传感器采集、姿态控制和多电机协调等功能,进一步验证 MCXN236 在完整无人机飞控系统中的应用可行性。

附件下载
Drone.zip
除了SDK 下载缓存__repo__文件夹 其它全部打包了
团队介绍
一人
团队成员
奥托卡波利斯
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号