amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
12
返回列表 发新帖
楼主: helislayer

BLHeli 杂谈和研究讨论

  [复制链接]
发表于 2016-7-7 22:17:07 | 显示全部楼层
helislayer 发表于 2016-7-5 21:34
不好意思最近比较忙每有机会看代码。

我刚才去看了一下代码,你看到是什么版本啊?

我的是10.1的版本,你有时间的话麻烦看看,能讲讲换相的策略吗?
 楼主| 发表于 2016-7-8 09:36:52 | 显示全部楼层
浪子怀海 发表于 2016-7-7 22:17
我的是10.1的版本,你有时间的话麻烦看看,能讲讲换相的策略吗?

有什么特别原因你一定要研究 10.1 的版本吗?
一般来说,如果那段代码后来被改写了,那一般是
有原因的。有可能那段实现不是很好,有更好做法
或者有bug 这些。

换相策勒这些在最新的版本也有提供。
基本上就是看比较器,从时间做些统计,有需要的话
提前关电(demag)
发表于 2016-7-8 10:59:38 来自手机 | 显示全部楼层
楼主有blheli用的编译器吗,用的人太少了,找了好久没有和谐版。新版的blheli程序太大了,keil编译不了,老版本是可以的
 楼主| 发表于 2016-7-8 11:13:07 | 显示全部楼层
giantwjt88 发表于 2016-7-8 10:59
楼主有blheli用的编译器吗,用的人太少了,找了好久没有和谐版。新版的blheli程序太大了,keil编译不了,老 ...

Raisonance 的编译器是免费下载的,你激活一个 hobby license
就可以了。官方的编译允许 hobby license 编译到 4K 还是 8K.
反正 BLHeli 够用了。就是需要激活一下。完全正版渠道就可以。
没有必要和谐啊。
发表于 2016-7-13 11:42:58 | 显示全部楼层
本帖最后由 846528111 于 2016-7-13 11:44 编辑

楼主,请教下根据Pgm_Comm_Timing 的奇偶来进入store_times_decrease,store_times_increase的目的是什么?
发表于 2016-7-17 08:55:56 | 显示全部楼层
giantwjt88 发表于 2016-7-8 10:59
楼主有blheli用的编译器吗,用的人太少了,找了好久没有和谐版。新版的blheli程序太大了,keil编译不了,老 ...

是用不了,好像是定义的宏字符超过了keil的限制,需要改一些宏名
发表于 2016-7-17 08:59:35 | 显示全部楼层
helislayer 发表于 2016-7-8 09:36
有什么特别原因你一定要研究 10.1 的版本吗?
一般来说,如果那段代码后来被改写了,那一般是
有原因的。 ...

我是因为keil编译不了高版本的,才看10.1的,我主要是想看懂他的焕相策略,都是用比较检测过零点,问题是在什么时候检测,检测几次(比较器中断触发不行)?后来因为一些事落下blheli了。
 楼主| 发表于 2016-7-17 09:06:47 | 显示全部楼层
浪子怀海 发表于 2016-7-17 08:59
我是因为keil编译不了高版本的,才看10.1的,我主要是想看懂他的焕相策略,都是用比较检测过零点,问题是 ...

哦,那我觉得最省事就是下载一个官方的 Ride 编译器,
这个下载链接文档里有提到的。
然后注册一个hobby license 就好了。hobby license 是
免费的。这个我觉得是最好的解决方法,
BLHeli 本来就不是设计给 Keil 来编译的。
发表于 2016-7-20 16:28:29 | 显示全部楼层
楼主。请教下,在不懂汇编的前提下。如何修改部分汇编程序使之适用于一款atmega8的电调呢

官网没有与之对应的版本

io口有一定的区别··

看国外有教程,试验了下没成功。烧mos
 楼主| 发表于 2016-7-21 20:19:25 | 显示全部楼层
compass180 发表于 2016-7-20 16:28
楼主。请教下,在不懂汇编的前提下。如何修改部分汇编程序使之适用于一款atmega8的电调呢

官网没有与之对 ...

额,这个不懂汇编还是不建议乱来。学点汇编吧。
要不用 C 的版本。

关于烧 MOS。可以用限制电流的电源,一但超过电流
就断电那种,一般修手机用类似的电源。

你先把每个 FET 的控制搞清除,用万用表量联通性。
把 H 桥对应的控制画出来再做控制。不然乱点 FET
很容易短路烧 FET 的。
发表于 2016-8-8 17:06:25 | 显示全部楼层
请问电调输入信号的波形是怎样的?如果把遥控接收器某通道的信号接电调输入马达会转吗?
 楼主| 发表于 2016-8-8 17:56:10 | 显示全部楼层
SamuelSiu 发表于 2016-8-8 17:06
请问电调输入信号的波形是怎样的?如果把遥控接收器某通道的信号接电调输入马达会转吗? ...

输入就是 PPM 或者 PWM。
应该会传,接收器输出是 PPM。
缺省可能要先检测一下油门信号。
可以配置 BLHeli 不做检测那步。
发表于 2016-8-17 00:00:41 | 显示全部楼层
粗略看了一下,感觉很有参考价值,打个标记
发表于 2016-8-18 20:23:54 | 显示全部楼层
楼主,t0_int_pwm_off_damped,当PWM输出低电平时会有两个P管导通,这样不会导致电机卡顿吗,这样做的目的是什么?
 楼主| 发表于 2016-8-19 03:15:42 | 显示全部楼层
846528111 发表于 2016-8-18 20:23
楼主,t0_int_pwm_off_damped,当PWM输出低电平时会有两个P管导通,这样不会导致电机卡顿吗,这样做的目的是 ...

会啊,damped 就是减速啊。
减速有两个策略,一个是被动一个是主动的。
简单被动减速就是导通然后让电流消耗调能量。
发表于 2016-8-19 15:01:56 | 显示全部楼层
helislayer 发表于 2016-8-19 03:15
会啊,damped 就是减速啊。
减速有两个策略,一个是被动一个是主动的。
简单被动减速就是导通然后让电流 ...

减速时可以增加快速响应,这个我知道。我看代码中发现,但是如果正常运行,当PWM输出为低时而两个上臂导通,这样不会损失效率吗?
发表于 2016-8-24 21:22:16 | 显示全部楼层
mov  sp , #c0h     ;楼主,堆栈怎么能放在特殊功能寄存区?这样不会出错吗?
发表于 2016-8-25 11:14:19 | 显示全部楼层
846528111 发表于 2016-8-24 21:22
mov  sp , #c0h     ;楼主,堆栈怎么能放在特殊功能寄存区?这样不会出错吗?

知道了,如果给堆栈赋初值在80-ff ,编译器会自动将堆栈放到RAM区。
发表于 2016-8-27 09:07:36 | 显示全部楼层
楼主,里面的速度是怎么计算出来的,; Set high rpm bit (if above 156k erpm),自己算出来的话不一样?
发表于 2016-8-31 02:04:46 | 显示全部楼层
helislayer 发表于 2016-5-28 23:33
另外有人问BLHeli那里可以下到源码,这个一直就没有变过。
最新的 BLHeli永远在 github 里面 bitdump 下 ...

看到  “顶级高手据说可以从 fet 烧糊的味道辨别出是N fet 还是 P fet 烧了” 忽然想起来 “HIFI高手能听出来用的水电站发出来的电还是火电站发出来的电”  233333
 楼主| 发表于 2016-8-31 02:10:17 | 显示全部楼层
Anteater 发表于 2016-8-31 02:04
看到  “顶级高手据说可以从 fet 烧糊的味道辨别出是N fet 还是 P fet 烧了” 忽然想起来 “HIFI高手能听 ...

对,有水声的是水力发出来的。
发表于 2016-8-31 02:18:23 | 显示全部楼层
helislayer 发表于 2016-8-31 02:10
对,有水声的是水力发出来的。

还会有核味的说
发表于 2016-8-31 02:27:05 | 显示全部楼层
我不懂汇编,因此自然也没有看过BLHeli, 但是之前移植过MK电调的程序,由于是第一次控制无刷,因此印象很深

看到你的描述觉得这两个电调软件的控制方式基本一样,上臂常开,下臂pwm,然后启动方式也有些类似,都是开环带动,然后找过零点闭环

之前看到BLHeli的启动成功率很高,但是我之前的MK软件的经历是启动成功率只有45%。 主要表现就是有的时候能带动然后闭环,有的时候直接卡在原地震动,自然就没有闭环。

我实际上没有想明白在差不多的启动方式下,为什么BLHeli的成功率大很多? 可能是藏在什么细节中没有注意到。

此外我在移植MK程序的时候,启动的PWM大约是10%,如果启动失败,就是电机没转的情况下很多次,MOSFET并不会烧毁,我还特意做过30% PWM情况下,加大负载让电机在0.7秒以内停转,程序是有时间检测出堵转,然后进入启动模式。 按道理BLHeli应该处理的更好才是。
发表于 2016-9-1 11:16:49 | 显示全部楼层
Blheli 新的S ,穿越机市场销售火爆。
发表于 2016-9-18 15:55:19 | 显示全部楼层
楼主,启动部分代码不太理解,启动时会初始化一个总的时间0xf000 ,启动分成两个阶段,但是看不懂这两个阶段的换向时间是怎样控制的能解释一下吗?
 楼主| 发表于 2016-9-19 11:40:36 | 显示全部楼层
Anteater 发表于 2016-8-31 02:27
我不懂汇编,因此自然也没有看过BLHeli, 但是之前移植过MK电调的程序,由于是第一次控制无刷,因此印象很 ...

我说一下 BLHeli 启动的部分吧。
首先,就算 BLHeli 作者去新适应一个 ESC, 也是要调的。
你看到的 BLHeli 是人家调过的结果,当然比没有调过的要顺利。
很可能改的就是一些参数。
BLHeli 启动有磁饱和检测。这个是比较影响换相时间的一个
因素。启动时候电流比较大,大的马达比较容易有磁饱和问题。
 楼主| 发表于 2016-9-19 11:41:26 | 显示全部楼层
846528111 发表于 2016-9-18 15:55
楼主,启动部分代码不太理解,启动时会初始化一个总的时间0xf000 ,启动分成两个阶段,但是看不懂这两个阶 ...

你能指到代码里面你说的是那个变量和哪一段代码看不懂?
发表于 2016-9-19 15:57:39 | 显示全部楼层
helislayer 发表于 2016-9-19 11:41
你能指到代码里面你说的是那个变量和哪一段代码看不懂?

就是启动的原理和启动过程中换向时间的设置那部分不太理解,能具体说一下启动吗?
 楼主| 发表于 2016-9-20 01:57:01 | 显示全部楼层
846528111 发表于 2016-9-19 15:57
就是启动的原理和启动过程中换向时间的设置那部分不太理解,能具体说一下启动吗? ...

你先看看 前面的讨论,例如 34 楼等等。
这个还是需要学会自己消化源代码来问出有意义的问题来。
总体上就是 6 组电流连接的方式,先开环盲转 6 组,然后
进入过零检测。

发表于 2016-9-20 16:11:43 | 显示全部楼层
本帖最后由 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 不明白
  还有前面判断的那些 字符是什么意思?

///////////////////////////////////////////////////////////////////

疑问的地方我都用红色的字符标出来了,先谢谢了。
 楼主| 发表于 2016-9-21 11:05:58 | 显示全部楼层
这个你需要知道的是, 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/avra ... embler.wb_IJMP.html

就是跳到 Z 寄存器。Z 是从 bootloader 的某个变量里面装进来的。
发表于 2016-9-21 15:06:01 | 显示全部楼层
helislayer 发表于 2016-9-21 11:05
这个你需要知道的是, SimonK bootloader 是一个独立出来的 bootloader,和 BLHeli 带的
bootloader不是同 ...

在源码里面没有找到Bootloader相关代码。这个功能是怎么实现的呢?
发表于 2016-9-22 11:36:24 | 显示全部楼层
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后第二条指令,不为零就后面两条都执行?为什么要多次判断不一次判断分两支呢
 楼主| 发表于 2016-9-22 13:30:38 | 显示全部楼层
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。

发表于 2016-9-22 15:00:20 | 显示全部楼层
helislayer 发表于 2016-9-22 13:30
这个 8051 汇编自己看看手册就好了吧。

SETB addr 是设置一个 bit。

我想问的不是这个指令,我的意思是jz在这里出现了3次,但是中间没有改变ACC的值,那是不是可以只判断一次,后面的条件分开,他这里判断3次的原因是什么?jz后面的($+4)就是如果ACC为0跳过下一条指令,否则两条都执行
 楼主| 发表于 2016-9-23 00:59:21 | 显示全部楼层
xiangyuan_122 发表于 2016-9-22 15:00
我想问的不是这个指令,我的意思是jz在这里出现了3次,但是中间没有改变ACC的值,那是不是可以只判断一次 ...

这个地方的确可以构造一个 if block 来只判断 A 一次。
但是那样就需要跳过的指令不是 4, 而是一个更大的数。
这个 jz 多次的写法好处我猜是,如果如果引入这些
变量是一次一次添加上去的,那么可以一次注释整个
变量块。

我也没有看出有什么其他好处。
发表于 2016-9-23 15:28:19 | 显示全部楼层
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
     这几个变量什么用途,它们之间什么关系?
     谢谢!
 楼主| 发表于 2016-9-24 10:54:05 | 显示全部楼层
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 做了些幅度
限制。抖动那个是为了减少周期性引入的噪音。
发表于 2016-9-24 12:58:00 | 显示全部楼层
DP3A 还是 XP3A 的电调 我做过几个  程序汇编看不懂  电调 倒是很好用   楼主做个STM8的玩玩吧   论坛好几个开源的后面都烂尾太监了好像是 没看到代码什么的
 楼主| 发表于 2016-9-24 13:45:17 | 显示全部楼层
ayumi8 发表于 2016-9-24 12:58
DP3A 还是 XP3A 的电调 我做过几个  程序汇编看不懂  电调 倒是很好用   楼主做个STM8的玩玩吧   论坛好几 ...

自己做一个没有很多兴趣用 STM8.
其实 ST 有 FOC 方案的,但是不是开源的。
如果要搞的话就直接用 ST 的 FOC 硬件的开发板
来做好了,不用 ST 库自己搞好了。至少保证硬件
部分没有问题。
发表于 2016-10-4 13:47:34 | 显示全部楼层
也有想法买一套st的飞控套餐
 楼主| 发表于 2016-10-5 02:28:08 | 显示全部楼层
wangyj173 发表于 2016-10-4 13:47
也有想法买一套st的飞控套餐

飞控套餐? 你说的是 ST 的 FOC 马达驱动实验板吧。
发表于 2016-10-5 09:11:20 | 显示全部楼层
helislayer 发表于 2016-10-5 02:28
飞控套餐? 你说的是 ST 的 FOC 马达驱动实验板吧。


是的,好像2XX软妹币一套,不过听海绵宝宝说高速FOC还是和普通FOC有些不同。。。。。。。
 楼主| 发表于 2016-10-5 11:53:52 | 显示全部楼层
wangyj173 发表于 2016-10-5 09:11
是的,好像2XX软妹币一套,不过听海绵宝宝说高速FOC还是和普通FOC有些不同。。。。。。。 ...

ST 那个 如果用 F3 的话估计 MAX FOC 是 30K 左右。
马达转一圈是要换好几次相,和马达的设计有关。
所以推算这个 ST FOC 应该不是特别高速的,几千转
应该是可以的。

先跑起来再考虑高速的情况吧。 ST 那个方案的好处
是用 ST 库是可以直接跑起来的,至少可以有对比。
确认硬件方面没有问题。软件就看自己本事了。
发表于 2016-10-5 21:26:08 | 显示全部楼层
学习BLHeLi
 楼主| 发表于 2016-10-7 01:33:29 | 显示全部楼层
wangyj173 发表于 2016-10-5 09:11
是的,好像2XX软妹币一套,不过听海绵宝宝说高速FOC还是和普通FOC有些不同。。。。。。。 ...

另外我看那个 ST 给出的参考数据,F4 的 MAX FOC 就比 F3 的高不少。
所以我估计其中一个重要限制因数是 MCU 的计算速度。因为 FOC 计算
量相对方波多很多。当然其他因素也会有,例如 AD 采样的速度等等,
计算量会是高速的主要限制条件。
发表于 2016-11-23 16:20:19 | 显示全部楼层
楼主 damped light模式是同步整流,当PWM_OFF时两个上臂短接,这样做不会导致力矩力矩的剧烈波动吗?我现在用 damped light模式电机转起来效果很差。
 楼主| 发表于 2016-11-24 11:42:24 | 显示全部楼层
846528111 发表于 2016-11-23 16:20
楼主 damped light模式是同步整流,当PWM_OFF时两个上臂短接,这样做不会导致力矩力矩的剧烈波动吗?我现在 ...

力矩应该是会剧烈波动。但是希望是切换很快速这样没有影响到平滑性。
至少理论上是希望这样。你的具体情况我就不知道了。
发表于 2016-11-24 14:19:50 | 显示全部楼层
谢谢楼主,现在电调发热有点大,但是不会烧MOS管,电机高低速都正常,楼主知道一般电调发热有哪些原因吗?
发表于 2016-11-26 21:33:42 | 显示全部楼层
本帖最后由 yuntian 于 2016-11-27 09:03 编辑

已搞懂,Comm_Period4x 的单位是0.5us
发表于 2016-11-27 09:56:21 | 显示全部楼层
BLHeli学习  
 楼主| 发表于 2016-11-27 22:49:49 | 显示全部楼层
846528111 发表于 2016-11-24 14:19
谢谢楼主,现在电调发热有点大,但是不会烧MOS管,电机高低速都正常,楼主知道一般电调发热有哪些 ...

MOS 不够好,内阻大。
还有一个软件原因是存在很短时间的上下mos 一起通的短路。
但是足够短不会烧掉 MOS,就会表现为发热。
发表于 2016-12-14 20:35:58 | 显示全部楼层
这个程序怎么找不到中断向量表在哪里呢,只有一个t0_int,找不到中断从哪里跳转过来的?
 楼主| 发表于 2016-12-17 02:59:13 | 显示全部楼层
zhkchina 发表于 2016-12-14 20:35
这个程序怎么找不到中断向量表在哪里呢,只有一个t0_int,找不到中断从哪里跳转过来的? ...

这个你全部文件搜索一下就应该可以找到拉。
发表于 2016-12-19 16:03:32 | 显示全部楼层
helislayer 发表于 2016-12-17 02:59
这个你全部文件搜索一下就应该可以找到拉。

搜过啦,没有的。会不会在编译器带的文件里呢
 楼主| 发表于 2016-12-20 16:48:52 | 显示全部楼层
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

发表于 2016-12-21 08:59:24 | 显示全部楼层
helislayer 发表于 2016-12-20 16:48
你逗我啊,一搜一大把啊。

$ grep t0_int *

找到啦,谢谢
发表于 2016-12-23 16:06:28 | 显示全部楼层
高手啊!
谢谢分享这么多。
我是直接写入成品电调里用。好xx的,螃蟹的都改了。是好用。
发表于 2016-12-24 09:45:24 | 显示全部楼层
本帖最后由 逗倪豌儿 于 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)(计算下次的各个等待时间)|

还请楼主验证下,多谢!
发表于 2016-12-24 10:13:11 | 显示全部楼层
最近看BLHeli_S 16.5版本程序过程发现:在1->2 换向,2->3换向程序中,代码如下:
  1. comm1comm2:       
  2.         Set_RPM_Out
  3.         jb        Flags3.PGM_DIR_REV, comm12_rev

  4.         clr         IE_EA                                ; Disable all interrupts
  5.         BcomFET_off                                 ; Turn off comfet
  6.         AcomFET_on                                ; Turn on comfet
  7.         Set_Pwm_C                                        ; To reapply power after a demag cut
  8.         setb        IE_EA
  9.         Set_Comp_Phase_B                         ; Set comparator phase
  10.         jmp        comm_exit

  11. ; Comm phase 2 to comm phase 3
  12. comm2comm3:       
  13.         Clear_RPM_Out
  14.         jb        Flags3.PGM_DIR_REV, comm23_rev

  15.         clr         IE_EA                                ; Disable all interrupts
  16.         CpwmFET_off                                ; Turn off pwmfet
  17.         Set_Pwm_B
  18.         AcomFET_on                                ; To reapply power after a demag cut
  19.         setb        IE_EA
  20.         Set_Comp_Phase_C                         ; Set comparator phase
  21.         ljmp        comm_exit
复制代码


其对应的底层驱动中的BcomFET_off 、AcomFET_on        、Set_Pwm_C、CpwmFET_off、Set_Pwm_B、AcomFET_on,代码如下:

  1. BcomFET_off MACRO
  2.         clr        P1.BcomFET
  3. ENDM
  4. AcomFET_on MACRO
  5. IF FETON_DELAY == 0
  6.         clr        P1.ApwmFET
  7. ENDIF
  8.         setb        P1.AcomFET
  9. ENDM
  10. Set_Pwm_C MACRO
  11. IF FETON_DELAY == 0
  12.         setb        P1.CcomFET   ; 为什么把C管给1 ,因为下面一句话是把对应上桥pwm管给设置成PWM调制,
  13.         mov        P1SKIP, #2Fh;  
  14. ELSE
  15.         mov        P1SKIP, #0Fh
  16. ENDIF
  17. ENDM
  18. CpwmFET_off MACRO
  19. IF FETON_DELAY != 0
  20.         clr        P1.CpwmFET
  21. ELSE
  22.         clr        P1.CcomFET
  23. ENDIF
  24. ENDM
  25. Set_Pwm_B MACRO
  26. IF FETON_DELAY == 0
  27.         setb        P1.BcomFET
  28.         mov        P1SKIP, #3Bh
  29. ELSE
  30.         mov        P1SKIP, #33h
  31. ENDIF
  32. ENDM
  33. AcomFET_on MACRO
  34. IF FETON_DELAY == 0
  35.         clr        P1.ApwmFET
  36. ENDIF
  37.         setb        P1.AcomFET
  38. ENDM
复制代码


问题来了:如果FETON_DELAY =0,即用户没有配置死区时间,那么为什么在Set_Pwm_C 打开中,要把 setb        P1.CcomFET ,按照他的执行过程,画出来的导通图不对呀,请教!
发表于 2016-12-24 10:22:52 | 显示全部楼层
楼主您好,最近在看BLHEli_s 16.5版本的程序,发现在油门校准过程每次都要调用 find_throttle_gains 这个入口函数,看他注释是说为了双向模式下用的,算出来这个增益是用来干吗的,没太看懂,请楼主帮忙多谢万能的主!代码如下:,

  1. ;**** **** **** **** **** **** **** **** **** **** **** **** ****
  2. ;
  3. ; Find throttle gains
  4. ;
  5. ; No assumptions
  6. ;
  7. ; Finds throttle gains for both directions in bidirectional mode
  8. ;
  9. ;**** **** **** **** **** **** **** **** **** **** **** **** ****
  10. find_throttle_gains:
  11.         ; Check if full range is chosen
  12.         jnb        Flags2.RCP_FULL_RANGE, find_throttle_gains_normal

  13.         mov        Temp3, #0                ; Min throttle
  14.         mov        Temp4, #0
  15.         mov        Temp5, #255        ; Max throttle
  16.         mov        Temp6, #0
  17.         mov        Temp7, #0                ; Deadband
  18.         call        find_throttle_gain
  19.         mov        Throttle_Gain_M, Temp4
  20.         mov        Throttle_Gain, Temp3
  21.         ret

  22. find_throttle_gains_normal:
  23.         ; Check if bidirectional operation
  24.         jnb        Flags3.PGM_BIDIR, find_throttle_gains_bidir_done

  25.         mov        Temp1, #Pgm_Min_Throttle
  26.         mov        A, @Temp1
  27.         mov        Temp3, A
  28.         mov        Temp4, #0
  29.         mov        Temp1, #Pgm_Center_Throttle
  30.         mov        A, @Temp1
  31.         mov        Temp5, A
  32.         mov        Temp6, #0
  33.         clr        C
  34.         mov        A, Temp3                        ; Scale gains in bidirectional
  35.         rlc        A
  36.         mov        Temp3, A
  37.         mov        A, Temp4
  38.         rlc        A
  39.         mov        Temp4, A
  40.         clr        C
  41.         mov        A, Temp5
  42.         rlc        A
  43.         mov        Temp5, A
  44.         mov        A, Temp6
  45.         rlc        A
  46.         mov        Temp6, A
  47.         mov        Temp7, #10                ; Compensate for deadband in bidirectional
  48.         call        find_throttle_gain
  49.         mov        Throttle_Gain_BD_Rev_M, Temp4
  50.         mov        Throttle_Gain_BD_Rev, Temp3

  51. find_throttle_gains_bidir_done:
  52.         mov        Temp1, #Pgm_Min_Throttle
  53.         jnb        Flags3.PGM_BIDIR, ($+5)

  54.         mov        Temp1, #Pgm_Center_Throttle

  55.         mov        A, @Temp1
  56.         mov        Temp3, A
  57.         mov        Temp4, #0
  58.         mov        Temp1, #Pgm_Max_Throttle
  59.         mov        A, @Temp1
  60.         mov        Temp5, A
  61.         mov        Temp6, #0
  62.         mov        Temp7, #0                        ; No deadband
  63.         jnb        Flags3.PGM_BIDIR, find_throttle_gain_fwd

  64.         clr        C
  65.         mov        A, Temp3                        ; Scale gains in bidirectional
  66.         rlc        A
  67.         mov        Temp3, A
  68.         mov        A, Temp4
  69.         rlc        A
  70.         mov        Temp4, A
  71.         clr        C
  72.         mov        A, Temp5
  73.         rlc        A
  74.         mov        Temp5, A
  75.         mov        A, Temp6
  76.         rlc        A
  77.         mov        Temp6, A
  78.         mov        Temp7, #10                ; Compensate for deadband in bidirectional

  79. find_throttle_gain_fwd:
  80.         call        find_throttle_gain
  81.         mov        Throttle_Gain_M, Temp4
  82.         mov        Throttle_Gain, Temp3
  83.         ret

  84. ret


  85. ;**** **** **** **** **** **** **** **** **** **** **** **** ****
  86. ;
  87. ; Find throttle gain
  88. ;
  89. ; The difference between max and min throttle must be more than 140us (a Pgm_xxx_Throttle difference of 35)
  90. ; Temp4/3 holds min throttle, Temp6/5 holds max throttle, Temp7 holds deadband, Temp4/Temp3 gives resulting gain
  91. ;
  92. ; Finds throttle gain from throttle calibration values
  93. ;
  94. ;**** **** **** **** **** **** **** **** **** **** **** **** ****
  95. find_throttle_gain:
  96.         ; Subtract deadband from max
  97.         clr        C
  98.         mov        A, Temp5
  99.         subb        A, Temp7
  100.         mov        Temp5, A
  101.         mov        A, Temp6
  102.         subb        A, #0
  103.         mov        Temp6, A
  104.         ; Calculate difference
  105.         clr        C
  106.         mov        A, Temp5
  107.         subb        A, Temp3
  108.         mov        Temp5, A
  109.         mov        A, Temp6
  110.         subb        A, Temp4
  111.         mov        Temp6, A
  112.         ; Check that difference is minimum 35
  113.         clr        C
  114.         mov        A, Temp5
  115.         subb        A, #35
  116.         mov        A, Temp6
  117.         subb        A, #0
  118.         jnc        ($+6)

  119.         mov        Temp5, #35
  120.         mov        Temp6, #0

  121.         ; Check that difference is maximum 511
  122.         clr        C
  123.         mov        A, Temp5
  124.         subb        A, #255
  125.         mov        A, Temp6
  126.         subb        A, #1
  127.         jc        ($+6)

  128.         mov        Temp5, #255
  129.         mov        Temp6, #1

  130.         ; Find gain
  131.         mov        Temp4, #0FFh
  132. find_throttle_gain_loop:
  133.         inc        Temp4
  134.         mov        Temp3, #0
  135. test_throttle_gain:
  136.         inc        Temp3
  137.         mov        A, Temp3
  138.         jnz        test_throttle_gain_mult

  139.         clr        C
  140.         mov        A, Temp5                        ; Set multiplier x2 and range /2
  141.         rlc        A
  142.         mov        Temp5, A
  143.         mov        A, Temp6
  144.         rlc        A
  145.         mov        Temp6, A
  146.         ajmp        find_throttle_gain_loop

  147. test_throttle_gain_mult:
  148.         mov        A, Temp5                        ; A has difference, B has gain
  149.         mov        B, Temp3
  150.         mul        AB
  151.         mov        Temp7, B
  152.         mov        A, Temp6
  153.         mov        B, Temp3
  154.         mul        AB
  155.         add        A, Temp7
  156.         subb        A, #124
  157.         jc        test_throttle_gain

  158.         mov        A, Temp3
  159.         cpl        A
  160.         jz        find_throttle_gain_loop

  161.         ret
复制代码
发表于 2017-1-14 09:05:30 | 显示全部楼层
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代码段中完成的,能否解析下源码思路,多谢!
发表于 2017-6-7 07:25:25 | 显示全部楼层
最新的blheli_s   中Wt_ZC_Tout_Start_L这个变量没有给其他地方赋值看上去没有用啊
发表于 2017-6-7 09:22:10 | 显示全部楼层
这个很值得学习,围观中
发表于 2017-7-6 17:28:14 | 显示全部楼层
zzipeng 发表于 2016-5-31 20:00
商业电调感觉除了FOC之外都没这个电流保护功能。。而且比较蛋疼的是,那种好赢铂金40A电调的MOS管感觉都 ...

直接找内阻一样大小大,不过也不是很安全,会存在差异,MOS的批次不一样内阻也会有一点点偏差
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 粤ICP备09047143号 )

GMT+8, 2017-9-23 22:45

阿莫电子论坛, 原"中国电子开发网"

© 2004-2016 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表