|
楼主 |
发表于 2016-6-2 23:27:13
|
显示全部楼层
赞,终于有人肯看看程序来问问题而不是泛泛的给我个详细
解释如何工作的吧。
先说简单的吧。那个 wrap 我没有找到这个边量,一般 wrap 的意思就是
计数器数到头又从新开始了。就是计数器溢出了。 BLHeli 里面通常用的
wrap 时指这个计数器或者整数的溢出。
SKIP 我只找到 RCA 用那个 SKIP。 RCA 时用来检测输入信号类型的。
BLHeli 可以兼容 PPM, PWM, 反极性的 PPM。 哦对了, BLHeli 当时
一个很流行的原因时,用来做 MCPX 的尾巴部无刷的电机,配合那个 xp3a。
V1 MCPX 有点比较奇特的是尾巴 PWM 是 8K 的。当时就没有什么好办法
转成 ppm, 通常更新是 400Hz。BLHeli可以直接用 8K 的PWM 不需要转换
信号(转换损失些精度和增加延时)。
那个 SKIP 似乎就是有信号,但是检测不到有效信号以后(确认 PPM 或
PWM)。这个时候有可能是在一个有效信号的中间,有些噪音什么的。
跳过一些时间来继续检测。
然后就是比较难理解的过零检测的几个 timeout。你列的顺序是对的。
首先那个几个边量都是使用 timer 3. 那 timer 3 中断都在干什么的呢?
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Timer3 interrupt routine
;
; No assumptions
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
t3_int: ; Used for commutation timing
clr 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
mov TMR3CN, #04h ; Timer3 enabled and interrupt flag cleared
setb EA ; Enable all interrupts
reti
所以很简单, timer 3 就是清除掉那个 T3.PENDING 的 bit field。
setup_comm_wait:
clr EA
anl EIE1, #7Fh ; Disable timer3 interrupts
mov TMR3CN, #00h ; Timer3 disabled and interrupt flag cleared
mov TMR3L, Wt_Comm_Start_L
mov TMR3H, Wt_Comm_Start_H
mov TMR3CN, #04h ; Timer3 enabled and interrupt flag cleared
; Setup next wait time
mov TMR3RLL, Wt_Adv_Start_L
mov TMR3RLH, Wt_Adv_Start_H
setb Flags0.T3_PENDING
orl EIE1, #80h ; Enable timer3 interrupts
setb EA ; Enable interrupts again
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
wait_advance_timing:
jnb Flags0.T3_PENDING, ($+5)
ajmp 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
BLHeli 把 ZC 到 下个 ZC 这个相位周期切成 4 份。
前面每份 1/4 时间。 ZC_wait 短点,1/8. ZC scan 长点, 3/8
那个 Wt_Comm_Start 应该是 ZC 发生后,等待切换到下个相位的时间,差不多 1/4 时间。
然后就换相位
Wt_Adv_Start_ 是等 一个 1/4 时间 (刚换相位有假的过零点,需要跳过)
Wt_ZC_scan 是等 另外一个 1/8 时间
然后才开始扫描 ZC,等待 ZC 发生。
然后3/8 时间差不多就有 ZC
ZC 应该在 Wt_ZC_Tout 发生以前。
大概就是这样,欢迎补充指正。
|
|