搜索
bottom↓
回复: 171

BLHeli 杂谈和研究讨论

  [复制链接]

出0入0汤圆

发表于 2016-5-28 09:32:34 来自手机 | 显示全部楼层 |阅读模式
我就随便讲讲我所知道的BLHeli历史吧。

然后有源码上的问题可以问,我尽量回答。
我在论坛的权限不高,一小时只能回三篇,
所以只能慢慢说。

BLheli 是欧洲一位神人S君写的最早是在
华科耳的10a ESC上实现的。是基于atmel
8位的芯片。代码实现参考了德国另外一位
高手的无刷C代码。但是因为用atmel汇编写的,程序是完全独立的。

那个时候 atmega8 芯片是锁住的,刷程序
很麻烦,要先焊下来然后换个新的芯片上去。
去除保护位需要用到一个高电压编程,是个并
口,要接10多条线才能把那个保护位去掉,
而且需要比较高级的编程板子。S君都是直接
换个新的上去。我还做过一个接这么多脚的转
接板,但是也很麻烦就是了。

那时候基于atmel的blheli基本上没有什么人玩,
要焊芯片下来需要热风枪。事情发生转变是在
S君把blheli移植到 silabs的芯片上去。当时的
电调是xp7a和xp3a这些。推动这个的另外一个
爆发点事地平线的mcpx小直升机,当时无福翼
的小飞机第一次做这么小,非常火。但是马力
欠缺,很多人DIY改无刷。silabs的电调不要
焊下来可以直接刷blheli,一下子被大家追捧起来。

先写这么多吧。TBD。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入4汤圆

发表于 2023-10-9 15:22:46 | 显示全部楼层
bajie 发表于 2021-2-26 18:11
感谢楼主,我看了一半论坛,先mark下。刚看完了MK的源代码,接下来要好好啃啃BLHeli了 ...
(引用自171楼)

两年后的我也开始看这个了

出0入0汤圆

发表于 2021-2-26 18:11:17 | 显示全部楼层
感谢楼主,我看了一半论坛,先mark下。刚看完了MK的源代码,接下来要好好啃啃BLHeli了

出0入0汤圆

发表于 2019-12-3 20:17:39 | 显示全部楼层
BLHeli_32闭源了?

出0入0汤圆

发表于 2018-8-30 15:51:13 | 显示全部楼层
很长的 慢慢学

出0入0汤圆

发表于 2018-1-8 23:53:40 | 显示全部楼层
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进行比较,相等则跳转,否则关闭输出之后再跳转,这里这么写是什么原因呢?

出0入0汤圆

发表于 2017-10-18 09:05:55 | 显示全部楼层
zzipeng 发表于 2016-5-31 14:44
感觉这些电调无论BLHELI或者非BLHELI,只要电机一堵转就很容易烧MOS管了。。硬件保护不行 ...

那是你感觉,BLDC驱动不像有刷电调,一堵转程序立马就知道,马上做出保护。

出0入0汤圆

发表于 2017-10-17 20:32:08 | 显示全部楼层
helislayer 发表于 2016-6-18 09:41
这段代码调用的函数都有名字,
我重复一次也没有意思。你看了这段
代码有什么具体理解上的问题?

lz,我估计他是想问,为何这个地方这些函数调用了多次?我也是疑惑

出0入0汤圆

发表于 2017-7-6 17:28:14 | 显示全部楼层
zzipeng 发表于 2016-5-31 20:00
商业电调感觉除了FOC之外都没这个电流保护功能。。而且比较蛋疼的是,那种好赢铂金40A电调的MOS管感觉都 ...

直接找内阻一样大小大,不过也不是很安全,会存在差异,MOS的批次不一样内阻也会有一点点偏差

出0入0汤圆

发表于 2017-6-7 09:22:10 | 显示全部楼层
这个很值得学习,围观中

出0入0汤圆

发表于 2017-6-7 07:25:25 | 显示全部楼层
最新的blheli_s   中Wt_ZC_Tout_Start_L这个变量没有给其他地方赋值看上去没有用啊

出0入0汤圆

发表于 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代码段中完成的,能否解析下源码思路,多谢!

出0入0汤圆

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

出0入0汤圆

发表于 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 ,按照他的执行过程,画出来的导通图不对呀,请教!

出0入0汤圆

发表于 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)(计算下次的各个等待时间)|

还请楼主验证下,多谢!

出0入0汤圆

发表于 2016-12-23 16:06:28 | 显示全部楼层
高手啊!
谢谢分享这么多。
我是直接写入成品电调里用。好xx的,螃蟹的都改了。是好用。

出0入0汤圆

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

$ grep t0_int *

找到啦,谢谢

出0入0汤圆

 楼主| 发表于 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

出0入0汤圆

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

搜过啦,没有的。会不会在编译器带的文件里呢

出0入0汤圆

 楼主| 发表于 2016-12-17 02:59:13 | 显示全部楼层
zhkchina 发表于 2016-12-14 20:35
这个程序怎么找不到中断向量表在哪里呢,只有一个t0_int,找不到中断从哪里跳转过来的? ...

这个你全部文件搜索一下就应该可以找到拉。

出0入0汤圆

发表于 2016-12-14 20:35:58 | 显示全部楼层
这个程序怎么找不到中断向量表在哪里呢,只有一个t0_int,找不到中断从哪里跳转过来的?

出0入0汤圆

 楼主| 发表于 2016-11-27 22:49:49 | 显示全部楼层
846528111 发表于 2016-11-24 14:19
谢谢楼主,现在电调发热有点大,但是不会烧MOS管,电机高低速都正常,楼主知道一般电调发热有哪些 ...

MOS 不够好,内阻大。
还有一个软件原因是存在很短时间的上下mos 一起通的短路。
但是足够短不会烧掉 MOS,就会表现为发热。

出0入0汤圆

发表于 2016-11-27 09:56:21 | 显示全部楼层
BLHeli学习  

出0入0汤圆

发表于 2016-11-26 21:33:42 | 显示全部楼层
本帖最后由 yuntian 于 2016-11-27 09:03 编辑

已搞懂,Comm_Period4x 的单位是0.5us

出0入0汤圆

发表于 2016-11-24 14:19:50 | 显示全部楼层
谢谢楼主,现在电调发热有点大,但是不会烧MOS管,电机高低速都正常,楼主知道一般电调发热有哪些原因吗?

出0入0汤圆

 楼主| 发表于 2016-11-24 11:42:24 | 显示全部楼层
846528111 发表于 2016-11-23 16:20
楼主 damped light模式是同步整流,当PWM_OFF时两个上臂短接,这样做不会导致力矩力矩的剧烈波动吗?我现在 ...

力矩应该是会剧烈波动。但是希望是切换很快速这样没有影响到平滑性。
至少理论上是希望这样。你的具体情况我就不知道了。

出0入0汤圆

发表于 2016-11-23 16:20:19 | 显示全部楼层
楼主 damped light模式是同步整流,当PWM_OFF时两个上臂短接,这样做不会导致力矩力矩的剧烈波动吗?我现在用 damped light模式电机转起来效果很差。

出0入0汤圆

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

另外我看那个 ST 给出的参考数据,F4 的 MAX FOC 就比 F3 的高不少。
所以我估计其中一个重要限制因数是 MCU 的计算速度。因为 FOC 计算
量相对方波多很多。当然其他因素也会有,例如 AD 采样的速度等等,
计算量会是高速的主要限制条件。

出0入0汤圆

发表于 2016-10-5 21:26:08 | 显示全部楼层
学习BLHeLi

出0入0汤圆

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

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

先跑起来再考虑高速的情况吧。 ST 那个方案的好处
是用 ST 库是可以直接跑起来的,至少可以有对比。
确认硬件方面没有问题。软件就看自己本事了。

出0入0汤圆

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


是的,好像2XX软妹币一套,不过听海绵宝宝说高速FOC还是和普通FOC有些不同。。。。。。。

出0入0汤圆

 楼主| 发表于 2016-10-5 02:28:08 | 显示全部楼层
wangyj173 发表于 2016-10-4 13:47
也有想法买一套st的飞控套餐

飞控套餐? 你说的是 ST 的 FOC 马达驱动实验板吧。

出0入0汤圆

发表于 2016-10-4 13:47:34 | 显示全部楼层
也有想法买一套st的飞控套餐

出0入0汤圆

 楼主| 发表于 2016-9-24 13:45:17 | 显示全部楼层
ayumi8 发表于 2016-9-24 12:58
DP3A 还是 XP3A 的电调 我做过几个  程序汇编看不懂  电调 倒是很好用   楼主做个STM8的玩玩吧   论坛好几 ...

自己做一个没有很多兴趣用 STM8.
其实 ST 有 FOC 方案的,但是不是开源的。
如果要搞的话就直接用 ST 的 FOC 硬件的开发板
来做好了,不用 ST 库自己搞好了。至少保证硬件
部分没有问题。

出0入0汤圆

发表于 2016-9-24 12:58:00 | 显示全部楼层
DP3A 还是 XP3A 的电调 我做过几个  程序汇编看不懂  电调 倒是很好用   楼主做个STM8的玩玩吧   论坛好几个开源的后面都烂尾太监了好像是 没看到代码什么的

出0入0汤圆

 楼主| 发表于 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 做了些幅度
限制。抖动那个是为了减少周期性引入的噪音。

出0入0汤圆

发表于 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
     这几个变量什么用途,它们之间什么关系?
     谢谢!

出0入0汤圆

 楼主| 发表于 2016-9-23 00:59:21 | 显示全部楼层
xiangyuan_122 发表于 2016-9-22 15:00
我想问的不是这个指令,我的意思是jz在这里出现了3次,但是中间没有改变ACC的值,那是不是可以只判断一次 ...

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

我也没有看出有什么其他好处。

出0入0汤圆

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

SETB addr 是设置一个 bit。

我想问的不是这个指令,我的意思是jz在这里出现了3次,但是中间没有改变ACC的值,那是不是可以只判断一次,后面的条件分开,他这里判断3次的原因是什么?jz后面的($+4)就是如果ACC为0跳过下一条指令,否则两条都执行

出0入0汤圆

 楼主| 发表于 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。

出0入0汤圆

发表于 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后第二条指令,不为零就后面两条都执行?为什么要多次判断不一次判断分两支呢

出0入0汤圆

发表于 2016-9-21 15:06:01 | 显示全部楼层
helislayer 发表于 2016-9-21 11:05
这个你需要知道的是, SimonK bootloader 是一个独立出来的 bootloader,和 BLHeli 带的
bootloader不是同 ...

在源码里面没有找到Bootloader相关代码。这个功能是怎么实现的呢?

出0入0汤圆

 楼主| 发表于 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 的某个变量里面装进来的。

出0入0汤圆

发表于 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 不明白
  还有前面判断的那些 字符是什么意思?

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

疑问的地方我都用红色的字符标出来了,先谢谢了。

出0入0汤圆

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

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

出0入0汤圆

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

就是启动的原理和启动过程中换向时间的设置那部分不太理解,能具体说一下启动吗?

出0入0汤圆

 楼主| 发表于 2016-9-19 11:41:26 | 显示全部楼层
846528111 发表于 2016-9-18 15:55
楼主,启动部分代码不太理解,启动时会初始化一个总的时间0xf000 ,启动分成两个阶段,但是看不懂这两个阶 ...

你能指到代码里面你说的是那个变量和哪一段代码看不懂?

出0入0汤圆

 楼主| 发表于 2016-9-19 11:40:36 | 显示全部楼层
Anteater 发表于 2016-8-31 02:27
我不懂汇编,因此自然也没有看过BLHeli, 但是之前移植过MK电调的程序,由于是第一次控制无刷,因此印象很 ...

我说一下 BLHeli 启动的部分吧。
首先,就算 BLHeli 作者去新适应一个 ESC, 也是要调的。
你看到的 BLHeli 是人家调过的结果,当然比没有调过的要顺利。
很可能改的就是一些参数。
BLHeli 启动有磁饱和检测。这个是比较影响换相时间的一个
因素。启动时候电流比较大,大的马达比较容易有磁饱和问题。

出0入0汤圆

发表于 2016-9-18 15:55:19 | 显示全部楼层
楼主,启动部分代码不太理解,启动时会初始化一个总的时间0xf000 ,启动分成两个阶段,但是看不懂这两个阶段的换向时间是怎样控制的能解释一下吗?

出0入0汤圆

发表于 2016-9-1 11:16:49 | 显示全部楼层
Blheli 新的S ,穿越机市场销售火爆。

出0入0汤圆

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

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

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

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

此外我在移植MK程序的时候,启动的PWM大约是10%,如果启动失败,就是电机没转的情况下很多次,MOSFET并不会烧毁,我还特意做过30% PWM情况下,加大负载让电机在0.7秒以内停转,程序是有时间检测出堵转,然后进入启动模式。 按道理BLHeli应该处理的更好才是。

出0入0汤圆

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

还会有核味的说

出0入0汤圆

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

对,有水声的是水力发出来的。

出0入0汤圆

发表于 2016-8-31 02:04:46 | 显示全部楼层
helislayer 发表于 2016-5-28 23:33
另外有人问BLHeli那里可以下到源码,这个一直就没有变过。
最新的 BLHeli永远在 github 里面 bitdump 下 ...

看到  “顶级高手据说可以从 fet 烧糊的味道辨别出是N fet 还是 P fet 烧了” 忽然想起来 “HIFI高手能听出来用的水电站发出来的电还是火电站发出来的电”  233333

出0入0汤圆

发表于 2016-8-27 09:07:36 | 显示全部楼层
楼主,里面的速度是怎么计算出来的,; Set high rpm bit (if above 156k erpm),自己算出来的话不一样?

出0入0汤圆

发表于 2016-8-25 11:14:19 | 显示全部楼层
846528111 发表于 2016-8-24 21:22
mov  sp , #c0h     ;楼主,堆栈怎么能放在特殊功能寄存区?这样不会出错吗?

知道了,如果给堆栈赋初值在80-ff ,编译器会自动将堆栈放到RAM区。

出0入0汤圆

发表于 2016-8-24 21:22:16 | 显示全部楼层
mov  sp , #c0h     ;楼主,堆栈怎么能放在特殊功能寄存区?这样不会出错吗?

出0入0汤圆

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

减速时可以增加快速响应,这个我知道。我看代码中发现,但是如果正常运行,当PWM输出为低时而两个上臂导通,这样不会损失效率吗?

出0入0汤圆

 楼主| 发表于 2016-8-19 03:15:42 | 显示全部楼层
846528111 发表于 2016-8-18 20:23
楼主,t0_int_pwm_off_damped,当PWM输出低电平时会有两个P管导通,这样不会导致电机卡顿吗,这样做的目的是 ...

会啊,damped 就是减速啊。
减速有两个策略,一个是被动一个是主动的。
简单被动减速就是导通然后让电流消耗调能量。

出0入0汤圆

发表于 2016-8-18 20:23:54 | 显示全部楼层
楼主,t0_int_pwm_off_damped,当PWM输出低电平时会有两个P管导通,这样不会导致电机卡顿吗,这样做的目的是什么?

出0入0汤圆

发表于 2016-8-17 00:00:41 | 显示全部楼层
粗略看了一下,感觉很有参考价值,打个标记

出0入0汤圆

 楼主| 发表于 2016-8-8 17:56:10 | 显示全部楼层
SamuelSiu 发表于 2016-8-8 17:06
请问电调输入信号的波形是怎样的?如果把遥控接收器某通道的信号接电调输入马达会转吗? ...

输入就是 PPM 或者 PWM。
应该会传,接收器输出是 PPM。
缺省可能要先检测一下油门信号。
可以配置 BLHeli 不做检测那步。

出0入0汤圆

发表于 2016-8-8 17:06:25 | 显示全部楼层
请问电调输入信号的波形是怎样的?如果把遥控接收器某通道的信号接电调输入马达会转吗?

出0入0汤圆

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

官网没有与之对 ...

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

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

你先把每个 FET 的控制搞清除,用万用表量联通性。
把 H 桥对应的控制画出来再做控制。不然乱点 FET
很容易短路烧 FET 的。

出0入0汤圆

发表于 2016-7-20 16:28:29 | 显示全部楼层
楼主。请教下,在不懂汇编的前提下。如何修改部分汇编程序使之适用于一款atmega8的电调呢

官网没有与之对应的版本

io口有一定的区别··

看国外有教程,试验了下没成功。烧mos

出0入0汤圆

 楼主| 发表于 2016-7-17 09:06:47 | 显示全部楼层
浪子怀海 发表于 2016-7-17 08:59
我是因为keil编译不了高版本的,才看10.1的,我主要是想看懂他的焕相策略,都是用比较检测过零点,问题是 ...

哦,那我觉得最省事就是下载一个官方的 Ride 编译器,
这个下载链接文档里有提到的。
然后注册一个hobby license 就好了。hobby license 是
免费的。这个我觉得是最好的解决方法,
BLHeli 本来就不是设计给 Keil 来编译的。

出0入0汤圆

发表于 2016-7-17 08:59:35 | 显示全部楼层
helislayer 发表于 2016-7-8 09:36
有什么特别原因你一定要研究 10.1 的版本吗?
一般来说,如果那段代码后来被改写了,那一般是
有原因的。 ...

我是因为keil编译不了高版本的,才看10.1的,我主要是想看懂他的焕相策略,都是用比较检测过零点,问题是在什么时候检测,检测几次(比较器中断触发不行)?后来因为一些事落下blheli了。

出0入0汤圆

发表于 2016-7-17 08:55:56 | 显示全部楼层
giantwjt88 发表于 2016-7-8 10:59
楼主有blheli用的编译器吗,用的人太少了,找了好久没有和谐版。新版的blheli程序太大了,keil编译不了,老 ...

是用不了,好像是定义的宏字符超过了keil的限制,需要改一些宏名

出0入0汤圆

发表于 2016-7-13 11:42:58 | 显示全部楼层
本帖最后由 846528111 于 2016-7-13 11:44 编辑

楼主,请教下根据Pgm_Comm_Timing 的奇偶来进入store_times_decrease,store_times_increase的目的是什么?

出0入0汤圆

 楼主| 发表于 2016-7-8 11:13:07 | 显示全部楼层
giantwjt88 发表于 2016-7-8 10:59
楼主有blheli用的编译器吗,用的人太少了,找了好久没有和谐版。新版的blheli程序太大了,keil编译不了,老 ...

Raisonance 的编译器是免费下载的,你激活一个 hobby license
就可以了。官方的编译允许 hobby license 编译到 4K 还是 8K.
反正 BLHeli 够用了。就是需要激活一下。完全正版渠道就可以。
没有必要和谐啊。

出0入0汤圆

发表于 2016-7-8 10:59:38 来自手机 | 显示全部楼层
楼主有blheli用的编译器吗,用的人太少了,找了好久没有和谐版。新版的blheli程序太大了,keil编译不了,老版本是可以的

出0入0汤圆

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

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

换相策勒这些在最新的版本也有提供。
基本上就是看比较器,从时间做些统计,有需要的话
提前关电(demag)

出0入0汤圆

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

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

我的是10.1的版本,你有时间的话麻烦看看,能讲讲换相的策略吗?

出0入0汤圆

 楼主| 发表于 2016-7-7 21:51:53 | 显示全部楼层
846528111 发表于 2016-7-7 17:24
楼主,请教下 pgm _comm_Timing   和  DEMAG_DETECTED  起什么作用?

DEMAG 这个作用就是检测到换相时间和预计不符合的时候,
提前关闭FET 的通电好让线圈有一个提前的时间泻掉电流。

Pgm_comm_timing 就是从编程器或者那个 BLHeli 配置
工具预先设定的换相需要的初始时间。给启动这些时候用。
跑起来了这个换相时间就是动态决定的了。

出0入0汤圆

发表于 2016-7-7 17:24:42 | 显示全部楼层
楼主,请教下 pgm _comm_Timing   和  DEMAG_DETECTED  起什么作用?

出0入0汤圆

 楼主| 发表于 2016-7-6 12:56:09 | 显示全部楼层
小小苹果 发表于 2016-7-5 23:46
我也没有搜到,另外请教楼主个问题:
t3_int:        ; Used for commutation timing
        clr         IE_EA                        ; Disable all ...

t3 中断这个我可以看出来的就是会反复清除
T3_PENDING 这个 bit。我想这个很短时间和
你后面问的问题相关。


直接写TMR3L和TMR3H 是有race condition
冲突风险。因为你写寄存器计数器的时候不是
原子操作的。写低的时候低的就开始跑了,没
准写高的时候低的已经触发了。

所以他的策略是用这个很短的时间来装入
TMR3LH TMR3LL, 我想 MCU 应该是有
某种保护机制确保同时把 TMR3LH TMR3LL
装入到计数器不会只装了一半。

当然你也可以停止计数器然后装入然后再开始。
用的策略不一样。

出0入0汤圆

发表于 2016-7-5 23:46:13 | 显示全部楼层
我也没有搜到,另外请教楼主个问题:
t3_int:        ; Used for commutation timing
        clr         IE_EA                        ; Disable all interrupts
        anl        EIE1, #7Fh                ; Disable timer3 interrupts
        mov        TMR3RLL, #0FAh                ; Set a short delay before next interrupt
        mov        TMR3RLH, #0FFh
        clr        Flags0.T3_PENDING         ; Flag that timer has wrapped
        anl        TMR3CN0, #07Fh                ; Timer3 interrupt flag cleared
        setb        IE_EA                        ; Enable all interrupts
        reti


wait_advance_timing:       
        jnb        Flags0.T3_PENDING, ($+5)
        jmp        wait_advance_timing

        ; Setup next wait time
        mov        TMR3RLL, Wt_ZC_Tout_Start_L
        mov        TMR3RLH, Wt_ZC_Tout_Start_H
        setb        Flags0.T3_PENDING
        orl        EIE1, #80h        ; Enable timer3 interrupts

第一段程序内,每次 T3 溢出中断后,TMR3RLL和TMR3RLH重装寄存器里都要写入这个延时很短的值。为什么?
第二段程序内,等待T3 溢出中断后, 把这个Wt_ZC_Tout_Start_L时间写入TMR3RLL寄存器,也改变不了当前的溢出等待时间吧。为什么不直接写TMR3L和TMR3H呢?

出0入0汤圆

 楼主| 发表于 2016-7-5 21:34:23 | 显示全部楼层
浪子怀海 发表于 2016-7-4 14:42
120就是pwm计数的个数 = 62.5/256 * 120,

        mov        Temp2, #120

不好意思最近比较忙每有机会看代码。

我刚才去看了一下代码,你看到是什么版本啊?
我在最新的 git 里面没有找到你贴的代码。有可能
你看到代码已经很老被改写了。

SiLabs]$ grep pwm_wait *
grep: Hex files: Is a directory
[ SiLabs]$

你看我搜索了一下 Silabs 目录就没有 pwm_wait 这个结果。
我刚才更新了一下 git,也没有。

出0入0汤圆

发表于 2016-7-4 14:43:31 | 显示全部楼层
TL1,在定时器0中断中清零

出0入0汤圆

发表于 2016-7-4 14:42:02 | 显示全部楼层
helislayer 发表于 2016-7-4 14:03
我觉得你理解对,但是什么地方说了120的单位是1us呢?没准那个120的单位是循环或者其他什么时间单位的。 ...

120就是pwm计数的个数 = 62.5/256 * 120,

        mov        Temp2, #120
pwm_wait:                                               
        clr        C
        mov        A, TL1
        subb        A, Temp2
IF DAMPED_MODE_ENABLE==0                               
        jc        comp_wait_on_comp_able                ; Re-evaluate pwm cycle for slower escs
ENDIF
IF DAMPED_MODE_ENABLE==1                                ; Assume same pwm cycle for fast escs
        jb        Flags1.DIRECT_STARTUP_PHASE, ($+5)
        jc        pwm_wait
        jc        comp_wait_on_comp_able                ; Re-evaluate pwm cycle during direct start          重新评估pwm周期期间直接开始
ENDIF
就是这个地方读取比较器的输出

出0入0汤圆

 楼主| 发表于 2016-7-4 14:03:15 来自手机 | 显示全部楼层
浪子怀海 发表于 2016-7-4 11:39
楼主,他每次检测比较器是否过零点的时刻是在定时器1计数值大于120的时刻后,但是pwm的频率只有16k(周期62 ...

我觉得你理解对,但是什么地方说了120的单位是1us呢?没准那个120的单位是循环或者其他什么时间单位的。

出0入0汤圆

发表于 2016-7-4 11:39:57 | 显示全部楼层
楼主,他每次检测比较器是否过零点的时刻是在定时器1计数值大于120的时刻后,但是pwm的频率只有16k(周期62.5us)的话,我测过薪西达2200kv反电动势的时间在100us~920us,这样的话,假设现在反电动势的时间是120us,相当于对比较器的过零点检测只有两次,假如过零点发生在第一次检测后的话,下一次虽然检测到了,但是会有一个pwm的误差,那换相还能正确吗?
这是我看了blheli程序的看法,不知是否正确?如有不对之处望指点

出0入0汤圆

 楼主| 发表于 2016-7-3 18:39:12 来自手机 | 显示全部楼层
小小苹果 发表于 2016-7-3 17:50
多谢楼主的回复,在楼主的解释下我已经有个一知半解了。
另外我觉得Demag这个消磁时间内也会有很强的感生 ...

当然,开始过零监测是要在这个后面,避免检查到上个相位产生的电流。有个预测的换相时间,到差不多时间才开始监测过零的。这个程序代码里面有体现,主要在T2计时器上体现。一开始就监测过零容易误判。

出0入0汤圆

发表于 2016-7-3 17:50:30 | 显示全部楼层
helislayer 发表于 2016-7-2 10:16
先说一下我的理解这个 Demag 是怎么回事。
说得不对的欢迎大家补充。

多谢楼主的回复,在楼主的解释下我已经有个一知半解了。
另外我觉得Demag这个消磁时间内也会有很强的感生电动势,会让比较器翻转,让我们误判为过零事件,我们也要越过这个时间后再去读比较器的结果。
楼主,我这样理解对吧?

出0入0汤圆

 楼主| 发表于 2016-7-2 10:16:17 | 显示全部楼层
小小苹果 发表于 2016-6-30 15:30
wait_for_comm:
        ; Update demag metric
        mov        Temp1, #0

先说一下我的理解这个 Demag 是怎么回事。
说得不对的欢迎大家补充。

这个 Demag 是指,当马达的电感比较大的时候,如果你换了
相,但是由于有电感的原因,线拳里面的磁场需要时间才能泻
去。电感类似电容,只不过电感趋向与保持电流的恒定。所以
如果马达电感比较大的话,换相以后原来的磁场还要持续一段
时间。这段时间就添加在换相需要的时间里,先等原来的磁场
消退,然后新的换相的磁场充满。

这个引发的效果就是,电感比较大的马达突然加速的话,那个
预测的换相时间会不准,因为马达运转速度慢,产生的反向电
动势小,突然给大电流抵消不掉都变成磁场了。这个时候就容
易发生卡盾的情况。

那这个 demag 的策略就是,在换相前的一段时间里,提前关
闭FET。这样就给一段时间让磁场消退。到换相点的时候,希
望刚好磁场消退差不多了,给新的电流就可以作用上去。当然
提前多少时间可以关闭是比较关键的,需要动态调整。这个就
那个 demag metric。

你看到的这个变量在程序里影响的就是什么时候断电。

最小 120 就是如果 demag 提前关闭量太小,就不用提前关闭了。

出0入0汤圆

发表于 2016-6-30 15:30:51 | 显示全部楼层
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
        All_pwmFETs_off
        Set_Pwms_Off

wait_for_comm_wait:                                ;等待换向
        jnb Flags0.T3_PENDING, ($+5)                       
        jmp        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 metric 是个什么变量?
这个120最小值代表什么意思?
谢谢你!

出0入0汤圆

 楼主| 发表于 2016-6-30 14:17:36 | 显示全部楼层
直流电机用两个 H 桥就可以了啊。
顶多反向驱动。

IDLE 就是没有油门输入吧。

出0入0汤圆

 楼主| 发表于 2016-6-30 14:14:48 | 显示全部楼层
菜鸟不撸 发表于 2016-6-28 11:21
我又来伸手党了。。。。我一直在找SPracing F3开源的主页,但是找到几个都没找到他的原理图,我想自己做 ...

他那个不是真的开源,是开别人的源。
其实你只要找 Naze32 的硬件,比较早的版本有原理图,
v5 以后就没有了。然后把stm32F103换成 F3 的pin 兼容
就基本上差不多了。mpu6050 换成有 spi 的。

出0入0汤圆

发表于 2016-6-29 20:11:30 | 显示全部楼层
请问IDLE在程序中怎么理解呀?

出0入0汤圆

发表于 2016-6-28 23:22:53 | 显示全部楼层
楼主搞过直流减速电机的驱动吗?
是不是有专门的驱动芯片就可以了?

出0入0汤圆

发表于 2016-6-28 11:35:24 | 显示全部楼层
还在瞎BB啊我以为结贴了

出0入0汤圆

发表于 2016-6-28 11:21:24 | 显示全部楼层
helislayer 发表于 2016-6-22 10:19
这个我就不清楚了。

BLheli 有文档支持的电调, 在 BLHeli 的 Silabs 目录

我又来伸手党了。。。。我一直在找SPracing F3开源的主页,但是找到几个都没找到他的原理图,我想自己做飞控,丢了几架飞机了,嫌太贵了。。

出0入0汤圆

发表于 2016-6-22 20:19:00 | 显示全部楼层
F850和F330有什么差别呢?
F850 2块钱左右,F330  4块钱左右,我看资源都一样呀?

出0入0汤圆

 楼主| 发表于 2016-6-22 10:19:44 | 显示全部楼层
hanhanlili 发表于 2016-6-21 23:21
BLHELI有支持F850芯片的吗?
如果有的话 是哪几个电调型号呢?
谢谢楼主!

这个我就不清楚了。

BLheli 有文档支持的电调, 在 BLHeli 的 Silabs 目录
下面。

BLHeli supported SiLabs ESCs.pdf

里面有照片,你可以去找找有没有你想要的 F850.

出0入0汤圆

发表于 2016-6-21 23:21:14 | 显示全部楼层
BLHELI有支持F850芯片的吗?
如果有的话 是哪几个电调型号呢?
谢谢楼主!

出0入0汤圆

发表于 2016-6-18 11:58:04 | 显示全部楼层
学习学习

出0入0汤圆

 楼主| 发表于 2016-6-18 09:41:09 来自手机 | 显示全部楼层
846528111 发表于 2016-6-15 19:33
楼主这段代码能帮忙分析下吗?
init_start_bidir_done:
        sbr        Flags1, (1

这段代码调用的函数都有名字,
我重复一次也没有意思。你看了这段
代码有什么具体理解上的问题?

会问正确的问题也是学习重要的一个
方法。

出0入0汤圆

发表于 2016-6-15 19:33:42 | 显示全部楼层
楼主这段代码能帮忙分析下吗?
init_start_bidir_done:
        sbr        Flags1, (1<<MOTOR_SPINNING)        ; Set motor spinning flag
        sbr        Flags1, (1<<STARTUP_PHASE)        ; Set startup phase flag
        sts        Startup_Cnt, Zero                        ; Reset counter
        xcall comm5comm6                                ; Initialize commutation
        xcall comm6comm1                               
        xcall initialize_timing                        ; Initialize timing
        xcall calc_next_comm_timing                ; Set virtual commutation point
        xcall initialize_timing                        ; Initialize timing
        xcall calc_next_comm_timing       
        xcall initialize_timing                        ; Initialize timing
        rjmp        run1

出0入0汤圆

 楼主| 发表于 2016-6-15 08:29:04 | 显示全部楼层
hanhanlili 发表于 2016-6-14 16:15
楼主
Timer2_X每32毫秒加1,然后给Prev_Comm_X,主要是启动阶段用的,注释说Store extended timestamp as p ...

因为启动的时候转很慢,那个换相时间会超过 8 位整数可以表示的。
那就需要用 16 位整数来表示。 Timer2_X 就是那个16 位整数的高
字节位而已。

如果硬件只有 8 位 timer,你如何用溢出中断来做个 16 位 timer?
就是这么回事。

出0入0汤圆

 楼主| 发表于 2016-6-15 00:58:32 | 显示全部楼层
846528111 发表于 2016-6-14 11:47
program_by_tx_checked,这个函数有什么作用?

这个不是函数,就是一个代码入口。就是说前面已经
检查过用遥控来给 ESC 换配置。有个编程模式。
到这个入口就是编程模式已经做完了(或者没有进入)。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 15:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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