【Quad FPV】BLDC:BLHeli_S从硬件PCB设计到Keil编译、下载

前言

大学接触到多旋翼无人机以来,飞行水平未见提高,倒是一直在关注遥控设计和机体设计方面。本文记录关于BLHeli电调设计开发过程中的一些坑。

参考文档:

  • timegate 墨鸢,moyuan2000@163.com《无感无刷直流电机之电调设计全攻略 》
  • 逗倪豌儿,联系方式现已失效,《编译 BLHeli_S 的正确方式》
  • BLHeli固件开源地址:https://github.com/bitdump/BLHeli.git
  • BLHeli上位机:https://github.com/blheli-configurator/blheli-configurator.git

开发环境和固件版本:

  • Keil版本:C51V960,注意V960版本之前可能并无EFM8BB2x器件包
  • BLHeli版本:Rev16.7,采用J.inc头文件
  • MCU:EFM8BB21F15G,QFN20封装
  • 栅极驱动器:FD6288Q
  • MOS:NCEP30T12G,封装DFN8_5x6mm,30V 120A NMOS-FET
  • 调试器:U-EC6,C2调试器,注意必须要能够升级到v50固件
  • 控制信号:2kHz,占空比大于50%PWM信号

硬件

原理图

bls_j_v3
注意根据硬件设计来选取后续软件的编译选项,错误搭配会烧MOS

换相检测电路请添加图片描述

此处可以谈一下这个反馈电阻网络。不同于FOC,BLDC不加装额外的转子位置传感器,而是通过三相过零事件来判断换相时机。根据基尔霍夫定律,假定目前AB导通(Q1、Q4),即:

  • pA=BAT(Q1导通),pB=0(Q4导通)
  • pC的电压由C相绕组的反电动势和绕组中点叠加而成,取pC = Ui,作为自变量
  • 转子旋转过程中,pC点电压从起始的BAT降低,过零时等于BAT/2,过零后进一步降低
  • 按照图中的电阻阻值设置,根据基尔霍夫定律可以列出:
    { B A T − U A 47 K + U M − U A 10 K = U A 4.7 K 0 − U B 47 K + U M − U B 10 K = U B 4.7 K U i − U C 47 K + U M − U C 10 K = U C 4.7 K U A − U M 10 K + U C − U M 10 K = U M − U B 10 K \begin{cases} \frac{BAT-U_A}{47K}&+&\frac{U_M-U_A}{10K}=\frac{U_A}{4.7K}\\ \frac{0-U_B}{47K}&+&\frac{U_M-U_B}{10K}=\frac{U_B}{4.7K}\\ \frac{U_i-U_C}{47K}&+&\frac{U_M-U_C}{10K}=\frac{U_C}{4.7K}\\ \frac{U_A-U_M}{10K}&+&\frac{U_C-U_M}{10K}=\frac{U_M-U_B}{10K} \end{cases} 47KBATUA47K0UB47KUiUC10KUAUM++++10KUMUA=4.7KUA10KUMUB=4.7KUB10KUMUC=4.7KUC10KUCUM=10KUMUB
    联立后可得
    { B A T + 4.7 U M = 15.7 U A 4.7 U M = 15.7 U B U i + 4.7 U M = 15.7 U C 3 U M = U A + U B + U C \begin{cases} BAT&+&4.7U_M&=15.7U_A\\ &&4.7U_M&=15.7U_B\\ U_i&+&4.7U_M&=15.7U_C\\ &&3U_M&=U_A+U_B+U_C \end{cases} BATUi++4.7UM4.7UM4.7UM3UM=15.7UA=15.7UB=15.7UC=UA+UB+UC
    最终,可以导出
    { U M = 0.030 U i + 0.030 B A T U C = 0.065 U i + 0.001 B A T \begin{cases} U_M=0.030U_i+0.030BAT\\ U_C=0.065U_i+0.001BAT \end{cases} {UM=0.030Ui+0.030BATUC=0.065Ui+0.001BAT
    可以看出,U_M截距较大,U_C斜率较大,当C绕组平行于磁场方向时,反向电动势为0,将产生过零事件,MCU换相。

自举电路

由于采用双NMOS全桥驱动,所以每一相都设计了自举电路。


软件环境搭建

  • 关于MCU和调试器
    本文的硬件方案使用了EFM8BB2作为控制器。BLHeli项目发展至今,前后用过多款控制器,从最初的德国MK电调迁移来的ATmega8系列的BLHeli,到SiLab魔改的C8051内核的F系列(较旧)和EFM8BB2系列的BLHeli_S(也是某宝绝大多数电调所用的控制器),目前已经发展到基于ST的32位MCU的BLHlei_32。
    虽然另一个基于STM32F103的无刷电调项目ESC32也能在网上找到制作资料,但目前ST的单片机涨价过于离谱,且STM32F103不管哪种封装,占地面积都要远大于EFM8BB2的QFN20 3x3mm,因此我还是更愿意选择本文的EFM8BB2硬件方案。
    51单片机作为一种上世纪的技术,如今在成本(涨价前)和性能上受到ST、TI等32位MCU的全方位碾压。不过C8051显然还没有完全退出历史舞台。
    EFM8BB2是SilLab推出的一种魔改C8051,3.3V供电,主频可达50MHz,可以由内部RC产生时钟,支持C2接口的调试器进行在线Debug。我想,除了这个电调项目以外,任何需要逻辑电路但又不值得上STM32的需求场合,其实都不妨用这款单片机来完成。
    BLHeli_S固件则采用活跃在本科课堂上的C8051汇编语言编写。下面我们使用熟悉的Keil环境来进行编译下载。
    调试器方面,使用C2调试器,某宝搜索关键词“U-EC5”能搜到很多25元左右的C2调试器,但一定要问清楚,调试器是否支持固件升级。调试器连接目标MCU时会要求升级,一些调试器由于版本过于古早,是不能升级使用的。
  • 安装Keil、配置下载器
    在官网下载Keil c51v960或更新版本(旧版本Keil的Devices中没有EFM8系列单片机)。按照下列步骤在Keil中配置C2调试器:
    1. 安装Keil的C8051调试器插件SiC8051F_uVision
    2. 安装UtilDLL
  • 新建工程
    1. 到BLHeli的官方页面down下来源码
    2. 启动Keil C51,new一个Project
    3. Option - Device选项卡中选择器件EFM8BB21F16G-QFN20
    4. 将.\BLHeli-master\BLHeli_S SiLabs路径下的BLHeli_S.asm文件添加到工程中。其中是BLHeli的主要业务代码。
    5. 将上述.asm文件所在路径加入到到C51选项卡中includePath
  • 修改编译选项
    请添加图片描述
  1. 反注释“ESCNO EQU J_”这一行代码,选择port mapping文件J。具体解释一下,请翻到“; List of enumerated supported ESCs”行注释,注释底下的A_~W_指的是不同硬件方案下的IO分配,以J_ EQU 10这一行为例,行注释中L2=P0.7,L1=P0.6,L0=P0.5,RC即信号输入IO,本方案是P0.4;CC是上面提到的电阻反馈网络公共端,对应P0.3;MB是B相反馈,对应P0.2;MA是A相反馈,对应P0.1;MC是C相反馈,对应P0.0;接下来2个X是未使用;Ac ~ Cc是P1.0 ~ P1.2,分别是三相H桥上管;Cp ~ Ap是P1.3 ~ P1.5,分别是三相H桥下管;
  2. 反注释“MCU_48MHZ EQU 1”一行,如果主控MCU是EFM8BB1则不需要注释
  3. 反注释“FETON_DELAY EQU 15”一行。
  • 编译请添加图片描述
  • 插入调试器。设备管理器中只显示一个USB Device,而不显示具体的设备名称。调试器本身会自动安装驱动。
  • 配置工程的Debug选项。请添加图片描述
    打开Option - Debug,选择右侧Use:…,下拉后选择Silicon Lab C8051Fxxx Driver调试器(就是日常选择JLink的那个下拉菜单,若无该调试器则说明第1步失败),然后点击右侧Settings,选择“USB Debug Adapter”(若为灰色请检查调试器是否正常工作,可以尝试用USB Debug Adapter Firmware Reset.exe 软件来重置烧录器固件)。选好以后点击OK。
  • 配置工程的Utilities选项。
    请添加图片描述
    再到Debug选项卡右侧的Utilities选项卡,选择Use Target Driver For Flash Programming,并在底下的下拉菜单中选择Silicon Labs C8051Fxxx Driver。此时,下载器就绪。
  • 下载
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    此时可能要求更新固件到40,更新即可。但若调试器过于古早,更新后会提示UE-C5断开连接,此时可以通过USB Debug Adapter Firmware Reset.exe重置固件来使重新连接调试器,但无法给目标MCU下载固件,请考虑换一家店购买调试器。另外,C2调试器向外供电能力孱弱,非常不建议用C2调试器给目标电调供电。

BLHeli上位机BLHeliSuite

  1. 通过Arduino来制作C2调试器
  2. 魔改CP2102等USB转串口芯片来制作单线双工USB串口
  3. 直接使用U-EC5调试器连接上位机
  4. 较新的固件可以直接用Betaflight Configuator来读写多个电调的固件
  • 18
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
FPV机械臂夹取物体的代码编写需要考虑以下几个方面: 1. 控制机械臂的运动,使其移动到正确的位置和角度。 2. 控制机械臂的夹爪(或夹具)打开和关闭,以夹取物体。 3. 识别物体的位置和形状,以确定机械臂的运动和夹取的位置。 下面是一个简单的 Python 代码示例,可以实现机械臂夹取物体的功能: ```python import cv2 import numpy as np import time import Adafruit_PCA9685 # 初始化PCA9685,控制舵机 pwm = Adafruit_PCA9685.PCA9685() pwm.set_pwm_freq(50) # 设置舵机的初始位置和角度 servo_min = 102 servo_max = 512 servo_mid = 307 servo_angle = 0 # 控制舵机转动到指定的角度 def set_servo_angle(channel, angle): pulse_width = 1000 + 2000 * angle / 180 pwm.set_pwm(channel, 0, pulse_width) # 识别物体的位置和形状 def detect_object(img): # 在图像中找到物体的位置和形状 # 返回物体的中心坐标和形状信息 return center_x, center_y, shape_info # 控制机械臂运动和夹爪打开/关闭 def control_arm(position, angle, gripper): # 控制机械臂移动到指定的位置和角度 set_servo_angle(1, position) set_servo_angle(2, angle) # 控制夹爪打开/关闭 if gripper == 'open': set_servo_angle(3, servo_max) elif gripper == 'close': set_servo_angle(3, servo_min) else: pass # 主函数 if __name__ == '__main__': # 初始化摄像头 cap = cv2.VideoCapture(0) # 循环运行 while True: # 读取摄像头图像 ret, img = cap.read() # 识别物体的位置和形状 center_x, center_y, shape_info = detect_object(img) # 根据物体的位置和形状,控制机械臂运动和夹爪打开/关闭 control_arm(position, angle, gripper) # 显示图像 cv2.imshow('image', img) cv2.waitKey(1) # 退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头资源 cap.release() cv2.destroyAllWindows() ``` 需要注意的是,这只是一个简单的示例代码,实际上还需要根据具体的硬件和任务需求进行更加详细的代码编写。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值