5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 10407|回复: 30
打印 上一主题 下一主题

BLHeli开源帖子讨论

[复制链接]
跳转到指定楼层
楼主
发表于 2016-4-19 15:46 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
欢迎大家一起加入进来讨论有关BLHeli开源代码使用过程遇到的问题,一起讨论和解决
首先需要知道的是:BLHELI不是用KEIL编译的,而是另外一种编译器Raisonance,但是Raisonance这个编译器使用8k以上的程序需要收费(虽然blheli开源程序在8K以下),而且我们使用起来也不方便,一般我们喜欢用keil来修改BLHELI开源的程序使程序和自己设计的硬件对应,因为编译器的不同导致汇编的伪指令不同,汇编指令相同,在网上参考了http://bbs.5imx.com/forum.php?mod=viewthread&tid=786831这篇帖子中所讲的Raisonance和keil编译器伪指令不同的如下:
宏定义   Raisonance:MACRO [ 宏指令名 ]  [形式参数,.........]
            keil: [ 宏指令名 ] MACRO [形式参数,.........]
将使用到的头文件中的(下面的只是其中一个哦,所有的宏定义都要改哦!)
MACRO Rcp_Int_Enable
        orl        PCA0CPM0, #01h                                ; Interrupt enabled
ENDM
改成
[size=13.9130439758301px]Rcp_Int_Enable MACRO
[size=13.9130439758301px]        orl        PCA0CPM0, #01h                                ; Interrupt enabled
[size=13.9130439758301px]ENDM

[size=13.9130439758301px]如有不对请批评哦,欢迎大家将自己的见解和问题发上来共同讨论,学习

欢迎继续阅读楼主其他信息

主题

  • 没有相关信息
  • 没有相关信息
  • 没有相关信息
31
发表于 2017-3-4 16:48 | 只看该作者
本帖最后由 chenzdh 于 2017-3-4 17:10 编辑
i150625 发表于 2016-4-20 09:54
我发现用keil编译blheli10.1版本可以,而编译blheli12.1和14.1版本就一直通不过提示错误如下:
Build targ ...

可以用Keil编译14.1版本的,报错是因为程序开始电调型号选择定义的常量太多,将不需要的电调型号选择常量定义都删掉编译就不会出错了,如下:
;**** **** **** **** ****
; List of enumerated supported ESCs and modes  (main, tail or multi)

XP_3A_Main                                         EQU 1
XP_3A_Tail                                         EQU 2
XP_3A_Multi                                         EQU 3


只保留需要的定义,其它都删掉,这样就可以编译了!



30
发表于 2017-2-19 10:36 | 只看该作者
huhuzz 发表于 2017-2-18 22:05
找不到代码是因为你看的那个Skywalker_20A不支持设置BEC电压,前面那个  IF HIGH_BEC_VOLTAGE == 1  是告 ...

谢谢不吝指教!

29
发表于 2017-2-18 22:05 | 只看该作者
sjh2100 发表于 2017-1-13 11:16
;Set BEC voltage,
set_bec_voltage:
; Set bec voltage

找不到代码是因为你看的那个Skywalker_20A不支持设置BEC电压,前面那个  IF HIGH_BEC_VOLTAGE == 1  是告诉编译器,只有设置了HIGH_BEC_VOLTAGE 为1 才编译下面这段。
而在Skywalker_20A.inc里面是定义了 HIGH_BEC_VOLTAGE 为 0,所以不编译下面这段。
在BLHeli里,只有Align RCE-BL35P, Platinum 50A v3,Turnigy AE 45A, Turnigy KForce 40A 这几个才支持这个功能。

28
发表于 2017-1-23 22:55 | 只看该作者
本帖最后由 sjh2100 于 2017-1-23 23:03 编辑

            jb        Flags1.DIR_CHANGE_BRAKE, run6_check_speed;;A1--如果Flags1.DIR_CHANGE_BRAKE=1则run6_check_speed
        setb        Flags1.DIR_CHANGE_BRAKE                   ;   ; B1--如果Flags1.DIR_CHANGE_BRAKE=0则令其为1
        mov        Pwm_Limit, Pwm_Limit_Beg         
        jmp        run4            
run6_check_speed:                                                      ;;B1之后顺序执行到这里时,Flags1.DIR_CHANGE_BRAKE=1
        mov        Temp1, #0F0h                                       ; ; A2 --Flags1.DIR_CHANGE_BRAKE=1
        jnb        Flags1.DIR_CHANGE_BRAKE, run6_brake_done   ;从B1下来Flags1.DIR_CHANGE_BRAKE=1,从A1下来也是为1,再判断还有意义吗?
        mov        Pwm_Limit, Pwm_Limit_Beg                        
        mov        Temp1, #20h            
run6_brake_done:
       clr        C


27
发表于 2017-1-13 11:53 | 只看该作者
i150625 发表于 2016-4-29 21:08
看程序时这两个变量不知道是什么意思?这两个变量在pwm产生定时器中断中使用,Damping的翻译为阻尼??好像 ...

damp应该就是阻尼,类似刹车的效果吧。

26
发表于 2017-1-13 11:16 | 只看该作者
本帖最后由 sjh2100 于 2017-1-23 00:23 编辑


;Set BEC voltage,
set_bec_voltage:
; Set bec voltage
;
IF HIGH_BEC_VOLTAGE == 1
Set_BEC_Lo   ; Set default to low
mov Temp1, #Pgm_BEC_Voltage_High  
mov A, @Temp1   
jz set_bec_voltage_exit
Set_BEC_Hi   ; Set to high
****************************
program_by_tx_entry_wait_pwm:
  clr     EA                                          ; Disable all interrupts
         call beep_f1
         call wait10ms
         call beep_f1
         setb EA                                          ; Enable all interrupts
         call wait100ms
         clr     C
         mov A, New_Rcp                        ; Load new RC pulse value
         subb          A, #RCP_MAX                    ; At or above max?
         jc      program_by_tx_entry_wait_pwm  ; No - start over

         jmp  program_by_tx                           ; Yes - enter programming mode

         ; PPM throttle calibration and tx program entry
*****************以上红色代码没有找到来源,我搜索了BLHeliTxPgm.inc,BLHeliBootLoad.inc,C8051F330.INC,Skywalker_20A.inc,和blheli.asm这5个文档(非s版程序)都没发现,请教各位网友。






25
 楼主| 发表于 2016-11-25 17:45 | 只看该作者
18513030413 发表于 2016-11-9 14:04
楼主编译解决了吗?汇编代码容易看吗?

好像是因为宏定义过长导致的,换了个低版本的代码看就可以编译了,他的汇编不太好看,注释太少,花时间的话,还是没有问题

24
 楼主| 发表于 2016-11-25 17:43 | 只看该作者
逗倪豌儿 发表于 2016-10-29 11:32
你好 ,你的这个问题找到了吗 ,我好像也是这样,刷过之后就像视频里那样,启动不起来,看源码也没看出个 ...

遗憾的是没有找到,我看了程序也不知道原因在哪里,后来没有看了
23
发表于 2016-11-9 14:04 | 只看该作者
楼主编译解决了吗?汇编代码容易看吗?
22
发表于 2016-10-29 11:32 | 只看该作者

你好 ,你的这个问题找到了吗 ,我好像也是这样,刷过之后就像视频里那样,启动不起来,看源码也没看出个所以然来,求帮助!

21
发表于 2016-7-26 13:51 | 只看该作者
i150625 发表于 2016-7-17 08:58
可以,你刷固定翼尾桨的电调就好了

恩恩,谢谢楼主

20
 楼主| 发表于 2016-7-17 08:58 | 只看该作者
menglongfc 发表于 2016-7-12 15:28
楼主好棒,blheli是可以刷正反转的吧

可以,你刷固定翼尾桨的电调就好了

19
发表于 2016-7-12 15:28 | 只看该作者
楼主好棒,blheli是可以刷正反转的吧
18
发表于 2016-5-3 10:26 | 只看该作者
C8051F的单片机没有EEPROM,所以把一部分FLASH开辟出来当成EEPROM用而已
17
 楼主| 发表于 2016-5-2 16:39 | 只看该作者
   
这是视频
16
 楼主| 发表于 2016-5-2 16:38 | 只看该作者
i150625 发表于 2016-4-29 21:08
看程序时这两个变量不知道是什么意思?这两个变量在pwm产生定时器中断中使用,Damping的翻译为阻尼??好像 ...

刷了固件就是这种效果,感觉一直再重新启动

15
 楼主| 发表于 2016-4-29 21:08 | 只看该作者
看程序时这两个变量不知道是什么意思?这两个变量在pwm产生定时器中断中使用,Damping的翻译为阻尼??好像是消磁或则是抑制??还有这个单词damped,都不是太懂,有人能指点一下吗?
Damping_Period:                        DS        1                ; Damping on/off period
Damping_On:                                DS        1                ; Damping on part of damping period
14
 楼主| 发表于 2016-4-25 10:19 | 只看该作者
这个是解码函数
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Decode parameters
; 根据一些参数设置电机运行时参数
; No assumptions
;
; Decodes programming parameters
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
decode_parameters:
        ; Load programmed damping force
        mov        Temp1, #Pgm_Damping_Force; Load damping force
        mov        A, @Temp1                               
        mov        Temp8, A                                ; Store in Temp8
        ; Decode damping  下面是根据Pgm_Damping_Force中值跳转相当于swith ,给其中的两个变量赋值
        mov        Damping_Period, #9                ; Set default
        mov        Damping_On, #1
        clr        C
        cjne        Temp8, #2, decode_damping_3        ; Look for 2

        mov        Damping_Period, #5
        mov        Damping_On, #1
        jmp        decode_damping_done

decode_damping_3:
        clr        C
        cjne        Temp8, #3, decode_damping_4        ; Look for 3

        mov        Damping_Period, #5
        mov        Damping_On, #2
        jmp        decode_damping_done

decode_damping_4:
        clr        C
        cjne        Temp8, #4, decode_damping_5        ; Look for 4

        mov        Damping_Period, #5
        mov        Damping_On, #3
        jmp        decode_damping_done

decode_damping_5:
        clr        C
        cjne        Temp8, #5, decode_damping_6        ; Look for 5

        mov        Damping_Period, #9
        mov        Damping_On, #7

decode_damping_6:
        clr        C
        cjne        Temp8, #6, decode_damping_done; Look for 6

        mov        Damping_Period, #0
        mov        Damping_On, #0

decode_damping_done:
        ; Load programmed pwm frequency
        mov        Temp1, #Pgm_Pwm_Freq        ; Load pwm freq
        mov        A, @Temp1                               
        mov        Temp8, A                                ; Store in Temp8 Pgm_Pwm_Freq中的值送给Temp8
//IF MODE == 0        ; Main
//        clr        Flags2.PGM_PWMOFF_DAMPED_LIGHT
//        clr        C
//        cjne        Temp8, #3, ($+5)
//        setb        Flags2.PGM_PWMOFF_DAMPED_LIGHT
//        clr        Flags2.PGM_PWMOFF_DAMPED_FULL
//ENDIF
; 下面是根据Pgm_Pwm_Freq中的值
IF MODE >= 1        ; Tail or multi
        clr        Flags2.PGM_PWMOFF_DAMPED_LIGHT
        clr        C
        cjne        Temp8, #3, ($+5)
        setb        Flags2.PGM_PWMOFF_DAMPED_LIGHT
        clr        Flags2.PGM_PWMOFF_DAMPED_FULL
        clr        C
        cjne        Temp8, #4, ($+5)
        setb        Flags2.PGM_PWMOFF_DAMPED_FULL
ENDIF
        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
;根据PGM_PWMOFF_DAMPED_FULL和PGM_PWMOFF_DAMPED_LIGHT位是否为一选择跳转
        jz        ($+4)  ; 若A=0则跳转
        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
        ;判断Pgm_Direction_Rev.1是否为1来设置Flags3.PGM_DIR_REV的值
        clr        Flags3.PGM_DIR_REV
        mov        Temp1, #Pgm_Direction_Rev       
        mov        A, @Temp1                               
        jnb        ACC.1, ($+5)
        setb        Flags3.PGM_DIR_REV
        ;判断Pgm_Input_Pol.1是否为1来设置Flags3.PGM_RCP_PWM_POL的值
        clr        Flags3.PGM_RCP_PWM_POL
        mov        Temp1, #Pgm_Input_Pol       
        mov        A, @Temp1                               
        jnb        ACC.1, ($+5)
        setb        Flags3.PGM_RCP_PWM_POL
        ; 根据Temp8的值是否为2来选择跳转 等于decode_pwm_freq_low
        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
13
 楼主| 发表于 2016-4-25 10:11 | 只看该作者
skypup 发表于 2016-4-24 18:52
可能是另一个作用。
从 #Pgm_Pwm_Freq 这些地址读出配置参数(parameters),并解析(decode)。

这些数据是变量存储在RAM中,他上电是根据flash校验码是否正确,来读取flash中的储存的参数,相当于把flash当eeprom使用的,这个函数[size=13.9130439758301px]decode_damping_done中根据设置的值判断是否使能比较器,有感的不使用比较器使用端口检测就好了,无感的才要用到比较器,由此我才想到编码是位置传感器的意思,不过你说的也对,我在看看程序吧,
  1. CSEG AT 1A00h            ; "Eeprom" segment        从地址为1A00h的flash存储下面的常量
  2. EEPROM_FW_MAIN_REVISION                EQU        10                ; Main revision of the firmware
  3. EEPROM_FW_SUB_REVISION                EQU        1                ; Sub revision of the firmware
  4. EEPROM_LAYOUT_REVISION                EQU        16                ; Revision of the EEPROM layout

  5. Eep_FW_Main_Revision:                DB        EEPROM_FW_MAIN_REVISION                        ; EEPROM firmware main revision number
  6. Eep_FW_Sub_Revision:                DB        EEPROM_FW_SUB_REVISION                        ; EEPROM firmware sub revision number
  7. Eep_Layout_Revision:                DB        EEPROM_LAYOUT_REVISION                        ; EEPROM layout revision number

  8. IF MODE == 2
  9. Eep_Pgm_Gov_P_Gain:                        DB        DEFAULT_PGM_MULTI_P_GAIN                        ; EEPROM copy of programmed closed loop P gain
  10. Eep_Pgm_Gov_I_Gain:                        DB        DEFAULT_PGM_MULTI_I_GAIN                        ; EEPROM copy of programmed closed loop I gain
  11. Eep_Pgm_Gov_Mode:                        DB        DEFAULT_PGM_MULTI_GOVERNOR_MODE        ; EEPROM copy of programmed closed loop mode

  12. Eep_Pgm_Low_Voltage_Lim:                DB        DEFAULT_PGM_MULTI_LOW_VOLTAGE_LIM        ; EEPROM copy of programmed low voltage limit
  13. Eep_Pgm_Motor_Gain:                        DB        DEFAULT_PGM_MULTI_GAIN                        ; EEPROM copy of programmed tail gain
  14. _Eep_Pgm_Motor_Idle:                DB        0FFh                                                        ; EEPROM copy of programmed tail idle speed
  15. Eep_Pgm_Startup_Pwr:                DB        DEFAULT_PGM_MULTI_STARTUP_PWR                ; EEPROM copy of programmed startup power
  16. Eep_Pgm_Pwm_Freq:                        DB        DEFAULT_PGM_MULTI_PWM_FREQ                ; EEPROM copy of programmed pwm frequency
  17. Eep_Pgm_Direction_Rev:                DB        DEFAULT_PGM_MULTI_DIRECTION_REV        ; EEPROM copy of programmed rotation direction
  18. Eep_Pgm_Input_Pol:                        DB        DEFAULT_PGM_MULTI_RCP_PWM_POL                ; EEPROM copy of programmed input polarity
  19. ; 下面的两个地址中存储的是一个十六位的校验码 用于
  20. Eep_Initialized_L:                        DB        055h                                                        ; EEPROM initialized signature low byte
  21. Eep_Initialized_H:                        DB        0AAh                                                        ; EEPROM initialized signature high byte

  22. Eep_Enable_TX_Program:                DB        DEFAULT_PGM_ENABLE_TX_PROGRAM                ; EEPROM TX programming enable
  23. _Eep_Main_Rearm_Start:                DB        0FFh                                                       
  24. _Eep_Pgm_Gov_Setup_Target:        DB        0FFh                                                       
  25. Eep_Pgm_Startup_Rpm:                DB        DEFAULT_PGM_MULTI_STARTUP_RPM                ; EEPROM copy of programmed startup rpm
  26. Eep_Pgm_Startup_Accel:                DB        DEFAULT_PGM_MULTI_STARTUP_ACCEL        ; EEPROM copy of programmed startup acceleration
  27. _Eep_Pgm_Volt_Comp:                        DB        0FFh       
  28. Eep_Pgm_Comm_Timing:                DB        DEFAULT_PGM_MULTI_COMM_TIMING                ; EEPROM copy of programmed commutation timing
  29. Eep_Pgm_Damping_Force:                DB        DEFAULT_PGM_MULTI_DAMPING_FORCE        ; EEPROM copy of programmed damping force
  30. _Eep_Pgm_Gov_Range:                        DB        0FFh       
  31. Eep_Pgm_Startup_Method:                DB        DEFAULT_PGM_MULTI_STARTUP_METHOD        ; EEPROM copy of programmed startup method
  32. Eep_Pgm_Ppm_Min_Throttle:        DB        DEFAULT_PGM_PPM_MIN_THROTTLE                ; EEPROM copy of programmed minimum throttle (final value is 4x+1000=1148)
  33. Eep_Pgm_Ppm_Max_Throttle:        DB        DEFAULT_PGM_PPM_MAX_THROTTLE                ; EEPROM copy of programmed minimum throttle (final value is 4x+1000=1832)
  34. Eep_Pgm_Beep_Strength:                DB        DEFAULT_PGM_MULTI_BEEP_STRENGTH        ; EEPROM copy of programmed beep strength
  35. Eep_Pgm_Beacon_Strength:                DB        DEFAULT_PGM_MULTI_BEACON_STRENGTH        ; EEPROM copy of programmed beacon strength
  36. Eep_Pgm_Beacon_Delay:                DB        DEFAULT_PGM_MULTI_BEACON_DELAY        ; EEPROM copy of programmed beacon delay
  37. Eep_Pgm_Throttle_Rate:                DB        DEFAULT_PGM_MULTI_THROTTLE_RATE        ; EEPROM copy of programmed throttle rate
  38. Eep_Pgm_Demag_Comp:                        DB        DEFAULT_PGM_MULTI_DEMAG_COMP                ; EEPROM copy of programmed demag compensation
  39. Eep_Pgm_BEC_Voltage_High:        DB        DEFAULT_PGM_BEC_VOLTAGE_HIGH                ; EEPROM copy of programmed BEC voltage
  40. ENDIF
复制代码


您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /2 下一条

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