This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好~
现在在看TI 的带HALL的BLDC电机控制例程,其中有个函数不太理解,请高人帮忙给解毒一下!
文件:f2803xhall_gpio.h
函数:#define HALL3_DEBOUNCE_MACRO(v)
问题:
1 这个函数是去抖动原理是什么,代码如何实现的!
2 v.EdgeDebounced 结构体变量是做什么用的?
谈谈个人的理解,可能与TI给出的例程解释有出入。
首先当进入去抖程序后,先判断v.HallGpio是否有变化(v.HallGpio == v.HallGpioAccepted)
1)如果没变化,就不存在去抖动问题,所以不太理解下面的代码在做什么?
v.StallCount -= 1; /* Decrement stall counter*/ \
if (v.StallCount == 0) \
{ \
v.EdgeDebounced = 0x7FFF; /* 0x7FFF If motor has stalled, then user trigger to commutate*/\
v.StallCount = 0xFFFF; /* Reset counter to starting value*/ \
} \
\
v.DebounceCount = 0;
2)假设v.HallGpio有变化,这时候需要判断是不是抖动造成的(去抖),“ if (v.DebounceCount >= v.DebounceAmount)”这个语句才应该是真正的去抖动,
通过DebounceAmount设置一个去抖动滤波的时间和v.DebounceCount += 1操作,把v.HallGpioAccepted = v.HallGpioBuffer,形成确定的hall状态。
完整代码如下:
if (v.HallGpio == v.HallGpioAccepted) /* GPIO_UNCHANGED: Current GPIO reading == debounced ..*/ \
/*..GPIO reading, no change in state (no edge yet) */ \
{ \
if (v.Revolutions <= 0) /* Only create hall map during initial Revolutions*/ \
HALL3_CREATE_MAP(v) \
\
v.StallCount -= 1; /* Decrement stall counter*/ \
if (v.StallCount == 0) \
{ \
v.EdgeDebounced = 0x7FFF; /* 0x7FFF If motor has stalled, then user trigger to commutate*/\
v.StallCount = 0xFFFF; /* Reset counter to starting value*/ \
} \
\
v.DebounceCount = 0; \
} \
else /* GPIO_CHANGED: Motor might have moved to a new position.*/ \
{ \
if (v.HallGpio == v.HallGpioBuffer) /* Current GPIO reading == previous GPIO reading?*/ \
{ \
if (v.DebounceCount >= v.DebounceAmount) /* If equal, is current GPIO reading debounced?*/ \
{ \
v.HallGpioAccepted = v.HallGpioBuffer; /* Current GPIO reading is now debounced*/ \
v.EdgeDebounced = 0x7FFF; /*Edge/position debounced, trigger commutation*/\
\
v.StallCount = 0xFFFF; /* On new edge, reset stall counter*/ \
v.CapCounter += 1; /* Increment running edge detection counter*/ \
\
v.DebounceCount = 0; /* Reset debounce counter*/ \
\
if (v.HallMapPointer==0) \
v.Revolutions += 1; /* Increment on every rev (HallMapPointer = 0)*/ \
} \
else /* DEBOUNCE_MORE*/ \
v.DebounceCount += 1; /* Increment debounce counter*/ \
} \
else /* NEW_READING*/ \
{ \
v.HallGpioBuffer = v.HallGpio; /* Save new reading and reset debounce counter*/ \
v.DebounceCount = 0; \
} \
}
这是一个循环采样用的状态机.
既然是消抖, 那么自然读到的数据不能直接当成正式输出状态, 需要中间加入一个消抖确认系统.
在采样发现变化时, 要清除(初始化)消抖确认系统的状态;
在采样发现没有变化时, 要进一步执行消抖确认的消抖核对系统的验证.