不好意思最近比较忙每有机会看代码。
我刚才去看了一下代码,你看到是什么版本啊?
我的是10.1的版本,你有时间的话麻烦看看,能讲讲换相的策略吗? 浪子怀海 发表于 2016-7-7 22:17
我的是10.1的版本,你有时间的话麻烦看看,能讲讲换相的策略吗?
有什么特别原因你一定要研究 10.1 的版本吗?
一般来说,如果那段代码后来被改写了,那一般是
有原因的。有可能那段实现不是很好,有更好做法
或者有bug 这些。
换相策勒这些在最新的版本也有提供。
基本上就是看比较器,从时间做些统计,有需要的话
提前关电(demag)
楼主有blheli用的编译器吗,用的人太少了,找了好久没有和谐版。新版的blheli程序太大了,keil编译不了,老版本是可以的 giantwjt88 发表于 2016-7-8 10:59
楼主有blheli用的编译器吗,用的人太少了,找了好久没有和谐版。新版的blheli程序太大了,keil编译不了,老 ...
Raisonance 的编译器是免费下载的,你激活一个 hobby license
就可以了。官方的编译允许 hobby license 编译到 4K 还是 8K.
反正 BLHeli 够用了。就是需要激活一下。完全正版渠道就可以。
没有必要和谐啊。
本帖最后由 846528111 于 2016-7-13 11:44 编辑
楼主,请教下根据Pgm_Comm_Timing 的奇偶来进入store_times_decrease,store_times_increase的目的是什么? giantwjt88 发表于 2016-7-8 10:59
楼主有blheli用的编译器吗,用的人太少了,找了好久没有和谐版。新版的blheli程序太大了,keil编译不了,老 ...
是用不了,好像是定义的宏字符超过了keil的限制,需要改一些宏名 helislayer 发表于 2016-7-8 09:36
有什么特别原因你一定要研究 10.1 的版本吗?
一般来说,如果那段代码后来被改写了,那一般是
有原因的。 ...
我是因为keil编译不了高版本的,才看10.1的,我主要是想看懂他的焕相策略,都是用比较检测过零点,问题是在什么时候检测,检测几次(比较器中断触发不行)?后来因为一些事落下blheli了。 浪子怀海 发表于 2016-7-17 08:59
我是因为keil编译不了高版本的,才看10.1的,我主要是想看懂他的焕相策略,都是用比较检测过零点,问题是 ...
哦,那我觉得最省事就是下载一个官方的 Ride 编译器,
这个下载链接文档里有提到的。
然后注册一个hobby license 就好了。hobby license 是
免费的。这个我觉得是最好的解决方法,
BLHeli 本来就不是设计给 Keil 来编译的。
楼主。请教下,在不懂汇编的前提下。如何修改部分汇编程序使之适用于一款atmega8的电调呢
官网没有与之对应的版本
io口有一定的区别··
看国外有教程,试验了下没成功。烧mos compass180 发表于 2016-7-20 16:28
楼主。请教下,在不懂汇编的前提下。如何修改部分汇编程序使之适用于一款atmega8的电调呢
官网没有与之对 ...
额,这个不懂汇编还是不建议乱来。学点汇编吧。
要不用 C 的版本。
关于烧 MOS。可以用限制电流的电源,一但超过电流
就断电那种,一般修手机用类似的电源。
你先把每个 FET 的控制搞清除,用万用表量联通性。
把 H 桥对应的控制画出来再做控制。不然乱点 FET
很容易短路烧 FET 的。
请问电调输入信号的波形是怎样的?如果把遥控接收器某通道的信号接电调输入马达会转吗? SamuelSiu 发表于 2016-8-8 17:06
请问电调输入信号的波形是怎样的?如果把遥控接收器某通道的信号接电调输入马达会转吗? ...
输入就是 PPM 或者 PWM。
应该会传,接收器输出是 PPM。
缺省可能要先检测一下油门信号。
可以配置 BLHeli 不做检测那步。
粗略看了一下,感觉很有参考价值,打个标记 楼主,t0_int_pwm_off_damped,当PWM输出低电平时会有两个P管导通,这样不会导致电机卡顿吗,这样做的目的是什么? 846528111 发表于 2016-8-18 20:23
楼主,t0_int_pwm_off_damped,当PWM输出低电平时会有两个P管导通,这样不会导致电机卡顿吗,这样做的目的是 ...
会啊,damped 就是减速啊。
减速有两个策略,一个是被动一个是主动的。
简单被动减速就是导通然后让电流消耗调能量。 helislayer 发表于 2016-8-19 03:15
会啊,damped 就是减速啊。
减速有两个策略,一个是被动一个是主动的。
简单被动减速就是导通然后让电流 ...
减速时可以增加快速响应,这个我知道。我看代码中发现,但是如果正常运行,当PWM输出为低时而两个上臂导通,这样不会损失效率吗? movsp , #c0h ;楼主,堆栈怎么能放在特殊功能寄存区?这样不会出错吗? 846528111 发表于 2016-8-24 21:22
movsp , #c0h ;楼主,堆栈怎么能放在特殊功能寄存区?这样不会出错吗?
知道了,如果给堆栈赋初值在80-ff ,编译器会自动将堆栈放到RAM区。
楼主,里面的速度是怎么计算出来的,; Set high rpm bit (if above 156k erpm),自己算出来的话不一样? helislayer 发表于 2016-5-28 23:33
另外有人问BLHeli那里可以下到源码,这个一直就没有变过。
最新的 BLHeli永远在 github 里面 bitdump 下 ...
看到“顶级高手据说可以从 fet 烧糊的味道辨别出是N fet 还是 P fet 烧了” 忽然想起来 “HIFI高手能听出来用的水电站发出来的电还是火电站发出来的电”233333 Anteater 发表于 2016-8-31 02:04
看到“顶级高手据说可以从 fet 烧糊的味道辨别出是N fet 还是 P fet 烧了” 忽然想起来 “HIFI高手能听 ...
对,有水声的是水力发出来的。 helislayer 发表于 2016-8-31 02:10
对,有水声的是水力发出来的。
还会有核味的说 我不懂汇编,因此自然也没有看过BLHeli, 但是之前移植过MK电调的程序,由于是第一次控制无刷,因此印象很深
看到你的描述觉得这两个电调软件的控制方式基本一样,上臂常开,下臂pwm,然后启动方式也有些类似,都是开环带动,然后找过零点闭环
之前看到BLHeli的启动成功率很高,但是我之前的MK软件的经历是启动成功率只有45%。 主要表现就是有的时候能带动然后闭环,有的时候直接卡在原地震动,自然就没有闭环。
我实际上没有想明白在差不多的启动方式下,为什么BLHeli的成功率大很多? 可能是藏在什么细节中没有注意到。
此外我在移植MK程序的时候,启动的PWM大约是10%,如果启动失败,就是电机没转的情况下很多次,MOSFET并不会烧毁,我还特意做过30% PWM情况下,加大负载让电机在0.7秒以内停转,程序是有时间检测出堵转,然后进入启动模式。 按道理BLHeli应该处理的更好才是。 Blheli 新的S ,穿越机市场销售火爆。 楼主,启动部分代码不太理解,启动时会初始化一个总的时间0xf000 ,启动分成两个阶段,但是看不懂这两个阶段的换向时间是怎样控制的能解释一下吗? Anteater 发表于 2016-8-31 02:27
我不懂汇编,因此自然也没有看过BLHeli, 但是之前移植过MK电调的程序,由于是第一次控制无刷,因此印象很 ...
我说一下 BLHeli 启动的部分吧。
首先,就算 BLHeli 作者去新适应一个 ESC, 也是要调的。
你看到的 BLHeli 是人家调过的结果,当然比没有调过的要顺利。
很可能改的就是一些参数。
BLHeli 启动有磁饱和检测。这个是比较影响换相时间的一个
因素。启动时候电流比较大,大的马达比较容易有磁饱和问题。
846528111 发表于 2016-9-18 15:55
楼主,启动部分代码不太理解,启动时会初始化一个总的时间0xf000 ,启动分成两个阶段,但是看不懂这两个阶 ...
你能指到代码里面你说的是那个变量和哪一段代码看不懂?
helislayer 发表于 2016-9-19 11:41
你能指到代码里面你说的是那个变量和哪一段代码看不懂?
就是启动的原理和启动过程中换向时间的设置那部分不太理解,能具体说一下启动吗? 846528111 发表于 2016-9-19 15:57
就是启动的原理和启动过程中换向时间的设置那部分不太理解,能具体说一下启动吗? ...
你先看看 前面的讨论,例如 34 楼等等。
这个还是需要学会自己消化源代码来问出有意义的问题来。
总体上就是 6 组电流连接的方式,先开环盲转 6 组,然后
进入过零检测。
本帖最后由 huangyiting1990 于 2016-9-20 16:12 编辑
楼主你好,我对BLHeli AVR版本的几个地方想请教你一下:
///////////////////////////////////////////////////////
前面一堆初始化略过
//////////////////////////////////////////////////////
init_no_signal:
; Disable interrupts explicitly
cli
; Check if input signal is high for more than 30ms
ldi Temp1, 250
input_high_check_1:
ldi Temp2, 250
input_high_check_2:
Read_Rcp_Int XL ; Read RCP input
sbrs XL, Rcp_In ; Is it high?
rjmp bootloader_done ; No - run normally(疑问 : 如果输入信号没有超过30Ms脉宽,怎么就直接跳到Bootloader完成了,不应该还要检测BLHeli Bootloader/SK bootloader吗?)
dec Temp2
brne input_high_check_2
dec Temp1
brne input_high_check_1
; Jump to bootloader if present
/////////////////////////////////////////////////////
这里是检测到超过30Ms脉宽
疑问 : 检测到30Ms脉宽后不应该是TX编程吗?怎么好像在验证"秘钥"(看着像是AVR Bootloader)
/////////////////////////////////////////////////////
ldi ZL, 0x00
.IF THIRDBOOTSTART == 0xe00
ldi ZH, 0x1C
.ENDIF
.IF THIRDBOOTSTART == 0x1e00
ldi ZH, 0x3C
.ENDIF
lpm XH, Z+ ; Check for first bytes of SimonK bootloader
cpi XH, 0xE4
brne SK_bootloader_done
lpm XH, Z+
cpi XH, 0xE0
brne SK_bootloader_done
lpm XH, Z+
cpi XH, 0xFF
brne SK_bootloader_done
rjmp jmp_to_bootloader
SK_bootloader_done:
ldi ZL, 0x00
inc ZH ; BLHeli bootloader is smaller
inc ZH
lpm XH, Z+ ; Check for first bytes of BLHeli bootloader
cpi XH, 0xF8
brne bootloader_done
lpm XH, Z+
cpi XH, 0x94
brne bootloader_done
lpm XH, Z+
cpi XH, 0xAA
brne bootloader_done
jmp_to_bootloader:
clr ZL
lsr ZH
ijmp ; Jump to bootloader
///////////////////////////////////////////////////////////////////
后面这个IJMP应该跳到哪去了?
Z :要么指向0x0E00,要么就是0x0F00
我查了一下 好像是 AVR Bootloader的FlashSection 不明白
还有前面判断的那些 字符是什么意思?
///////////////////////////////////////////////////////////////////
疑问的地方我都用红色的字符标出来了,先谢谢了。 这个你需要知道的是, SimonK bootloader 是一个独立出来的 bootloader,和 BLHeli 带的
bootloader不是同一个。
建议读一下这个文章。
https://oscarliang.com/blheli-simonk-bootloader-esc/
因为有两个 bootloader ,都是使用 1 wire protocol 的。
所以需要一些东西来来区分进入那个。目前看来
是根据 flash 里面的一些变量。
小于 30ms, 不进入 bootloader。
因为 ppm 信号就是小于 30ms 的。
然后大于 30ms 进入bootloader。
进入那个bootloader 是貌似是看一些配置
变量的。
那个 ijmp 是间接跳转。
http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_IJMP.html
就是跳到 Z 寄存器。Z 是从 bootloader 的某个变量里面装进来的。
helislayer 发表于 2016-9-21 11:05
这个你需要知道的是, SimonK bootloader 是一个独立出来的 bootloader,和 BLHeli 带的
bootloader不是同 ...
在源码里面没有找到Bootloader相关代码。这个功能是怎么实现的呢? clr Flags2.PGM_PWMOFF_DAMPED ; Set damped flag if fully damped or damped light is set
mov A, #((1 SHL PGM_PWMOFF_DAMPED_FULL)+(1 SHL PGM_PWMOFF_DAMPED_LIGHT))
anl A, Flags2 ; Check if any damped mode is set
jz ($+4)
setb Flags2.PGM_PWMOFF_DAMPED
clr Flags2.CURR_PWMOFF_DAMPED ; Set non damped status as start
jz ($+4)
setb Flags2.CURR_PWMOFF_DAMPED ; Set non damped status as start if damped
setb Flags2.CURR_PWMOFF_COMP_ABLE ; Set comparator usable status
jz ($+4)
clr Flags2.CURR_PWMOFF_COMP_ABLE ; Set comparator not usable status if damped
clr Flags3.PGM_DIR_REV
mov Temp1, #Pgm_Direction_Rev
mov A, @Temp1
jnb ACC.1, ($+5)
setb Flags3.PGM_DIR_REV
clr Flags3.PGM_RCP_PWM_POL
mov Temp1, #Pgm_Input_Pol
mov A, @Temp1
jnb ACC.1, ($+5)
setb Flags3.PGM_RCP_PWM_POL
clr C
mov A, Temp8
subb A, #2
jz decode_pwm_freq_low
mov CKCON, #01h ; Timer0 set for clk/4 (22kHz pwm)
setb Flags2.PGM_PWM_HIGH_FREQ
jmp decode_pwm_freq_end
decode_pwm_freq_low:
mov CKCON, #00h ; Timer0 set for clk/12 (8kHz pwm)
clr Flags2.PGM_PWM_HIGH_FREQ
decode_pwm_freq_end:
ret
请教下楼主,这个jz是一直跟A比较吧?为零就只执行JZ后第二条指令,不为零就后面两条都执行?为什么要多次判断不一次判断分两支呢 xiangyuan_122 发表于 2016-9-22 11:36
clr Flags2.PGM_PWMOFF_DAMPED ; Set damped flag if fully damped or damped light is set
mov A, #((1...
这个 8051 汇编自己看看手册就好了吧。
SETB addr 是设置一个 bit。
JZ LABEL 是如果 A==0 就跳转 LABEL。
helislayer 发表于 2016-9-22 13:30
这个 8051 汇编自己看看手册就好了吧。
SETB addr 是设置一个 bit。
我想问的不是这个指令,我的意思是jz在这里出现了3次,但是中间没有改变ACC的值,那是不是可以只判断一次,后面的条件分开,他这里判断3次的原因是什么?jz后面的($+4)就是如果ACC为0跳过下一条指令,否则两条都执行 xiangyuan_122 发表于 2016-9-22 15:00
我想问的不是这个指令,我的意思是jz在这里出现了3次,但是中间没有改变ACC的值,那是不是可以只判断一次 ...
这个地方的确可以构造一个 if block 来只判断 A 一次。
但是那样就需要跳过的指令不是 4, 而是一个更大的数。
这个 jz 多次的写法好处我猜是,如果如果引入这些
变量是一次一次添加上去的,那么可以一次注释整个
变量块。
我也没有看出有什么其他好处。 helislayer 发表于 2016-9-23 00:59
这个地方的确可以构造一个 if block 来只判断 A 一次。
但是那样就需要跳过的指令不是 4, 而是一个更大 ...
你好,请教你个问题。(BLHeli for AVR最新版本 mode = Main)
(1)comm5comm6 :
cli ; Disable all interrupts
sts Comm_Phase, XH
CpFET_off ; Turn off pfet
BpFET_on ; Turn on pfet
sbrs Flags0, PWM_ON ; Is pwm on?
rjmp comm56_nfet_done ; No - branch
AnFET_on ; Pwm on - turn on nfet
这个PWM_ON标志位(应该是指示PWM输出) 应该在哪个地方被置1(也就是说电调是从什么时候开始输出PWM)的?
(2) Requested_Pwm / Current_Pwm / Current_Pwm_Limited / Current_Pwm_Lim_Dith
这几个变量什么用途,它们之间什么关系?
谢谢! huangyiting1990 发表于 2016-9-23 15:28
你好,请教你个问题。(BLHeli for AVR最新版本 mode = Main)
(1)comm5comm6 :
cli ; Disable al ...
PWM_ON 这个你在源程序search 一下就应该找到什么地方设置的了。
几个不同的 PWM。因为BLHeli 有个恒定转速的东西。用了些 pid
控制。所以就有目标。Current 就是现在。limited 是对 pid 做了些幅度
限制。抖动那个是为了减少周期性引入的噪音。 DP3A 还是 XP3A 的电调 我做过几个程序汇编看不懂电调 倒是很好用 楼主做个STM8的玩玩吧 论坛好几个开源的后面都烂尾太监了好像是 没看到代码什么的 ayumi8 发表于 2016-9-24 12:58
DP3A 还是 XP3A 的电调 我做过几个程序汇编看不懂电调 倒是很好用 楼主做个STM8的玩玩吧 论坛好几 ...
自己做一个没有很多兴趣用 STM8.
其实 ST 有 FOC 方案的,但是不是开源的。
如果要搞的话就直接用 ST 的 FOC 硬件的开发板
来做好了,不用 ST 库自己搞好了。至少保证硬件
部分没有问题。
也有想法买一套st的飞控套餐 wangyj173 发表于 2016-10-4 13:47
也有想法买一套st的飞控套餐
飞控套餐? 你说的是 ST 的 FOC 马达驱动实验板吧。 helislayer 发表于 2016-10-5 02:28
飞控套餐? 你说的是 ST 的 FOC 马达驱动实验板吧。
是的,好像2XX软妹币一套,不过听海绵宝宝说高速FOC还是和普通FOC有些不同。。。。。。。 wangyj173 发表于 2016-10-5 09:11
是的,好像2XX软妹币一套,不过听海绵宝宝说高速FOC还是和普通FOC有些不同。。。。。。。 ...
ST 那个 如果用 F3 的话估计 MAX FOC 是 30K 左右。
马达转一圈是要换好几次相,和马达的设计有关。
所以推算这个 ST FOC 应该不是特别高速的,几千转
应该是可以的。
先跑起来再考虑高速的情况吧。 ST 那个方案的好处
是用 ST 库是可以直接跑起来的,至少可以有对比。
确认硬件方面没有问题。软件就看自己本事了。
学习BLHeLi wangyj173 发表于 2016-10-5 09:11
是的,好像2XX软妹币一套,不过听海绵宝宝说高速FOC还是和普通FOC有些不同。。。。。。。 ...
另外我看那个 ST 给出的参考数据,F4 的 MAX FOC 就比 F3 的高不少。
所以我估计其中一个重要限制因数是 MCU 的计算速度。因为 FOC 计算
量相对方波多很多。当然其他因素也会有,例如 AD 采样的速度等等,
计算量会是高速的主要限制条件。
楼主 damped light模式是同步整流,当PWM_OFF时两个上臂短接,这样做不会导致力矩力矩的剧烈波动吗?我现在用 damped light模式电机转起来效果很差。 846528111 发表于 2016-11-23 16:20
楼主 damped light模式是同步整流,当PWM_OFF时两个上臂短接,这样做不会导致力矩力矩的剧烈波动吗?我现在 ...
力矩应该是会剧烈波动。但是希望是切换很快速这样没有影响到平滑性。
至少理论上是希望这样。你的具体情况我就不知道了。 谢谢楼主{:smile:},现在电调发热有点大,但是不会烧MOS管,电机高低速都正常,楼主知道一般电调发热有哪些原因吗? 本帖最后由 yuntian 于 2016-11-27 09:03 编辑
已搞懂,Comm_Period4x 的单位是0.5us BLHeli学习 846528111 发表于 2016-11-24 14:19
谢谢楼主,现在电调发热有点大,但是不会烧MOS管,电机高低速都正常,楼主知道一般电调发热有哪些 ...
MOS 不够好,内阻大。
还有一个软件原因是存在很短时间的上下mos 一起通的短路。
但是足够短不会烧掉 MOS,就会表现为发热。 这个程序怎么找不到中断向量表在哪里呢,只有一个t0_int,找不到中断从哪里跳转过来的? zhkchina 发表于 2016-12-14 20:35
这个程序怎么找不到中断向量表在哪里呢,只有一个t0_int,找不到中断从哪里跳转过来的? ...
这个你全部文件搜索一下就应该可以找到拉。 helislayer 发表于 2016-12-17 02:59
这个你全部文件搜索一下就应该可以找到拉。
搜过啦,没有的。会不会在编译器带的文件里呢 zhkchina 发表于 2016-12-19 16:03
搜过啦,没有的。会不会在编译器带的文件里呢
你逗我啊,一搜一大把啊。
$ grep t0_int *
Turnigy_Plush_Nfet_25A.inc: jmp t0_int
Turnigy_Plush_Nfet_30A.inc: jmp t0_int
XP_12A.inc: jmp t0_int
XP_18A.inc: jmp t0_int
XP_25A.inc: jmp t0_int
XP_35A_SW.inc: jmp t0_int
XP_3A.inc: jmp t0_int
XP_7A_Fast.inc: jmp t0_int
XP_7A.inc: jmp t0_int
$
就是在 .inc 文件的 macro 里面。
MACRO Interrupt_Table_Definition
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 0Bh ; Timer0 interrupt
jmp t0_int
CSEG AT 2Bh ; Timer2 interrupt
jmp t2_int
CSEG AT 5Bh ; PCA interrupt
jmp pca_int
CSEG AT 73h ; Timer3 interrupt
jmp t3_int
ENDM
helislayer 发表于 2016-12-20 16:48
你逗我啊,一搜一大把啊。
$ grep t0_int *
找到啦,谢谢{:smile:} 高手啊!
谢谢分享这么多。
我是直接写入成品电调里用。好xx的,螃蟹的都改了。是好用。 本帖最后由 逗倪豌儿 于 2016-12-24 14:24 编辑
helislayer 发表于 2016-6-2 23:27
赞,终于有人肯看看程序来问问题而不是泛泛的给我个详细
解释如何工作的吧。
楼主您好,最近看BLHeli_s 16.5版本的源码,发现程序中过零时间 分配和你说的有点出入:
|Wt_ZC_Tout_Start_x(22.5)(这段时间扫描过零和检查过零超时或者错误处理)|过零Ok|Wt_Comm_Start_x(15)(这段时间执行是否关闭管子消磁续流等等)|换向|Wt_Adv_Start_x(15)(根据上次计算时间分配,计算新的时间分配|Wt_Zc_Scan_Start_x(7.5)(计算下次的各个等待时间)|
还请楼主验证下,多谢!
最近看BLHeli_S 16.5版本程序过程发现:在1->2 换向,2->3换向程序中,代码如下:
comm1comm2:
Set_RPM_Out
jb Flags3.PGM_DIR_REV, comm12_rev
clr IE_EA ; Disable all interrupts
BcomFET_off ; Turn off comfet
AcomFET_on ; Turn on comfet
Set_Pwm_C ; To reapply power after a demag cut
setb IE_EA
Set_Comp_Phase_B ; Set comparator phase
jmp comm_exit
; Comm phase 2 to comm phase 3
comm2comm3:
Clear_RPM_Out
jb Flags3.PGM_DIR_REV, comm23_rev
clr IE_EA ; Disable all interrupts
CpwmFET_off ; Turn off pwmfet
Set_Pwm_B
AcomFET_on ; To reapply power after a demag cut
setb IE_EA
Set_Comp_Phase_C ; Set comparator phase
ljmp comm_exit
其对应的底层驱动中的BcomFET_off 、AcomFET_on 、Set_Pwm_C、CpwmFET_off、Set_Pwm_B、AcomFET_on,代码如下:
BcomFET_off MACRO
clr P1.BcomFET
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET ; 为什么把C管给1 ,因为下面一句话是把对应上桥pwm管给设置成PWM调制,
mov P1SKIP, #2Fh;
ELSE
mov P1SKIP, #0Fh
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #3Bh
ELSE
mov P1SKIP, #33h
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
问题来了:如果FETON_DELAY =0,即用户没有配置死区时间,那么为什么在Set_Pwm_C 打开中,要把 setb P1.CcomFET ,按照他的执行过程,画出来的导通图不对呀,请教! 楼主您好,最近在看BLHEli_s 16.5版本的程序,发现在油门校准过程每次都要调用 find_throttle_gains 这个入口函数,看他注释是说为了双向模式下用的,算出来这个增益是用来干吗的,没太看懂,请楼主帮忙多谢万能的主!代码如下:,
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Find throttle gains
;
; No assumptions
;
; Finds throttle gains for both directions in bidirectional mode
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
find_throttle_gains:
; Check if full range is chosen
jnb Flags2.RCP_FULL_RANGE, find_throttle_gains_normal
mov Temp3, #0 ; Min throttle
mov Temp4, #0
mov Temp5, #255 ; Max throttle
mov Temp6, #0
mov Temp7, #0 ; Deadband
call find_throttle_gain
mov Throttle_Gain_M, Temp4
mov Throttle_Gain, Temp3
ret
find_throttle_gains_normal:
; Check if bidirectional operation
jnb Flags3.PGM_BIDIR, find_throttle_gains_bidir_done
mov Temp1, #Pgm_Min_Throttle
mov A, @Temp1
mov Temp3, A
mov Temp4, #0
mov Temp1, #Pgm_Center_Throttle
mov A, @Temp1
mov Temp5, A
mov Temp6, #0
clr C
mov A, Temp3 ; Scale gains in bidirectional
rlc A
mov Temp3, A
mov A, Temp4
rlc A
mov Temp4, A
clr C
mov A, Temp5
rlc A
mov Temp5, A
mov A, Temp6
rlc A
mov Temp6, A
mov Temp7, #10 ; Compensate for deadband in bidirectional
call find_throttle_gain
mov Throttle_Gain_BD_Rev_M, Temp4
mov Throttle_Gain_BD_Rev, Temp3
find_throttle_gains_bidir_done:
mov Temp1, #Pgm_Min_Throttle
jnb Flags3.PGM_BIDIR, ($+5)
mov Temp1, #Pgm_Center_Throttle
mov A, @Temp1
mov Temp3, A
mov Temp4, #0
mov Temp1, #Pgm_Max_Throttle
mov A, @Temp1
mov Temp5, A
mov Temp6, #0
mov Temp7, #0 ; No deadband
jnb Flags3.PGM_BIDIR, find_throttle_gain_fwd
clr C
mov A, Temp3 ; Scale gains in bidirectional
rlc A
mov Temp3, A
mov A, Temp4
rlc A
mov Temp4, A
clr C
mov A, Temp5
rlc A
mov Temp5, A
mov A, Temp6
rlc A
mov Temp6, A
mov Temp7, #10 ; Compensate for deadband in bidirectional
find_throttle_gain_fwd:
call find_throttle_gain
mov Throttle_Gain_M, Temp4
mov Throttle_Gain, Temp3
ret
ret
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Find throttle gain
;
; The difference between max and min throttle must be more than 140us (a Pgm_xxx_Throttle difference of 35)
; Temp4/3 holds min throttle, Temp6/5 holds max throttle, Temp7 holds deadband, Temp4/Temp3 gives resulting gain
;
; Finds throttle gain from throttle calibration values
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
find_throttle_gain:
; Subtract deadband from max
clr C
mov A, Temp5
subb A, Temp7
mov Temp5, A
mov A, Temp6
subb A, #0
mov Temp6, A
; Calculate difference
clr C
mov A, Temp5
subb A, Temp3
mov Temp5, A
mov A, Temp6
subb A, Temp4
mov Temp6, A
; Check that difference is minimum 35
clr C
mov A, Temp5
subb A, #35
mov A, Temp6
subb A, #0
jnc ($+6)
mov Temp5, #35
mov Temp6, #0
; Check that difference is maximum 511
clr C
mov A, Temp5
subb A, #255
mov A, Temp6
subb A, #1
jc ($+6)
mov Temp5, #255
mov Temp6, #1
; Find gain
mov Temp4, #0FFh
find_throttle_gain_loop:
inc Temp4
mov Temp3, #0
test_throttle_gain:
inc Temp3
mov A, Temp3
jnz test_throttle_gain_mult
clr C
mov A, Temp5 ; Set multiplier x2 and range /2
rlc A
mov Temp5, A
mov A, Temp6
rlc A
mov Temp6, A
ajmp find_throttle_gain_loop
test_throttle_gain_mult:
mov A, Temp5 ; A has difference, B has gain
mov B, Temp3
mul AB
mov Temp7, B
mov A, Temp6
mov B, Temp3
mul AB
add A, Temp7
subb A, #124
jc test_throttle_gain
mov A, Temp3
cpl A
jz find_throttle_gain_loop
ret
helislayer 发表于 2016-5-28 23:33
另外有人问BLHeli那里可以下到源码,这个一直就没有变过。
最新的 BLHeli永远在 github 里面 bitdump 下 ...
楼主您好,我想问下,在BLHeli-S代码中 如果死区不为0且用48M时钟,那么初始化PWM是10位pwm,中间对齐方式,频率是23.437K 。我想问的是 如果是普通油门 1000- 2000ms,那么假如输入的是1500ms ,那么他是怎么转换为 pwm的占空比 写入到寄存器的,关键是这个转换过程;看代码都是在外部中断0中 int0_int_startup_boosted代码段中完成的,能否解析下源码思路,多谢! 最新的blheli_s 中Wt_ZC_Tout_Start_L这个变量没有给其他地方赋值看上去没有用啊 这个很值得学习,围观中 zzipeng 发表于 2016-5-31 20:00
商业电调感觉除了FOC之外都没这个电流保护功能。。而且比较蛋疼的是,那种好赢铂金40A电调的MOS管感觉都 ...
直接找内阻一样大小大,不过也不是很安全,会存在差异,MOS的批次不一样内阻也会有一点点偏差 helislayer 发表于 2016-6-18 09:41
这段代码调用的函数都有名字,
我重复一次也没有意思。你看了这段
代码有什么具体理解上的问题?
lz,我估计他是想问,为何这个地方这些函数调用了多次?我也是疑惑 zzipeng 发表于 2016-5-31 14:44
感觉这些电调无论BLHELI或者非BLHELI,只要电机一堵转就很容易烧MOS管了。。硬件保护不行 ...
那是你感觉,BLDC驱动不像有刷电调,一堵转程序立马就知道,马上做出保护。 xyhh4 发表于 2017-10-17 20:32
lz,我估计他是想问,为何这个地方这些函数调用了多次?我也是疑惑
大兄弟你的blheli源码看的怎么样了?我有个问题想请教一下,源码如下:
wait_for_comm:
; Update demag metric
mov Temp1, #0
jnb Flags0.DEMAG_ENABLED, ($+8); If demag disabled - branch
jnb Flags0.DEMAG_DETECTED, ($+5)
mov Temp1, #1
mov A, Demag_Detected_Metric ; Sliding average of 8, 256 when demag and 0 when not. Limited to minimum 120
mov B, #7
mul AB ; Multiply by 7
mov Temp2, A
mov A, B ; Add new value for current demag status
add A, Temp1
mov B, A
mov A, Temp2
mov C, B.0 ; Divide by 8
rrc A
mov C, B.1
rrc A
mov C, B.2
rrc A
mov Demag_Detected_Metric, A
clr C
subb A, #120 ; Limit to minimum 120
jnc ($+5)
mov Demag_Detected_Metric, #120
clr C
mov A, Demag_Detected_Metric ; Check demag metric
subb A, Demag_Pwr_Off_Thresh
jc wait_for_comm_wait ; Cut power if many consecutive demags. This will help retain sync during hard accelerations
setb Flags0.DEMAG_CUT_POWER ; Set demag power cut flag
IF NFETON_DELAY NE 0
All_nFETs_off
ELSE
En_Off ; For EN/PWM style drivers
ENDIF
wait_for_comm_wait:
jnb Flags0.T3_PENDING, ($+5)
ajmp wait_for_comm_wait
; Setup next wait time
mov TMR3RLL, Wt_Zc_Scan_Start_L
mov TMR3RLH, Wt_Zc_Scan_Start_H
setb Flags0.T3_PENDING
orl EIE1, #80h ; Enable timer3 interrupts
ret
这里计算Demag_Detected_Metric这个值,看源码定义的这个变量似乎是用于计量demag的事件频率,此处与Demag_Pwr_Off_Thresh进行比较,相等则跳转,否则关闭输出之后再跳转,这里这么写是什么原因呢? 很长的 慢慢学 BLHeli_32闭源了? 感谢楼主,我看了一半论坛,先mark下。刚看完了MK的源代码,接下来要好好啃啃BLHeli了 bajie 发表于 2021-2-26 18:11
感谢楼主,我看了一半论坛,先mark下。刚看完了MK的源代码,接下来要好好啃啃BLHeli了 ...
(引用自171楼)
两年后的我也开始看这个了
页:
1
[2]