简述BLHeli电调发展史及固件烧录和如何调整参数

基础知识

电调

  • ESC代表电子速度控制器,简称为电调。电调从飞行控制器接收油门信号,并以所需速度驱动无刷电机。

 

电调固件
  • 电调固件是在每个电调上运行的软件,它确定电调的性能,支持的协议以及可以使用的配置接口。电调可以使用的固件取决于硬件。

  • SimonK:最古老的两种开源电调固件之一,已经过时不再更新。

  • BLHeli:最古老的两种开源电调固件之一,由于其广泛的功能和友好的用户界面而变得流行。

  • BLHeli_S:BLHeli固件的第二代。专门为具有Busybee处理器的电调开发。

  • BLHeli_32:第三代和最新一代BLHeli固件。专门为32位电调编写,不再开源。

电调处理器
  • 市场上大多数电调使用ATMEL、Silabs和ARM的处理器。不同的处理器具有不同的规格和功能,并且受不同的固件支持。

  • ATMEL 8位:支持SimonK和BLHeli固件。

  • SILABS 8位:支持BLHeli或BLHeli_S固件。

    • 主要处理器是F330F39X系列的F390F396

    • Busybee处理器是F330和F39X的升级。有BusyBee1(EFM8BB10F8)和BusyBee2(EFM8BB21F16)两种。

  • ARM 32位:支持BLHeli_32固件。

电调协议
  • 电调协议是飞行控制器和电调用于通信的语言,决定了信号从飞控到电调的发送速度。

  • 四轴飞行器使用的电调协议及信号宽度

    • Standard PWM :1000us – 2000us

    • Oneshot125:125us – 250us

    • Oneshot 42:2us – 84us

    • Multishot:5us – 25us

    • Dshot

      • Dshot150 :106.8us

      • Dshot300 :53.4us

      • Dshot600 :26.7us

      • DShot1200:13.4us

    • ProShot

 

电调BEC
  • BEC表示 电池消除电路,本质上是电压调整器。作用是将主电池组的电压降压到5V输出。

  • 通常内置在电调中,消除了为5V电子设备供电所需的单独电池的麻烦。

BLHeliSuite

手册
  • BLHeliSuite的手册位于BLHeliSuiteManuals目录

  • BLHeliSuite的手册主要文件内容:

    • BLHeli manual xx xx.pdf:Atmel MCU和SiLabs MCU的电调的参数

    • BLHeli programming adapters.pdf:适配器的制作和使用

    • BLHeli supported xx ESCs.pdf:支持的Atmel和SiLabs电调的图片及参数

    • BLHeliSuite 4w-if interfaces pinout.pdf:Arduino板上用于Atmel/SiLabs电调的BLHeliSuite的4w-if的引脚配置

    • BLHeliSuite 4w-if protocol.pdf:用于Atmel/SiLabs电调的BLHeliSuite的4w-if的通信协议

 

适配器
首次刷新电调固件
  • SiLabs MCUs

    电调支持以下适配器

    • Arduinos:使用SILABS C2 (4way-if)接口。初次使用Arduinos作为适配器时需要对Arduinos进行编程烧录。

    • SiLabs Toolstick:使用SILABS C2 (Toolstick) 接口。

    • USB Flashing stick:使用SILABS C2 (Toolstick) 接口。

    • BLHeli Skywalker stick:使用SILABS C2 (Toolstick) 接口。

  • Atmel MCUs

    电调支持以下适配器

    • Arduinos:使用ATMEL ISP Interface (AVRDude) 接口。初次使用Arduinos作为适配器时需要对Arduinos进行编程烧录。

    • USBasp:使用ATMEL ISP Interface (AVRDude) 接口。

刷新电调引导程序
  • 刷新电调引导程序为BLHeli主要有USB/Com4way-if两种类型的接口。

  • Arduinos(4way-if):使用SILABS BLHeli Bootloader (4way-if)ATMEL BLHeli Bootloader (4way-if)接口。使用Arduinos作为适配器时需要对Arduinos进行编程烧录。

  • Arduinos(USB/UART 1-Wire bridge):使用SILABS BLHeli Bootloader (USB/Com)ATMEL BLHeli Bootloader (USB/Com)接口。使用Arduinos作为适配器时需要对Arduinos进行编程烧录。

  • Favourite stick:使用SILABS BLHeli Bootloader (USB/Com)ATMEL BLHeli Bootloader (USB/Com)接口。

  • FTDI stick:使用SILABS BLHeli Bootloader (USB/Com)ATMEL BLHeli Bootloader (USB/Com)接口。

  • Multistar stick:使用SILABS BLHeli Bootloader (USB/Com)ATMEL BLHeli Bootloader (USB/Com)接口。

背景说明

  • 适配器:Arduino Nano ATMEGA328P

  • 电调:主控芯片SIL F330,功率管AON6504,供电1-4S,电流20A-30A,无BEC

 

操作说明

前期准备

  1. 下载Arduino Nano所用的USB转串口芯片CH340C的驱动程序CH341SER.ZIP,安装驱动。

  2. 下载BLHeliSuite,一般下载BLHeliSuite16714902.zip即可。

  3. 根据电调外观和信息,查阅手册BLHeli supported xx ESCs.pdf 以确定电调型号。或者根据电调PCB确定电调的主控芯片型号。

  4. 根据电调的主控芯片型号,查阅手册BLHeli programming adapters.pdf以确定需要用到的适配器和接口,以及适配器的制作方法。

  5. 根据所使用的适配器和所需操作使用的接口,查阅手册BLHeliSuite 4w-if interfaces pinout.pdf 以确定引脚连接。

制作适配器

  1. 连接适配器和电脑,打开BLHeliSuite。

  2. 点击Make interfaces标签页。

  3. 点击Port选择USB-SERIAL CH340 对应的端口,点击Arduino Board选择Nano w/ ATmega328开发板,点击Baud选择115200波特率,点击Arduino 4way-interface

  4. 点击OK,选择最后一个文件后点击打开

  5. 点击Yes

  6. 等待烧录Arduino,出现Arduino flashed sucsessfully by Avrdude表示已成功将Arduino Nano烧录为适配器。点击OK

 

连接电调

  1. 连接适配器和电调(VCC GND C2D C2CK)。

  2. 点击Select ATMEL/SILABS Interface选择SILABS C2 (4way-if)接口。

  3. 点击SiLabs ESC Setup标签页。

  4. 点击Port选择USB-SERIAL CH340 对应的端口,点击connect,点击Read setup读出电调参数设置。

  5. 出现setup read successfully表示已成功连接到电调并读取到电调的参数。点击OK

刷新固件

  1. 点击Flash BLHeli

  2. 在弹出的窗口中选择固件名称、固件类型(MAIN:直升机主桨;TAIL:直升机尾桨;MULTI:多桨)、固件版本,点击OK

  3. 点击Yes

  4. 等待烧录固件,出现sucsessfully表示已成功将电调固件烧录到电调。点击OK。在下一个弹出的窗口中点击Yes

调整参数

  1. 点击ESC Setup选择Save Setup to ini file 以备份电调当前的参数。

  2. 修改电调参数。降低启动功率,降低电调输出的PWM频率,开启低转速功率保护。

  3. 点击Write setup将参数写入电调。

  • 多轴编程参数表

  • 电调参数说明,详见官方手册BLHeli manual xx xx.pdf

    英文参数中文参数参数说明
    Startup power启动功率启动时允许的最大功率,实际的功率取决于油门的输入。
    Motor timing电机进角通常设置中进角即适用于大部分电机,但如果电机运转不顺畅时,可以尝试改变进角。
    Demag compensation消磁补偿防止电机换向后消磁时间过长而引起的电机停转。补偿值越高,保护越好。但补偿值太高,会降低最大功率。
    Motor direction电机转向在双向模式下,油门中点为零点,中点以上为正转,中点以下为反转。
    Startup Beep Volume蜂鸣器音量设置正常运行下蜂鸣音量。
    Beacon/Signal Volume信标音量设置信标的音量。如果零油门信号的时间超过一个设定的时间,电调控制马达发出警报声。以便于找回丢失的飞行器。
    Beacon delay信标延迟设置信标开始发出之前的延时。
    PPM Min throttle; PPM max throttle; PPM center throttle最小油门; 最大油门; 中位油门设置电调的油门行程量。中位油门只用于双向模式。正常情况下, 油门信号值在1000us-2000us之间。 对于其他数值输入信号, 则需要做相应比例换算。
    Temperature protection温度保护温度保护阀值可以设置为80℃-140℃。
    Low RPM power protect低转速功率保护禁用可以保证低KV电机在低电压运行时实现全功率。但是禁用后会加剧同步丢失的风险,导致烧坏电机。
    Brake on stop停车制动在通电状态,零油门时会有刹车功能。如果油门没有零点,此项设置无效。
    Closed Loop Mode闭环模式设置控制环的运行速度范围。在闭环模式下,运行时的油门值对应电机的转速目标。关闭时将禁用控制环。
    Closed Loop P-Gain闭环比例增益设置转速控制环的比例增益。控制从速度误差到电机功率的增益。
    Closed Loop I-Gain闭环积分增益设置转速控制环的积分增益。控制从积分速度误差到电机功率的增益。
    Motor Gain电机增益缩放给定输入施加到电机的功率。仅适用于PWM输入,对PPM输入则无效。会限制电机的最大功率。
    PWM Output DitherPWM输出抖动增加电机PWM关闭周期的长度。减少在PWM频率等于电机换向频率的谐波的转速区域中的问题,并且可以减少达到全油门的步进。不适用于闭环模式。
    PWM Frequency/DampedPWM频率/阻尼设置电调输出的PWM频率。高PWM频率约为20kHz,低PWM频率约为8kHz,轻阻尼模式始终使用高pwm频率。低频率PWM减小了到满功率的步进。轻阻尼模式会增加电机的损耗,从而加快减速速度。
    Enable PWM Input启用PWM输入如果禁用,则仅接受1-2ms 脉宽的PPM和 OneShot125(125-250us)作为有效输入信号。启用后支持1kHz,2kHz,4kHz,8kHz和12kHz 的PWM输入信号。
    Input Polarity输入极性用于反转油门。与提供负PWM的接收器一起使用。使用PPM输入时,必须将其设置为正。

注意事项

  • 据说电调名称所写的FVT Littlebee 20A并不是真实型号,升级固件可能导致电调烧毁。

  • 电调在驱动电机运转前需要执行解锁序列以进行解锁

    1. 上电时, 电调发出3声蜂鸣声。

    2. 当检测到油门信号时, 发出一声低音。 表示解锁信号序列开始。

    3. 当油门减小到零时, 发出一声高音。 表示解锁信号序列结束。

  • SILABS电调接口标号为A、B、C、D,Atmel电调接口标号为1、2、3、4、5、X。通过接口所对应的标号,可以在Make interfaces界面方便快捷的得知需要制作的适配器。

  • 在使用Arduino Nano w/ ATmega328P作为适配器时。如果Arduino Nano使用的是旧版的引导程序,波特率设置为57600;如果Arduino Nano使用的是新版的引导程序,波特率设置为115200

 

/* This file is part of AutoQuad ESC32. AutoQuad ESC32 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. AutoQuad ESC32 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with AutoQuad ESC32. If not, see . Copyright © 2011, 2012 Bill Nesbitt */ /* * pwm.c文件.此文件有2个功能,2个功能分别使用,不能同时使用 * 1、pwm in输入模式,pwm输入中断里,调用runNewInput函数 * 2、one wire通讯协议,pwm输入中断里,调用owEdgeDetect函数,来输入新的数据,调用owReset函数来复位1wire通讯 * */ #include "pwm.h" #include "timer.h" #include "run.h" #include "main.h" #include "ow.h" #include "stm32f10x_gpio.h" #include "stm32f10x_tim.h" #include "misc.h" static int16_t pwmMinPeriod; //timer1 ch1 pwm 输入最小周期 static int16_t pwmMaxPeriod; //timer1 ch1 pwm 输入最大周期 int16_t pwmMinValue; //timer1 ch2 pwm 输入最小周期 static int16_t pwmMaxValue; //timer1 ch2 pwm 输入最大周期 int16_t pwmLoValue; int16_t pwmHiValue; int16_t pwmMinStart; volatile uint32_t pwmValidMicros; //关闭输入捕获比较中断 1和2 void pwmIsrAllOff(void) { PWM_TIM->DIER &= (uint16_t)~(TIM_IT_CC1 | TIM_IT_CC2);//关闭中断 } //开启输入捕获比较中断 1和2 void pwmIsrAllOn(void) { PWM_TIM->CCR1; PWM_TIM->CCR2; PWM_TIM->DIER |= (TIM_IT_CC1 | TIM_IT_CC2);//允许捕获比较 1 2中断 } //开启捕获比较2中断 void pwmIsrRunOn(void) { uint16_t dier = PWM_TIM->DIER; dier &= (uint16_t)~(TIM_IT_CC1 | TIM_IT_CC2); dier |= TIM_IT_CC2;//允许捕获/比较2中断 PWM_TIM->CCR1; PWM_TIM->CCR2; PWM_TIM->DIER = dier; } //timer 1 void pwmInit(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; pwmSetConstants(); // TIM1 channel 1 pin (PA.08) configuration GPIO_InitStructure.GPIO_Pin = PWM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(PWM_PORT, &GPIO;_InitStructure); // Enable the TIM1 global Interrupt NVIC_InitStructure.NVIC_IRQChannel = PWM_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC;_InitStructure); TIM_TimeBaseStructInit(&TIM;_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = (PWM_CLK_DIVISOR-1); TIM_TimeBaseStructure.TIM_Period = 0xffff; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(PWM_TIM, &TIM;_TimeBaseStructure); TIM_ICInitStructure.TIM_Channel = PWM_CHANNEL; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_PWMIConfig(PWM_TIM, &TIM;_ICInitStructure); // Select the TIM Input Trigger: TI1FP1 // 滤波后的定时器输入1(TI1FP1) TIM_SelectInputTrigger(PWM_TIM, TIM_TS_TI1FP1); // Select the slave Mode: Reset Mode TIM_SelectSlaveMode(PWM_TIM, TIM_SlaveMode_Reset);//复位模式 // Enable the Master/Slave Mode TIM_SelectMasterSlaveMode(PWM_TIM, TIM_MasterSlaveMode_Enable); // TIM enable counter TIM_Cmd(PWM_TIM, ENABLE); pwmIsrAllOn(); } //timer1 TIM1_CC_IRQHandler中断 void PWM_IRQ_HANDLER(void) { uint16_t pwmValue; uint16_t periodValue; uint8_t edge; edge = !(PWM_TIM->SR & TIM_IT_CC2); periodValue = PWM_TIM->CCR1; //IO 输入PA8 周期 pwmValue = PWM_TIM->CCR2; //IO 输入(但是没有看到配置了使用哪个IO做为输入了) 脉宽长度 // look for good RC PWM input if (inputMode == ESC_INPUT_PWM && //PWM输入模式 periodValue >= pwmMinPeriod && periodValue = pwmMinValue && pwmValue <= pwmMaxValue //脉宽长度 ) { if (edge == 0) { pwmValidMicros = timerMicros; runNewInput(pwmValue); //PWM正确.输入 } } } void pwmSetConstants(void) { float rpmScale = p[PWM_RPM_SCALE]; pwmMinPeriod = p[PWM_MIN_PERIOD] = (int)p[PWM_MIN_PERIOD];//PWM最小周期 timer1 ch1 pwmMaxPeriod = p[PWM_MAX_PERIOD] = (int)p[PWM_MAX_PERIOD];//PWM最大周期 timer1 ch1 pwmMinValue = p[PWM_MIN_VALUE] = (int)p[PWM_MIN_VALUE]; //PWM最小周期 timer1 ch2 pwmMaxValue = p[PWM_MAX_VALUE] = (int)p[PWM_MAX_VALUE]; //PWM最大周期 timer1 ch2 pwmLoValue = p[PWM_LO_VALUE] = (int)p[PWM_LO_VALUE]; pwmHiValue = p[PWM_HI_VALUE] = (int)p[PWM_HI_VALUE]; pwmMinStart = p[PWM_MIN_START] = (int)p[PWM_MIN_START]; if (rpmScale PWM_RPM_SCALE_MAX) rpmScale = PWM_RPM_SCALE_MAX; p[PWM_RPM_SCALE] = rpmScale; } ESC32开源电调 源码与原理图,此源码采用RTT操作系统,CAN PWM操作方式 ,本人已用PWM方式成功驱动起来,CAN 暂且还没做测试。 此资料是 啊嘉 开源出来的,好资料不敢独享,稍加整理放到这与大家共享。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金戈鐡馬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值