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电机控制(BLDC HALL)例程hall去抖动代码(f2803xhall_gpio.h)

大家好~

   现在在看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; \
} \
}

x 出现错误。请重试或与管理员联系。