开源BLHELI-S 代码详细解读(三)

【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-config 阅读详情
AI摘要

文章详细描述了一个嵌入式系统中用于检测BEMF信号的算法,涉及wait_for_comp_out_low和wait_for_comp_out_high两个函数,通过比较器输出判断转向和刹车状态,以及处理不同速度和启动阶段的计时策略,确保信号的正确读取和系统响应的准确性。

我们接着细细读一下wait_for_comp_out_low和wait_for_comp_out_high。


       如上面看到的,这两个方法是由 run1-6最开始读取的, 可以看到,high low都差不多,只是访问的Bit_Access不一样, BitAccess是用来检查CMP0CN0.CPOUT的结果的,就是CPOUT是0表示电压CP0P < CP0N,1表示CP0P > CP0N。 即当不是转向刹车时,wait..low的时候,要看看CP0P小于CP0N,  wait..high相反。

      测试的针脚在换相的时候更换,如P.inc的针脚布局看到的,检测A相时CMP0MX = 43h,B相是23h, C相是13h. 查手册得,三个的CP0P(正比较输入)都是P0.3 就是公共com, 然后CP0N(负比较输入)A相是P0.4  B相是P0.2, C相是P0.1。

      HIGH_RPM这个标志是当前的电机运行速度,在计算时机的时候会清空或者设置。(当Comm_Period4x_H less than 2)

先是把demag的检测标志(DEMAG_DETECTED)设置为1, 然后重置比较器的读取次数为零(Comparator_Read_Cnt), 然后统一跳到wait_for_comp_out_start.


;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Wait for comparator to go low/high routines
;
; No assumptions
;
; Waits for the zero cross scan wait time to elapse
; Then scans for comparator going low/high
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
wait_for_comp_out_low:
	setb	Flags0.DEMAG_DETECTED		; Set demag detected flag as default
	mov	Comparator_Read_Cnt, #0		; Reset number of comparator reads
	mov	Bit_Access, #00h			; Desired comparator output
	jnb	Flags1.DIR_CHANGE_BRAKE, ($+6)
	mov	Bit_Access, #40h		
	ajmp	wait_for_comp_out_start

wait_for_comp_out_high:
	setb	Flags0.DEMAG_DETECTED		; Set demag detected flag as default
	mov	Comparator_Read_Cnt, #0		; Reset number of comparator reads
	mov	Bit_Access, #40h			; Desired comparator output
	jnb	Flags1.DIR_CHANGE_BRAKE, ($+6)
	mov	Bit_Access, #00h		

Temp1是需要读到的次数,temp2是最多读到的次数,先都设置为1.

然后判断Flags1.HIGH_RPM为1,直接跳到comp_scale_samples,

否则 把temp1和temp2乘以2,跟着检查一下是不是启动的两个阶段,如果是的话,清空清磁检测标志(Flags0.DEMAG_DETECTED)。

然后赋值Temp2=20, 接着把Comm_Period4x_H 除以2, 然后把结果赋值给Temp1,  同时限制Temp1在1-20之内。

接着检查当前阶段是不是STARTUP_PHASE,要是的话,直接Temp1= 27, Temp2=27.

接着看看是不是48Mhz的cpu,要是的话Temp1和Temp2都乘以2.

上面这一堆代码其实都是根据条件来计算出Temp1和Temp2的值。

然后,我们来到comp_check_timeout,这里主要是检查是不是超时了,

      如果T3_PENDING(zero cross 扫描超时会置0,开始扫描时setup_zc_scan_timeout置1)是1或者Comparator_Read_Cnt是零,跳到comp_check_timeout_not_timed_out, 说明还没有超时。

否则就是超时了,进入超时的处理:

        A.如果不是STARTUP_PHASE,跳到comp_check_timeout_timeout_extended,这里会设置Flags0.COMP_TIMED_OUT, 然后跳到setup_comm_wait。

       B. 否则就是在启动的阶段(STARTUP_PHASE),这里会将Startup_Zc_Timeout_Cntd减1(超时次数,wait_before_zc_scan会把它设置成2),要是它还不是0,就跳到comp_check_timeout_extend_timeout,再调用setup_zc_scan_timeout。

comp_check_timeout_timeout_extended  这里会设置Flags0.COMP_TIMED_OUT, 然后跳到setup_comm_wait。


wait_for_comp_out_start:
	; Set number of comparator readings
	mov	Temp1, #1					; Number of OK readings required
	mov	Temp2, #1					; Max number of readings required
	jb	Flags1.HIGH_RPM, comp_scale_samples	; Branch if high rpm

	mov	A, Flags1					; Clear demag detected flag if start phases
	anl	A, #((1 SHL STARTUP_PHASE)+(1 SHL INITIAL_RUN_PHASE))
	jz	($+4)
		
	clr	Flags0.DEMAG_DETECTED

	mov	Temp2, #20 				; Too low value (~<15) causes rough running at pwm harmonics. Too high a value (~>35) causes the RCT4215 630 to run rough on full throttle
	mov 	A, Comm_Period4x_H			; Set number of readings higher for lower speeds
	clr	C
	rrc	A
	jnz	($+3)
	inc	A
	mov	Temp1, A
	clr	C						
	subb	A, #20
	jc	($+4)

	mov	Temp1, #20
	
	jnb	Flags1.STARTUP_PHASE, comp_scale_samples

	mov	Temp1, #27				; Set many samples during startup, approximately one pwm period
	mov	Temp2, #27

comp_scale_samples:
IF MCU_48MHZ >= 1
	clr	C
	mov	A, Temp1
	rlc	A
	mov	Temp1, A
	clr	C
	mov	A, Temp2
	rlc	A
	mov	Temp2, A
ENDIF
comp_check_timeout:
	jb	Flags0.T3_PENDING, comp_check_timeout_not_timed_out		; Has zero cross scan timeout elapsed?

	mov	A, Comparator_Read_Cnt			; Check that comparator has been read
	jz	comp_check_timeout_not_timed_out	; If not read - branch

	jnb	Flags1.STARTUP_PHASE, comp_check_timeout_timeout_extended	; Extend timeout during startup

	djnz	Startup_Zc_Timeout_Cntd, comp_check_timeout_extend_timeout

comp_check_timeout_timeout_extended:
	setb	Flags0.COMP_TIMED_OUT
	ajmp	setup_comm_wait

接上面没有超时的流程走, 这里Comparator_Read_Cnt自增1,然后从CMP0CN0把值读到A,然后和上面选择的Bit_Access比较,如相等就跳到com_read_ok. 否则跳到comp_read_wrong。

comp_check_timeout_not_timed_out:
	inc	Comparator_Read_Cnt			; Increment comparator read count
	Read_Comp_Out					; Read comparator output
	anl	A, #40h
	cjne	A, Bit_Access, comp_read_wrong
	ajmp	comp_read_ok
	

如果是STARTUP_PHASE 的话,com_read_wrong这里会把Temp1自增1, 要是temp1大于等于temp2(最大次数),temp1减回1,变回来原来的值,就是temp1最多只能到temp2这个值了。

然后跳回上面的comp_check_timeout,循环。

如是当前不是STARTUP_PHASE, 会跳到comp_read_wrong_not_startup

comp_read_wrong:
	jnb	Flags1.STARTUP_PHASE, comp_read_wrong_not_startup

	inc	Temp1					; Increment number of OK readings required
	clr	C
	mov	A, Temp1
	subb	A, Temp2					; If above initial requirement - do not increment further
	jc	($+3)
	dec	Temp1

	ajmp	comp_check_timeout			; Continue to look for good ones

来到comp_read_wrong_not_startup,

             这里判断要是需要检查消磁,会跳到comp_read_wrong_extend_timeout。

             如果不需要的话,那么temp1自增1, 然后和temp2比较,要是小于temp2跳回comp_check_timeout, 要是大于等于,那就跳回最开始的地方wait_for_comp_out_start重新初始化,重新检测。 


comp_read_wrong_not_startup:
	jb	Flags0.DEMAG_DETECTED, comp_read_wrong_extend_timeout

	inc	Temp1					; Increment number of OK readings required
	clr	C
	mov	A, Temp1
	subb	A, Temp2					
	jc	($+4)
	ajmp	wait_for_comp_out_start		; If above initial requirement - go back and restart

	ajmp	comp_check_timeout			; Otherwise - take another reading

有消磁检测时延长超时,默认是high_rpm 的,会把timer3设置一个1ms左右的超时, 然后设置T3_PENDING, 跳加wait_for_comp_out_start,

 不是high_rpm看comp_read_wrong_low_rpm。


comp_read_wrong_extend_timeout:
	clr	Flags0.DEMAG_DETECTED		; Clear demag detected flag
	anl	EIE1, #7Fh				; Disable timer 3 interrupts
	mov	TMR3CN0, #00h				; Timer 3 disabled and interrupt flag cleared
	jnb	Flags1.HIGH_RPM, comp_read_wrong_low_rpm	; Branch if not high rpm

	mov	TMR3L, #00h				; Set timeout to ~1ms
IF MCU_48MHZ >= 1
	mov	TMR3H, #0F0h
ELSE
	mov	TMR3H, #0F8h
ENDIF

comp_read_wrong_timeout_set:
	mov	TMR3CN0, #04h				; Timer 3 enabled and interrupt flag cleared
	setb	Flags0.T3_PENDING
	orl	EIE1, #80h				; Enable timer 3 interrupts
	ljmp	wait_for_comp_out_start		; If comparator output is not correct - go back and restart

如果没有设置high_rpm,那么来到comread_wrong_low_rpm,Temp7先默认为0xff, 这里把Comm_Period4x_H乘以4, 看看有没有借位,没有的话,就把temp7=Comm_Period4x_H, 

然后以temp7去设置timer3的超时。


comp_read_wrong_low_rpm:
	mov	A, Comm_Period4x_H			; Set timeout to ~4x comm period 4x value
	mov	Temp7, #0FFh				; Default to long
IF MCU_48MHZ >= 1
	clr	C
	rlc	A
	jc	comp_read_wrong_load_timeout

ENDIF
	clr	C
	rlc	A
	jc	comp_read_wrong_load_timeout

	clr	C
	rlc	A
	jc	comp_read_wrong_load_timeout

	mov	Temp7, A

comp_read_wrong_load_timeout:
	clr	C
	clr	A
	subb	A, Temp7
	mov	TMR3L, #0
	mov	TMR3H, A
	ajmp	comp_read_wrong_timeout_set

如果成功读到正确的值,那么来到comp_read_ok这里,

    如果Startup_Cnt<1或者Flags0.DEMAG_DETECTED还是1,那么跳回wait_for_comp_out_start。 否则Temp1减1如果不是零,跳回comp_check_timeout。 

上面条都不满的话,清空    clr    Flags0.COMP_TIMED_OUT, 然后去到setup_comm_wait。


comp_read_ok:
	clr	C
	mov	A, Startup_Cnt				; Force a timeout for the first commutation
	subb	A, #1
	jnc	($+4)
	ajmp	wait_for_comp_out_start

	jnb	Flags0.DEMAG_DETECTED, ($+5)	; Do not accept correct comparator output if it is demag
	ajmp	wait_for_comp_out_start

	djnz	Temp1, comp_read_ok_jmp		; Decrement readings counter - repeat comparator reading if not zero
	ajmp	($+4)

comp_read_ok_jmp:
	ajmp	comp_check_timeout

	clr	Flags0.COMP_TIMED_OUT

setup_comm_wait 这里会初始化等待,主要是操作timer3, 先是把Wt_Comm_Start设置为当前的超时,然后再把Wt_Adv_Start设为auto reload的值, 作为下次的等待时间。 Timer3的中断主要是清空
​Flags0.T3_PENDING这个值。


;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Setup commutation timing routine
;
; No assumptions
;
; Sets up and starts wait from commutation to zero cross
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
setup_comm_wait:
	clr	IE_EA
	anl	EIE1, #7Fh		; Disable timer 3 interrupts
	mov	TMR3CN0, #00h		; Timer 3 disabled and interrupt flag cleared
	mov	TMR3L, Wt_Comm_Start_L
	mov	TMR3H, Wt_Comm_Start_H
	mov	TMR3CN0, #04h		; Timer 3 enabled and interrupt flag cleared
	; Setup next wait time
	mov	TMR3RLL, Wt_Adv_Start_L
	mov	TMR3RLH, Wt_Adv_Start_H
	setb	Flags0.T3_PENDING
	orl	EIE1, #80h		; Enable timer 3 interrupts
	setb	IE_EA			; Enable interrupts again

接下来,检测这个比较器的行为是不是预期的。这个如果启动和初始化阶段不做,直接跳到eval_comp_exit。

其它阶段,如果COMP_TIMED_OUT为零,或者Flags1.DIR_CHANGE_BRAKE,或者Flags0.DEMAG_DETECTED也跳到eval_comp_exit。如果不满足,则跳到run_to_wait_for_power_on_fail,是一些失败的检查,最坏会跳回init_no_signal。


;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Evaluate comparator integrity
;
; No assumptions
;
; Checks comparator signal behaviour versus expected behaviour
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
evaluate_comparator_integrity:
	mov	A, Flags1
	anl	A, #((1 SHL STARTUP_PHASE)+(1 SHL INITIAL_RUN_PHASE))
	jz	eval_comp_check_timeout

	jb	Flags1.INITIAL_RUN_PHASE, ($+5)	; Do not increment beyond startup phase
	inc	Startup_Cnt					; Increment counter
	jmp	eval_comp_exit

eval_comp_check_timeout:
	jnb	Flags0.COMP_TIMED_OUT, eval_comp_exit	; Has timeout elapsed?
	jb	Flags1.DIR_CHANGE_BRAKE, eval_comp_exit	; Do not exit run mode if it is braking
	jb	Flags0.DEMAG_DETECTED, eval_comp_exit	; Do not exit run mode if it is a demag situation
	dec	SP								; Routine exit without "ret" command
	dec	SP
	ljmp	run_to_wait_for_power_on_fail			; Yes - exit run mode

eval_comp_exit:
	ret

run_to_wait_for_power_on_fail,这里首先Stall_Cnt会自增1,要是油门是零,那么跳去run_to_wait_for_power_on,

run_to_wait_for_power_on会重置Stall_Cnt为0。

不是的话,就跳去run_to_wait_for_power_on_stall_done, 就会关闭所有中断, 等100ms,然后调用switch_power_off。

要是设置了brake_on_stop那么,会把a,b和c的comFet 打开。

跟着检查Stall_Cnt, 要是它小于4那么跳回wait_for_power_on, 否则跳到init_no_signal。


run_to_wait_for_power_on_fail:	
	inc	Stall_Cnt					; Increment stall count
	mov	A, New_Rcp				; Check if RCP is zero, then it is a normal stop			
	jz	run_to_wait_for_power_on
	ajmp	run_to_wait_for_power_on_stall_done

run_to_wait_for_power_on:	
	mov	Stall_Cnt, #0

run_to_wait_for_power_on_stall_done:
	clr	IE_EA
	call switch_power_off
	mov	Flags0, #0				; Clear flags0
	mov	Flags1, #0				; Clear flags1
IF MCU_48MHZ >= 1
	Set_MCU_Clk_24MHz
ENDIF
	setb	IE_EA
	call	wait100ms					; Wait for pwm to be stopped
	call switch_power_off
	mov	Temp1, #Pgm_Brake_On_Stop
	mov	A, @Temp1
	jz	run_to_wait_for_power_on_brake_done

	AcomFET_on
	BcomFET_on
	CcomFET_on

run_to_wait_for_power_on_brake_done:
	clr	C
	mov	A, Stall_Cnt
	subb	A, #4
	jc	jmp_wait_for_power_on
	jmp	init_no_signal

jmp_wait_for_power_on:
	jmp	wait_for_power_on			; Go back to wait for power on

​
run_to_wait_for_power_on_fail是由前面的wait_for_comp_out_low和wait_for_comp_out_high的异常读取触发的。

这一篇主要是计算和等待bemf信号,还是很复杂的逻辑。

上面的流程使用分主要情况讨论,总结一下:
1. 对于非启动阶段(STARTUP_PHASE和INITIAL_RUN_PHASE都是零),低速(HIGH_RPM==0))
   1.1 一开始就会设置DEMAG_DETECTED,
   1.2 初始化读取的次数和最大读取次数,最大20次,当前次数为limit(Comm_Period4x_H/2, 1, 20)
   1.3 判断timer3有没有超时,要是超时跳到超时处理流程1.7
   1.4 尝试去读一次比较值,读对就直接返回,读错继续走
   1.5 如DEMAG_DETECTED为1,清空DEMAG_DETECTED为零, 然后Comm_Period4x_H来设置timer3,延长超时,然后跳回1.2. 因为DEMAG_DETECTED变零就不会再来了,第二次就走 1.6 了。
   1.6 如读取的次数大于小于最大读取次数  跳回1.3, 否则跳回1.2 
   1.7 超时了,设置COMP_TIMED_OUT,然后跳到setup_comm_wait
   1.8 要是DIR_CHANGE_BRAKE和DEMAG_DETECTED都没有设置的话,就会进入失败处理流程,跳到run_to_wait_for_power_on_fail。 即要是读错一次比较值后超时,不是DIR_CHANGE_BRAKE,就一定会进入失败流程了。


 2. 对于非启动阶段(STARTUP_PHASE和INITIAL_RUN_PHASE都是零),高速(HIGH_RPM==1))
    和低速相比,流程是一样的 不同点: 
   2.1 初始化读取的次数和最大读取次数不同,这时两个都是1, 
   2.2 第一次设置timer3延长超时固定是0xf000, 即1 ms左右。
   
 3. 对于启动阶段(STARTUP_PHASE和INITIAL_RUN_PHASE有一个是1)
    3.1 一开始就会设置DEMAG_DETECTED
    3.2 将DEMAG_DETECTED置为零, 初始化读取的次数和最大读取次数,最大20次,当前次数为limit(Comm_Period4x_H/2, 1, 20)
    3.3 判断timer3有没有超时,要是超时跳到超时处理流程3.6
    3.4 尝试去读一次比较值,读对就直接返回,读错继续走
    3.5 自增读取次数,要是大于20, 就不会自增, 跟着跳回3.3
    3.6 超时了, 判断Startup_Zc_Timeout_Cntd减1后是不是零,要是零的话,设置COMP_TIMED_OUT,然后跳到setup_comm_wait, 否则调用setup_zc_scan_timeout
    3.7 setup_zc_scan_timeout 返回后跳到 3.4 

下图来自网络,仅参考,有出入:

高速状态下需要正确读取1次,低速状态下需要读取前4次换相时间高字节一半的次数,最大20次,特别的,在启动阶段,需要正确读取27次

未完待续。。。

(11)(2.2) BLHeli32 and BLHeli_S ESCs(一) Ardupilot官网关于《Peripheral Hardware》的翻译 —《(2.2) BLHeli32 and BLHeli_S ESCs》。 阅读详情

相关推荐

无人机电调 BLHeli_S 方案源码深度解析(基于 C_H_30 固件)——深入学习理解PID三环控制,DSHOT总线应用

本文深入解析了BLHeli_S电调固件的技术架构与控制原理,重点介绍了基于ATmega328P主控芯片的三环PID控制系统实现。硬件方面详细分析了主控资源分配(32KB Flash/2KB SRAM)、功率驱动电路(三相半桥拓扑)和电流采样设计;软件层面阐述了Dshot数字通信协议实现(支持150-1200kbps)及三环PID控制算法(电流环、速度环、堵转环)的协同工作机制。文章还提供了参数调优指南,比较了多旋翼与固定翼应用的配置差异,并展望了Dshot2400、模型预测控制等未来发展方向。该方案通过动态

bother3000的博客 2172

开源BLHELI-S 代码详细解读(二)

DIR_CHANGE_BRAKE没有设置的话,就跳到run_to_wait_for_power_on,不是的话,清除DIR_CHANGE_BRAKE的标志,清除PGM_DIR_REV标志,要是RCP_DIR_REV有设置,那么设置PGM_DIR_REV,然后把当前的阶段设置回INITIAL_RUN_PHASE。run_to_wait_for_power_on_fail是由前面的wait_for_comp_out_low和wait_for_comp_out_high的异常读取触发的。

aerror的专栏 3090

什么是电调固件和电调通讯协议-BLheli电调与Dshot通讯学习笔记

DShot(Digital Shot,是数字协议)(相对于oneshot,oneshot125,oneshot42,multishot等模拟协议)。它最初是由Felix在KISS提出的,后来被Betaflight和BLHeli_S开发团队采用。是用来和刷有BLheli固件的电调通讯的协。BLHeli:最古老的两种开源电调固件之一,由于其广泛的功能和友好的用户界面而变得流行。...

outbreakrmb的博客 1万+

开源BLHELI-S 代码详细解读(一)

Pgm_Beacon_Delay会和Power_On_Wait_Cnt_H相减,要是借位,就会开始beep f4, beep一次Power_On_Wait_Cnt_H会减1,就是Power_On_Wait_Cnt_L是255的时候beep一次了。如果有信号(Rcp_Timeout_Cntd不是零),同时New_Rcp(油门)不是零跳到 wait_for_power_on_nonzero, 再检查一次Rcp_Timeout_Cntd是不是零,要是不是零,那就跳到init_start。这个代码在inc里。

aerror的专栏 4229

从零到一:开源BLHeli_S电调DIY全流程实战解析

本文详细解析了开源BLHeli_S无刷电调的DIY全流程,从核心器件选型(EFM8BB21、FD6288)到硬件设计、固件烧录与参数配置,再到测试验证与性能优化。通过实战案例,帮助读者掌握无刷电调开发的关键技术,适用于无人机和航模爱好者提升DIY能力。

weixin_29191669的博客 644

BLHeli最新源码

BLHeli的最新源码,可以烧录到EFM8BB21/20系列的单片机中,飞穿越记

BLHeli 固件开源项目教程

BLHeli 固件开源项目教程 项目地址:https://gitcode.com/gh_mirrors/bl/BLHeli 1. 项目介绍 BLHeli 是一个专为无刷电子速度控制器(ESC)固件开发的开源项目。它最初由 Assembly 编写,支持 Atmel 和 Silabs 的 8 位微控制器。后来发展出 BLHeli_S 和 BLHeli_32 两个版本,分别面向 8 位和 32 位处理器...

gitblog_01155的博客 1565

BLHeli源码

BLHeli源码,对电调有兴趣的可以研究下。

【亲测免费】 推荐开源项目:KEIL编译BLHeli_S正确方式指南

推荐开源项目:KEIL编译BLHeli_S正确方式指南 【下载地址】KEIL编译BLHeli_S正确方式指南 KEIL编译BLHeli_S正确方式指南本仓库提供了一个名为“KEIL编译BLHeli_S正确方式.pdf”的资源文件,该文件详细介绍了如何使用KEIL MDK编译著名的开源电调BLHeli_S工程 ...

gitblog_06688的博客 1076

开源电调程序SimonK,BLHeli

开源电调程序TGY,由Simon Kirby发布的,兼容部分BLHeli程序,安装atmetal studio7可以直接打开编译了,配合下载的硬件电路

飞书多维表格+影刀RPA:我如何用3个指令搞定每周的销售数据自动汇总(附完整配置截图)

本文详细介绍了如何利用飞书多维表格和影刀RPA实现销售数据的自动化汇总,通过三个核心指令(建立链接、列出记录、更新记录)简化繁琐的手工操作。文章包含完整的配置截图和实战指南,帮助用户快速部署自动化流程,提升工作效率。

weixin_29273849的博客 284

BLHeli开源电调固件:从新手到专家的完整应用指南

BLHeli是一款专为无刷电机电调设计的开源固件,支持多种飞行器应用场景。作为航模爱好者和无人机开发者的首选方案,它提供了灵活的配置选项和稳定的性能表现。 ## 🚀 三大固件版本:选择适合你的技术路线 BLHeli生态包含三个主要版本,每个版本针对不同的硬件平台和应用需求: ### 1. 经典8位MCU版本(BLHeli) - **支持平台**:Atmel和Silabs 8位微控制器 -

gitblog_01174的博客 915

微信PC端Multi文件夹数据库解析:语音消息导出与转换实战指南

本文提供了一份详细的微信PC端语音消息导出与转换实战指南。通过解析Multi文件夹中的MediaMSG数据库,指导用户定位、解密数据库,并利用Python脚本精准提取SILK格式语音,最终转换为通用的WAV或MP3格式,实现个人语音数据的本地备份与处理。

garlic的博客 582

BLHeli_S与BLHeli_32终极对比:无刷电调固件深度解析

在无人机和遥控模型领域,BLHeli固件已经成为无刷电调(ESC)的事实标准。作为开源固件的先驱,BLHeli项目经历了从8位到32位架构的演进,形成了BLHeli_S和BLHeli_32两大主流分支。本文将从技术架构、性能表现、适用场景到实战配置进行全面对比,帮助技术爱好者和进阶用户做出明智选择。 ## 架构演进:从8位精简到32位全能 BLHeli固件的演进反映了嵌入式系统发展的典型路径。

gitblog_00252的博客 374

VulnHub靶机渗透实战(详细思路讲解)

使用kali中的namp工具扫描开放端口,这时kali会用一个端口号向目标主机的65535个端口发送TCP连接建立请求,回应了ack=1,syn=q的端口就是开放端口号,这里可以看到21,22,80,3306号端口是开放的。可以看到这里得到了很多哈希,带*号的是禁用的或者是空密码,将三个不带星号的密码复制下来,创建一个shell.txt文档,将三个密码复制进去。这里看到我们是没有成功进入这个网页的,应该是目录的问题,我们将目录修改一下,但是没有显示出来,可能是编码问题,再回到我们找到的源码。

weixin_65891791的博客 2545

海康读码器上位机开发避坑指南:IDMVS客户端之外,如何用C# SDK搞定扫码、数据比对与实时控制?

本文详细介绍了如何利用海康读码器的C# SDK进行二次开发,实现从基础扫码到复杂工业控制的全流程解决方案。内容涵盖SDK架构解析、多设备管理系统构建、业务逻辑与设备控制实现,以及系统集成与性能优化等关键环节,为工业自动化领域的开发者提供实用指南。

weixin_30642561的博客 550

开源BLHELI-S 代码详细解读(四)

如Set_Pwm_C, P1SKIP = 37h(00110111b), 即P1.3 P1.6和 P1.7会给外设使用, 根据优先度,PCA0的CEX0会使用P1.3(CpwmFET)输出 CEX1 会在P1.6(CcomFET)输出。这个 wait_before_zc_scan,其实比较简单,就是从把timer3的超时设置为Comm_Period4x_L和Comm_Period4x_H, 只有在STARTUP_PHASE和 SHL INITIAL_RUN_PHASE阶段才会设置。

aerror的专栏 1262

用Python turtle库 绘制皮卡丘

Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。 turtle基础知识参考: https://gitchat.blog.youkuaiyun.com/article/details/90696190 https://blog.csdn.ne...

qq_36295856的博客 2万+

全面解析BLHeli开源电调固件:从8位到32位的无刷电机控制演进

BLHeli是一款广泛应用于无人机和航模领域的开源无刷电调固件,为多旋翼飞行器提供高效精准的电机控制解决方案。这款固件经历了从最初的8位Atmel平台到高性能32位ARM架构的完整演进,成为业界最受欢迎的电调控制软件之一。 ## 🔧 架构演进:三款固件的技术路线图 BLHeli项目包含了三个主要版本,每个版本都针对不同的硬件平台和应用场景进行了优化: **BLHeli(经典版)** - 基

gitblog_00164的博客 266

ADS2020实战:村田电感.s2p与.mod文件导入全流程对比(附仿真结果差异分析)

本文详细对比了ADS2020中村田电感的.s2p与.mod文件导入流程及仿真结果差异,重点分析了两种模型在低频段和高频段的精度表现。通过实际案例展示.s2p文件在高频仿真中的优势,以及.mod文件在低频和非线性特性模拟中的准确性,为射频电路设计提供模型选择策略和混合仿真技巧。

weixin_29289821的博客 519

30、电力生产系统中的效率测量

本文探讨了如何使用数据包络分析(DEA)模型来评估电力生产系统的效率。文章详细介绍了电力生产系统的三个主要环节——发电、输电和配电,并通过多种DEA模型,如输入导向模型、输出导向模型以及基于松弛的SBM模型,展示了效率测量的方法和技术。同时,结合实际案例分析,说明了DEA模型在识别效率低下环节及提出改进建议方面的应用价值。

rgv2345678的博客 116

Bluejay电调固件介绍和烧录Bluejay电调固件到BLHeli_S电调的方法

本篇文章介绍了Bluejay电调固件介绍和烧录Bluejay电调固件到BLHeli_S电调的方法。Bluejay是一种数字电调固件,用于控制多旋翼无人机中的无刷电机。该电调固件基于BLHeli_S电调固件revision 16.7版本进行改进的。Bluejay的目标是成为BLHeli_S的开源继任者,通过Busy Bee MCU对电调进行了一些改进。DShot是唯一受支持的电调协议。支持用户配置电调启动音乐。Bluejay固件可以烧录到与BLHeli_S兼容的电调。

在后厂村路努力科研搬砖的无人机控制方向练习生一名~ 8807

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

BLHeli电调固件终极指南:5个秘诀解锁无刷电机极致性能

BLHeli是一款开源的**无刷电调固件**,专为航模爱好者和无人机开发者设计。这个强大的固件项目支持多种硬件平台,包括Atmel和SiLabs微控制器,能够显著提升电调性能和响应速度。无论你是竞速飞手还是航拍爱好者,掌握**BLHeli电调调参**技巧都能让你的飞行器性能达到新高度!🚀 ## 项目概述与核心价值 BLHeli项目提供了三个主要版本:经典的BLHeli、改进的BLHeli_S

gitblog_00264的博客 434

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

BLHeli电调固件配置终极指南:3分钟快速入门教程

BLHeli是一款开源的无刷电调固件项目,为航模爱好者提供了强大的电机控制解决方案。无论你是新手还是经验丰富的飞手,掌握**BLHeli电调固件配置**技巧都能显著提升飞行器的性能和响应速度。这个项目包含了BLHeli、BLHeli_S和BLHeli_32三个主要版本,支持多种硬件平台,为你的飞行器提供专业级的电机控制能力。 ## 为什么选择BLHeli电调固件? BLHeli固件相比原厂固件

gitblog_00622的博客 642

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深度解析:BLHeli无刷电调固件架构对比与性能优化指南

BLHeli作为开源无刷电调固件的领先解决方案,为无人机和RC模型提供了高性能的电机控制技术。本文将从技术架构、性能参数和应用场景三个维度,深入对比BLHeli、BLHeli_S和BLHeli_32三款固件的核心差异,帮助开发者选择最适合的无刷电调固件方案。 ## 技术背景与项目概述 BLHeli项目始于2011年,最初为Atmel和Silabs 8位MCU开发,采用汇编语言编写,支持直升机主

gitblog_00433的博客 615
上一篇: 开源BLHELI-S 代码详细解读(二)
下一篇: 开源BLHELI-S 代码详细解读(四)
aerror
博客等级 码龄23年 392粉丝 193原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值