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

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 10406|回复: 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]如有不对请批评哦,欢迎大家将自己的见解和问题发上来共同讨论,学习

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

主题

  • 没有相关信息
  • 没有相关信息
  • 没有相关信息
沙发
 楼主| 发表于 2016-4-19 15:48 | 只看该作者
上面不知道为什么乱码了是这样的哦
Rcp_Int_Enable MACRO
        orl        PCA0CPM0, #01h                                ; Interrupt enabled
ENDM[/code]

3
 楼主| 发表于 2016-4-20 09:54 | 只看该作者
我发现用keil编译blheli10.1版本可以,而编译blheli12.1和14.1版本就一直通不过提示错误如下:
Build target 'Target 1'
assembling BLHeli.asm...
A51 MACRO ASSEMBLER V8.02 - SN: A1CMC-P6XRBC
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2008
"D:\Keil\C51\BIN\A51.EXE" "BLHeli.asm" NOMOD51 SET (SMALL) EP
A51 FATAL ERROR -
  ERROR:      LIMIT EXCEEDED: BALANCED TEXT LENGTH
A51 TERMINATED.
Target not created
有人有好的建议吗?
4
发表于 2016-4-20 18:01 ——“来自手机” | 只看该作者
貌似代码太长,编译不了。这里懂软件的少点,又是编译器又是汇编什么的
5
 楼主| 发表于 2016-4-20 19:27 | 只看该作者
恩恩,从keil帮助里的解释:
The macro preprocessor's internal limit for balanced text length is violated. Expansions and intermediate expansions cannot produce strings longer than 2045 characters.
好像是定义的常量长度超出编译器限定的,算了我还是用BLHeli10.1版本研究吧,打算研究汇编了哦,问一下blheli修改参数是通过接受PPM信号接口吗?电脑用usb转串口连接吗?我看了一下他PPM是接RX,TX,像是通过串口修改参数的,没有刷过blheli固件,有刷过的说一下谢谢!
6
发表于 2016-4-20 21:28 | 只看该作者
关注。

楼主是指的 C8051 的代码吧,那个单片机我试过直接用烧录程序的接口,在上位机里面改参数。
另一种 Bootloader 的方法,没有试过,不知道该如何接线。

学汇编有啥快捷一些的方法么?
我改 BlHeli 的程序,都是先想一想用C该如何写,然后再人肉把C翻译成汇编,效率应当是非常低的。

7
发表于 2016-4-21 08:36 ——“来自手机” | 只看该作者
ppm就是接收机的信号,并非串口
blheli可以通过ppm和编程口修改设置
8
 楼主| 发表于 2016-4-21 15:49 | 只看该作者
giantwjt 发表于 2016-4-21 08:36
ppm就是接收机的信号,并非串口
blheli可以通过ppm和编程口修改设置

“blheli可以通过ppm和编程口修改设置”这句话说的不是太懂,通过编程口修改设置是指:修改blheli程序中的参数再烧写程序吗?我其实是想问用blheli修改参数的上位机如何与刷了固件的电调通讯并修改参数,用什么工具,

9
 楼主| 发表于 2016-4-21 15:51 | 只看该作者
skypup 发表于 2016-4-20 21:28
关注。

楼主是指的 C8051 的代码吧,那个单片机我试过直接用烧录程序的接口,在上位机里面改参数。

买本《单片机原理与接口技术》的书看就好了,语句比较简单,就是汇编程序的设计逻辑比较复杂。

评分

参与人数 1威望 +2 收起 理由
skypup + 2 赞一个!

查看全部评分

10
发表于 2016-4-22 00:52 | 只看该作者
blheli就是这么牛,上位机软件可通过编程口烧录程序以外,还可以设置参数,当然是烧完程序后再设置,而且上位机把hex内嵌了。观众朋友用起来非常方便
ppm设置就是常规的用遥控器设置,听声音那种方式
11
 楼主| 发表于 2016-4-24 12:18 | 只看该作者
giantwjt 发表于 2016-4-22 00:52
blheli就是这么牛,上位机软件可通过编程口烧录程序以外,还可以设置参数,当然是烧完程序后再设置,而且上 ...

blheli支持有感无刷直流电机吗?我看blheli程序中有decode_parameters这个函数,像是编码器的意思

12
发表于 2016-4-24 18:52 | 只看该作者
本帖最后由 skypup 于 2016-4-24 18:53 编辑
i150625 发表于 2016-4-24 12:18
blheli支持有感无刷直流电机吗?我看blheli程序中有decode_parameters这个函数,像是编码器的意思
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Decode parameters
;
; No assumptions
;
; Decodes programming parameters
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
decode_parameters:
        ; Load programmed pwm frequency
        mov        Temp1, #Pgm_Pwm_Freq        ; Load pwm freq
        mov        A, @Temp1                                
        mov        Temp8, A                                ; Store in Temp8
        clr        Flags2.PGM_PWMOFF_DAMPED
IF DAMPED_MODE_ENABLE == 1
        cjne        Temp8, #3, ($+5)
        setb        Flags2.PGM_PWMOFF_DAMPED
ENDIF
        ; Load programmed direction
        mov        Temp1, #Pgm_Direction        
IF MODE >= 1        ; Tail or multi
        mov        A, @Temp1                                
        clr        C
        subb        A, #3
        jz        decode_params_dir_set
ENDIF

        clr        Flags3.PGM_DIR_REV
        mov        A, @Temp1                                
        jnb        ACC.1, ($+5)
        setb        Flags3.PGM_DIR_REV
decode_params_dir_set:
        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

可能是另一个作用。
从 #Pgm_Pwm_Freq 这些地址读出配置参数(parameters),并解析(decode)。


; Indirect addressing data segment. The variables below must be in this sequence
ISEG AT 080h                                       
Pgm_Gov_P_Gain:                        DS        1                ; Programmed governor P gain
Pgm_Gov_I_Gain:                        DS        1                ; Programmed governor I gain
Pgm_Gov_Mode:                                DS        1                ; Programmed governor mode
Pgm_Low_Voltage_Lim:                DS        1                ; Programmed low voltage limit
Pgm_Motor_Gain:                        DS        1                ; Programmed motor gain
Pgm_Motor_Idle:                        DS        1                ; Programmed motor idle speed
Pgm_Startup_Pwr:                        DS        1                ; Programmed startup power
Pgm_Pwm_Freq:                                DS        1                ; Programmed pwm frequency

这些数据在放在指定的地址的:ISEG AT 080h.
有点儿像其它单片机的片内 EEPROM 的感觉。







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
复制代码


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
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
16
 楼主| 发表于 2016-5-2 16:38 | 只看该作者
i150625 发表于 2016-4-29 21:08
看程序时这两个变量不知道是什么意思?这两个变量在pwm产生定时器中断中使用,Damping的翻译为阻尼??好像 ...

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

17
 楼主| 发表于 2016-5-2 16:39 | 只看该作者
   
这是视频
18
发表于 2016-5-3 10:26 | 只看该作者
C8051F的单片机没有EEPROM,所以把一部分FLASH开辟出来当成EEPROM用而已
19
发表于 2016-7-12 15:28 | 只看该作者
楼主好棒,blheli是可以刷正反转的吧
20
 楼主| 发表于 2016-7-17 08:58 | 只看该作者
menglongfc 发表于 2016-7-12 15:28
楼主好棒,blheli是可以刷正反转的吧

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

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

本版积分规则

关闭

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

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